Мастер-классы по Javascript, AJAX/COMET, jQuery Узнать больше...
Javascript.RU

Операторы, их особенности в JS

В Javascript есть все необходимые для жизни операторы, хотя нет их перегрузки.

Некоторые операторы(+,побитовые,логические,===) имеют специфические особенности.

В Javascript есть даже операторы >>> и <<<.

  • +
  • -
  • *
  • /
  • %

В отличие от некоторых других языков, оператор "+" делает конкатенацию, если хотя бы один операнд - строка, причем, не обязательно первый.

Проверим:

Унарный оператор "+" также используется для преобразования строки к числу:

alert(+"123"+1) // 124
  • &
  • |
  • ^
  • >>
  • >>>
  • <<

Все побитовые операции работают с 4-байтовым signed int и возвращают 8-байтовое double, поэтому они
не быстрее обычных операций, а даже чуть медленнее - из-за преобразований типов.

Операция >>> сдвигает побитово вправо, а слева нулями дополняет. В результате эффект - тот же, что и при простом сдвиге >> для положительных чисел.

Для отрицательных - все по-другому. Например, -9 в битовом виде выглядит как: 11111111111111111111111111110111.

Операция >>> даст эффект: -9 >>> 2 будет в битовом виде 00111111111111111111111111111101, т.е 1073741821.

  • &&

Логическое И. Возвращает последний операнд, если все операнды верны. Если хоть один из операндов неверен, то возвратит первый неверный операнд.

Например, 1 && 2 = 2:

1 && 0 && false === 0:

Оператор И обычно используется, чтобы избежать ошибок при получении вложенных свойств объекта.

Например, нужно свойство petShop.animals.rabbit или ложное значение, если такого свойства нет.

Безопасный способ:

var rabbit = petShop && petShop.animals && petShop.animals.rabbit

Этот код корректно выполнится, даже если petShop = false, в то время как

var rabbit = petShop.animals.rabbit

выдаст ошибку(бросит исключение) об отсутствующем свойстве.

  • ||

Оператор логического ИЛИ возвращает первое верное значение. А если верных значений вообще нет, то последнее неверное.
Это удобно использовать так:

var e = event || window.event // если event не событие, то берем window.event
  • !

Логическое НЕ, также удобно для преобразования в Boolean.

var str = "something"
// эквивалентные записи
var test = Boolean(str)
var test = !!str
  • ==
  • !=
  • <
  • >
  • <=
  • >=
  • ===
  • !==

Операторы больше-меньше также работают со строками, сравнивая их лексикографически, т.е посимвольно.

"B">"a"
"bc" < "bd"

Сравнение == делается с приведением типов, а === без приведения типов, например:

0 == false  // верно
// но 
0 !== false  //типы разные
Проверка равенства осуществляется особым образом, если один из операндов - undefined, null, NaN. Более подробно об алгоритме в этом случае можно прочитать в секции 11.9.3 стандарта ECMA-262.
  • ?

Тернарный оператор. В старых парсерах javascript с ним были проблемы, надо было заключать сравнение в скобки, но в новых - вполне нормальный оператор

var test = (1==2) ? "one" : "two"
// эквивалентно
var test = 1==2 ? "one" : "two"

Автор: vasa_c, дата: 21 июня, 2008 - 20:50
#permalink

Логическое И. Возвращает последний верный операнд

Возвращает последний операнд, если все они верны.


Автор: Atlan†is, дата: 10 августа, 2008 - 00:41
#permalink

Возвращает последний операнд, если все они верны.

Верно, эффект имеет только использование ||, с && же подобным образом обращение не срабатывает


Автор: Илья Кантор, дата: 10 августа, 2008 - 04:05
#permalink

Спасибо, развернул эту часть статьи чуть пошире.


Автор: sphere (не зарегистрирован), дата: 4 декабря, 2008 - 13:31
#permalink

"+" делает конкатенацию, если хотя бы один операнд - строка, причем, не обязательно первый.

А как же такой красивый способ преобразования к числу?

var s = '7';
var n = +s;
alert(n.constructor); // Number


Автор: RandomNT (не зарегистрирован), дата: 4 декабря, 2008 - 21:22
#permalink

Да, интересно себя ведёт оператор

