Javascript.RU

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

Update: Более новый материал по этой теме находится по адресу https://learn.javascript.ru/operators.

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

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

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

  • +
  • -
  • *
  • /
  • %

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

Проверим:

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

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

Все побитовые операции работают с 4-байтовым signed int.

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

Для отрицательных - все по-другому. Например, -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 - 19:50
#permalink

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

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


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

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

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


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

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


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

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

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

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


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

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

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


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

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


Автор: Гость (не зарегистрирован), дата: 2 февраля, 2015 - 11:44
#permalink

все верно он себя ведет. Ты же не указываешь что данную строку нужно воспринимать как число.
Попробуй так:

alert(0 + +"1" + 1)

и будет тебе щастье


Автор: Гость (не зарегистрирован), дата: 25 октября, 2011 - 13:18
#permalink

Спасибо!! Очень помог!!!


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

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


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

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


Автор: iyntx, дата: 20 марта, 2012 - 11:10
#permalink

лучше вообще избавиться от привидений, и написать русским языком:
Сравнение == производится без учёта типов данных,
При использовании === сравниваются не только значения переменных/операндов но ещё и их типы.
Например:
'555' == 555 //вернёт true
'555' === 555 //вернёт false , так как типы данных разные(строка и число)


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

Наоборот. Указание, что происходит приведение типов, многое объясняет в работе оператора.
Понимание, что это приведение типов с последующим сравнением, - здорово облегчает жизнь.


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

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


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

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

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

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

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


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

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


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

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


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

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


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

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


Автор: Beast Winterwolf, дата: 15 октября, 2010 - 01:29
#permalink

у меня есть строка, скажем "2+2*3". как получить результат вычисления (8) из строки, не разбирая её (длина строки не известна, операторы также)?


Автор: B@rmaley.e><e, дата: 17 октября, 2010 - 13:57
#permalink

eval. Правда это опасно, и лучше все-таки производить разбор.


Автор: ioncreature (не зарегистрирован), дата: 7 ноября, 2010 - 00:22
#permalink

Спасибо, очень полезная статья


Автор: shkur, дата: 25 ноября, 2010 - 13:11
#permalink
var y = 0
if (y == (1 || 21 || 31 || 41 || 51 || 61 || 71)) {"тру"} else {"фэил"}//"фэил"
if (y == 1 || 21 || 31 || 41 || 51 || 61 || 71) {"тру"} else {"фэил"}//"тру"

почему второй if выдает "тру" ?
и вообще может это как-то по другому делается?
как написать условие:

if (numRows != 1 и заканчивается на 1) {var p = "заявок заархивированно"}
например numRows = 11 или 21 или 31

Автор: sshishov, дата: 29 ноября, 2010 - 00:05
#permalink

В первом сравнении у тебя происходит вычисление того, что в скобках, а только потом это сравнивается с переменной "y".
Во втором случае у тебя сначала сравнивается "y" с единицей, а только потом происходят дальнейшие вычисления. А так как даже 21 - это ИСТИНА, вот тебе и результат.

Ну а насчет второго, то вот пример:

function myFunction() {
  var maxSize = 1000;
  var rowSize = maxSize / 10;
  var countRow = 1;
  var myStr = "";
  for ( var i = 0; i < maxSize; i++) {
    if ((i % 10 == 1) && (i != 1)) { // here your verification
      myStr += i + " ";
      if (Math.floor(i / rowSize) == countRow) {
        countRow++;
        myStr += "\n";
      }
    }
  }
  alert(myStr);
}

Просто не забываем про приоритеты операндов. Скобки () вам в помощь. Если что, то я только начал изучать JS. Для формата кода юзаю Eclipse.


Автор: B@rmaley.e><e, дата: 29 ноября, 2010 - 09:56
#permalink

Автор: Zefick (не зарегистрирован), дата: 29 ноября, 2010 - 17:09
#permalink

Вначале упомянули про оператор <<<, но подробно про него не рассказано.

И результат вырежения "B" > "a" - false, так как прописная 'B' имеет на самом деле меньший код, чем строчная 'a' .


Автор: cedage, дата: 4 декабря, 2010 - 22:51
#permalink

Автор: B@rmaley.e><e, дата: 4 декабря, 2010 - 22:51
#permalink

А что здесь не так? Все верно, сравнение без приведения типов.


Автор: cedage, дата: 4 декабря, 2010 - 22:54
#permalink

но в данном случае мы указываем тип данных, как это без приведения?


Автор: B@rmaley.e><e, дата: 5 декабря, 2010 - 00:08
#permalink

Кому какая разница, что указываем мы? Говорится про приведение типов интерпретатором.

1 == String(1)

Здесь первый операнд типа Number, второй - String. По стандарту:

16. Если Тип(x) равен Number, а Тип(y) равен String, вернуть результат сравнения x == ToNumber(y).

Таким образом, строка String(1) будет преобразована к типу Number, т.е. числу 1. 1 == 1 → true
В случае

1 === String(1)

первый же шаг

1. Если Тип(x) отличается от Типа(y), вернуть false.


Автор: cedage, дата: 4 декабря, 2010 - 22:53
#permalink

по моему точно что то напутали с типами, как вы обьясните такой пример?

if(1 === String(1)){
alert("одинаковые типы");
}else{
alert("разные типы");
}

отработает else


Автор: sis (не зарегистрирован), дата: 21 декабря, 2010 - 18:15
#permalink

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


Автор: Гость (не зарегистрирован), дата: 25 мая, 2011 - 19:40
#permalink

Вот это правильный вариант произведения сложения двух значений.

function calculate() {
var chislo1 = document.primer.chislo1.value; /присваиваем переменой значение которое было введено
var chislo2 = document.primer.chislo2.value;
var x = +chislo1;
var y = +chislo2;
var z = x + y;
if (isFinite(z)) {
resultat.innerHTML = z.toFixed(2);
}
else {
res1.innerHTML = "ошибка";
}

}


Автор: Abibok, дата: 20 января, 2012 - 15:26
#permalink

по поводу сравнения строк: стоит добавить, что "лексикографически" подразумевает под собой сравнение по номеру в таблице юникод, т.е.

"B">"a" //false, т.к. \u0042 < \u0061
"bc" < "bd"  // true

а кирилличные символы вообще далеко в таблице, поэтому

"Щ">"z" //true

а какой-нибудь u\263a вообще больше почти всего

"☺">"я" //true

здесь в учебнике это подробно описано


Автор: Гость (не зарегистрирован), дата: 24 мая, 2012 - 22:42
#permalink

можно подробнее описать дейсвие ?


Автор: Гость (не зарегистрирован), дата: 8 октября, 2012 - 22:34
#permalink

(A) ? B : C;
Если условие A верно, выполнить действие B, иначе - С. Пример - функция, возвращающая модуль числа:

function abs(a) {
return (a > 0) ? a : -a;
}


Автор: Гость (не зарегистрирован), дата: 24 мая, 2012 - 22:43
#permalink

действие-?-этого знака


Автор: Verber (не зарегистрирован), дата: 8 октября, 2012 - 22:52
#permalink

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

Я бы не сказал.

function Point (x,y) {
this.x = x;
this.y = y;
this.toString = function() {
return "Point( " + this.x + ", " + this.y + " )";
}
return this;
}

var foo = new Point(2, 3);
alert( "Foo is " + foo ); // Выдаст "Foo is Point( 2, 3 ) "

Здесь в alert() вызывается foo.toString() при складывании foo и "Foo is". Это почти перегрузка оператора приведения типов, как в С++:

#include
#include
#include

using namespace std;

struct Point {
int x, y;
operator const char* () {
stringstream s;
s << "Point( " << x << ", " << y << " )";
return s.str().c_str();
}
};

int main() {
Point p = {2,3};
cout << "Hello Point: " << p;
}

Приведение типов можно перегрузить! Я не очень понимаю почему это происходит, но это работает.


Автор: Фёдор Геращенко (не зарегистрирован), дата: 27 марта, 2013 - 08:28
#permalink

Если быть совсем точным, то "И" возвращает первый операнд, если он неверен, иначе - второй.
А "ИЛИ" возвращает первый операнд, если он верен, иначе - второй.


Автор: lexvol (не зарегистрирован), дата: 8 апреля, 2013 - 23:14
#permalink

Что означает код:
for(var y = 0; y <= 33; y++) {
y == 0 && SomeClass.Foo();
}

Цикл мне понятен. Не понятно значение && в этом контексте, т.е. если y == 0 и тогда выполняется некоторая функция класса SomeClass.Foo() ?
А если y != 0 тогда функция не будет выполняться?


Автор: Фёдор Геращенко (не зарегистрирован), дата: 12 апреля, 2013 - 09:54
#permalink

Смотри предыдущий пост. Там как раз уточнение на эту тему.
SomeClass.Foo() будет выполняться только только после того, как y станет неравен нулю, а до этого момента (то есть в первую итерацию) до функции дело просто не дойдёт...


Автор: Гость (не зарегистрирован), дата: 7 июля, 2014 - 22:21
#permalink

Внезапно в Опере: "Текст" + chislo&256 даёт 0. Пришлось выкручиваться: "Текст" + String(chislo&256)


Автор: AllaIreland (не зарегистрирован), дата: 25 сентября, 2014 - 17:17
#permalink