alert("1"+1) // 11
alert(+"1"+1) // 2
alert(0+"1"+1) // 011


Автор: Гость (не зарегистрирован), дата: 2 сентября, 2009 - 09:51
#permalink

Не-не-не, выражения 'a+b' и '+b' -- это две большие разницы, даже если а = 0.
В пером случае это будет конкатенаци (или сложение для чисел) - бинарная операция. Во-втором - операция унарная, аналогичная '-b' -- смена знака. Хотя в случае с '+' это менее очевидно, но выполняется приведение типа к числу.


Автор: Гость (не зарегистрирован), дата: 9 апреля, 2009 - 17:29
#permalink

"...Сравнение == делается с приведением типов, а === без приведения типов...". Наверное, наоборот:Сравнение == делается БЕЗ приведения типов, а === С приведения типов


Автор: Minh (не зарегистрирован), дата: 17 мая, 2009 - 18:09
#permalink

Нет, как раз == с приведением, === без


Автор: Jozzer (не зарегистрирован), дата: 9 октября, 2009 - 21:40
#permalink

Мне кто нибудь может подсказать как исчисляется
>>> (Сдвиг вправо с заполнением нулями)
>>>= (Сдвиг вправо с заполнением нулями и присваиванием)
Пытаюсь понять, но никак не получается.
x=13>>>1
x=6
Как они его вычислили, что получилась такая сумма?
Про разряды я то знаю, мне интересно сам ход выполнения операции.


Автор: tiefes (не зарегистрирован), дата: 16 октября, 2009 - 15:09
#permalink

Если я не ошибаюсь и правильно понял:

x=13 //13=1101 в двоичной системе
x>>>1 // сдвигаем вправо, получаем: х=110, а это как раз равно 6.
х=6

Автор: Jozzer (не зарегистрирован), дата: 26 октября, 2009 - 20:25
#permalink

да, все это понятно, но формула вычисления должна быть?
y=-8>>>2
y=1073741822
Такое по таблице не посчитаешь.
Допустим
x=10%2;
x=0
Вычисление происходит следующим путем
10 : 2 = 5; 5 * 2 = 10; 10 - 10 = 0;
Называется это остаток от деления, а как исчисляется я искал в многих книгах и веб-сайтах, но так и не нашел. Получается, число плюс возможен остаток.
Меня интересует формула вычисления, не подскажешь?


Автор: zenitchik (не зарегистрирован), дата: 29 ноября, 2009 - 12:23
#permalink

Не парь себе мозги.
Побитовый сдвиг - это одна из базовых операций процессора. Никаких таблиц и никакой математики. Только алгоритм перназначения значений битов.


Автор: Гость (не зарегистрирован), дата: 8 января, 2010 - 20:05
#permalink

-8 хранится в обратном коде:
11111111111111111111111111111000 = 4294967288
сдвиг на 2 вправо с доопределением 0 = делению на 4:
00111111111111111111111111111110 = 1073741822


Автор: B@rmaley.e><e (не зарегистрирован), дата: 9 января, 2010 - 11:16
#permalink

Сдвиг влево аналогичен умножению на 2 в степени сдвига.
Сдвиг вправо аналогичен делению без остатка на 2 в степени сдвига.
1<<5 = 1*2^5 = 32
32>>5 = 32 / 2^5 = 1


Автор: Гость (не зарегистрирован), дата: 13 мая, 2010 - 14:45
#permalink

Это я знаю, как исчисляется. Причем двойка(2) в этой формуле обязательна!


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
2 + 1 =
Введите результат. Например, для 1+3, введите 4.
 
Новости

Открылась регистрация на мастер-классы по профессиональному Javascript, AJAX/COMET, jQuery в городах:

  • Ярославль (24-25 сентября)
  • Новосибирск (3-4 октября)
  • Казань (9-10 октября)
  • Минск (16-17 октября)
  • Днепропетровск (23-24 октября)
  • Одесса (30-31 октября)
  • Самара (13-14 ноября)

Более подробно - на странице мастер-классов.

Если вас интересует другой город - посмотрите здесь, выбрав "Другие города".

Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Статьи и мероприятия

Будьте в курсе наших последних новостей!

Последние обсуждения на форуме
Forum
Последние комментарии