Подскажите мне, почему в данном коде не возвращает false, как это указано в статье? Вот, берем объект БЕЗ свойства rabbit и получаем прогнозируемый undefined (но никак не false, как указано в статье):

var petShop = {animals:5,pet:5};

var rabbit = petShop && petShop.animals && petShop.animals.rabbit;
alert (rabbit);//=>undefined (а не false, как говорится в статье)

var rabbit = petShop.animals.rabbit;
alert (rabbit);//=>undefined (какой смысл тогда применять прием по поиску свойства в объекте с использованием &&? )


Автор: AllaIreland (не зарегистрирован), дата: 25 сентября, 2014 - 17:31
#permalink

вот еще код к вопросу... просто не могу понять, зачем прием с && при проверке
petShop.animals.rabbit, ведь результат не меняется:

var petShop = {animals:5, pet:5};
if (petShop && petShop.animals && petShop.animals.rabbit) {
alert('тут true');
} else { alert('попадаем в false');}//ушли в false

if (petShop.animals.rabbit) {alert('тут true');
} else { alert('ушли в false снова');}//ушли в false

var petShop = {animals:{rabbit:9}, pet:5}; if (petShop && petShop.animals && petShop.animals.rabbit) {alert('тут true');// тут true
} else { alert('попадаем в false');}//

if (petShop.animals.rabbit) {alert('тут true');// тут true
} else { alert('ушли в false снова');}

//в чем тогда разница-то? Зачем if (petShop && petShop.animals && petShop.animals.rabbit), а не просто if (petShop.animals.rabbit)


Автор: Гость (не зарегистрирован), дата: 17 ноября, 2014 - 10:37
#permalink

Просьба пояснить, что значит данная конструкция?
var toggle = oldop == 'upload';


Автор: Гость (не зарегистрирован), дата: 29 января, 2015 - 13:26
#permalink

это инициализация переменной toggle, которая примет булевское значение в зависимости от результата сравнения oldop == 'upload' (сравнение будет проведено с приведением типом)


Автор: Анон (не зарегистрирован), дата: 25 января, 2016 - 15:14
#permalink

Кто нибудь объясните плиз логику работы ' % '.
Написано что возвращает остаток от деления. Но :

function myFunction() {
for ( var i=1; i<140; ++i){
var x =100 % i;
console.log(", " +x);
}

:Вывод> , 0, 0, 1, 0, 0, 4, 2, 4, 1, 0, 1, 4, 9, 2, 10, 4, 15, 10, 5, 0, 16, 12, 8, 4, 0, 22, 19, 16, 13, 10, 7, 4, 1, 32, 30, 28, 26, 24, 22, 20, 18, 16, 14, 12, 10, 8, 6, 4, 2, 0, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100

Это вообще что ? Sad


Автор: Владимир Л, дата: 26 января, 2016 - 11:02
#permalink

Если чуточку изменить Ваш код, то станет понятней. Я сделал так:

for ( var i=1; i<140; ++i){
var x =100 % i;
console.log('остаток 100 / '+ i + " = " +x);
}

Проверял в консоли браузера. Все очень логично.


Автор: Анон (не зарегистрирован), дата: 26 января, 2016 - 19:21
#permalink

Эх .... Всё равно не понятно Sad((

for ( var i=1; i<140; ++i){
var x =100 % i;
var d = 100 / i;
console.log('остаток 100 / '+ i + " = " +x + " > "+ d);
}

Вывод:
.....
остаток 100 / 33 = 1 > 3.0303030303030303
остаток 100 / 34 = 32 > 2.9411764705882355
остаток 100 / 35 = 30 > 2.857142857142857
остаток 100 / 36 = 28 > 2.7777777777777777
остаток 100 / 37 = 26 > 2.7027027027027026
остаток 100 / 38 = 24 > 2.6315789473684212
остаток 100 / 39 = 22 > 2.5641025641025643
остаток 100 / 40 = 20 > 2.5
.....
что значит например 1 (один чего ?) при 100 % 33 ?
или 24 при 100 % 38 ??
Каким образом они получаются ?
Спасибо.


Автор: Гость (не зарегистрирован), дата: 27 января, 2016 - 15:40
#permalink
100 % 33 // 100/33 ===3+1/33 =>> 1
100 % 38 // 100/38 ===2+24/33=>> 24

Автор: Гость (не зарегистрирован), дата: 16 января, 2018 - 13:42
#permalink

window.alert("вот вот")


Автор: fnaf (не зарегистрирован), дата: 7 мая, 2019 - 12:43
#permalink

Information about Operators, their features in JS are very good and very helpful for me at work, the information is very useful. Please continue to uphold.
fnaf


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

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
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
Антиспам
9 + 6 =
Введите результат. Например, для 1+3, введите 4.
 
Текущий раздел
Поиск по сайту
Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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