Операторы и выражения

Что такое оператор?

  • Оператор это символ который представляется как видь операции над данными в процессе выполнения
    • Требует один или больше аргументов (операндов)
    • Вычисляет новое значение
  • Операторы имеют приоритет
  • Выражения представляют собой последовательности операндов и операторов которые вычисляют определенное значение

Операторы в JavaScript

  • Бывают:
    • Унарные – требует один операнд
    • Бинарные – требует два операнда
    • Тернарные (?:) – требует три операнда
  • За исключением операторов присваивания, все операторы лево-ассоциативные
  • Операторы присваивания и условный оператор являются право-ассоциативными

Категории операторов в JavaScript

Категория Операторы
Арифметические + - * / % ++ --
Логические && || ^ !
Бинарные & | ^ ~ << >> >>>
Сравнения == != < > <= >= === !==
Присваивания = += -= *= /= %= |= ^= <<= >>=
Конкатенации +
Другие . [] () ?: new in , delete void typeof instanceof ...

Арифметические операторы

  • Арифметические операторы +, -, *, / такие же как в математике
    • Оператор деления / возвращает числ или Infinity или NaN
    • Деление в JavaScript возвращает число с плавающей точкой (i.e. 5 / 2 = 2.5)
  • Оператор остатка % возвращает остаток от деления на число
  • Оператор инкремента ++ увеличивает (когда как -- уменьшает) на единицу число хранимое в переменной

In [5]:
var squarePerimeter = 17;
var squareSide = squarePerimeter / 4;
var squareArea = squareSide * squareSide;

console.log(squareSide); // 4.25
console.log(squareArea); // 18.0625

var a = 5;
var b = 4;

console.log(a + b); // 9
console.log(a + b++); // 9
console.log(a + b); // 10
console.log(a + (++b)); // 11
console.log(a + b); // 11


4.25
18.0625
9
9
10
11
11
Out[5]:
undefined

In [9]:
console.log('11.0 / 3 = ' + (11.0 / 3)); // 3.666666667
console.log('11 / 3.0 = ' + (11 / 3.0)); // 3.666666667
console.log('11 % 3 = ' + (11 % 3));   // 2
console.log('11 % -3 = ' + (11 % -3));  // 2
console.log('-11 % 3 = ' + (-11 % 3));  // -2'
console.log('1.5 / 0.0 = ' + (1.5 / 0.0));  // Infinity
console.log('-1.5 / 0.0 = ' + (-1.5 / 0.0)); // -Infinity
console.log('0.0 / 0.0 = ' + (0.0 / 0.0));  // NaN
console.log('true / 2 = ' + (true / 2));
console.log('"1" / 2 = ' + ('1' / 2));
console.log('"as" / 2 = ' + ('as' / 2));

var x = 0;
console.log(5 / x);


11.0 / 3 = 3.6666666666666665
11 / 3.0 = 3.6666666666666665
11 % 3 = 2
11 % -3 = 2
-11 % 3 = -2
1.5 / 0.0 = Infinity
-1.5 / 0.0 = -Infinity
0.0 / 0.0 = NaN
true / 2 = 0.5
"1" / 2 = 0.5
"as" / 2 = NaN
Infinity
Out[9]:
undefined

Логические операторы

  • Логические операторы принимают булевы значения и возвращают булевы значения
  • Оператор ! инваертирует true до false и false до true
  • Операторы сравнения &&, || и ^ (1 == true, 0 == false) :

In [10]:
var a = true;
var b = false;

console.log('a && b = ' + (a && b)); // false
console.log('a || b = ' + (a || b)); // true
console.log('a ^ b = ' + (a ^ b)); // 1	  !!!!!!
console.log('!b = ' + !b); // true
console.log('b || true = ' + (b || true)); // true
console.log('b && true = ' + (b && true)); // false
console.log('a || true = ' + (a || true)); // true
console.log('a && true = ' + (a && true)); // true
console.log('!a = ' + !a); // false
console.log('(5 > 7) ^ (a == b) = ' + ((5 > 7) ^ (a === b))); // 0


a && b = false
a || b = true
a ^ b = 1
!b = true
b || true = true
b && true = false
a || true = true
a && true = true
!a = false
(5 > 7) ^ (a == b) = 0
Out[10]:
undefined

true-подобные и false-подобные значения

  • JavaScript, слабо типизированный язык, может использоваться любое значение,такое как true или false
  • Любое значение может быть приведено к логическому с применением оператора приведения - !!

In [20]:
console.log(
  !!'', // пустая строка false
  !!'0', // не пустая строка true
  !!0, // ноль false
  !!35, // не нулевое число true
  !![], // обьект true
  !!NaN, // NaN  false
  !!'true', // true
  !!'false', // true,
  !!null, // любое нулевое и неопределенное false
  !!undefined
);


false true false true true false true true false false
Out[20]:
undefined

Битовые операторы

  • Битовые операторы используют числовые значения. Они применяются побитово.
  • Оператор ~ переводит 0 к 1 и 1 к 0
    • Подобно ! как в булевах применяется побитово
  • Операторы |, & и ^ так же как и ||, && и ^ в булевах только побитово
  • << и >> сдвигают (перемещают) биты в лево или вправо

In [21]:
console.log('Bitwise operators with integers:');
var a = 3;                // 00000000 00000011
var b = 5;                // 00000000 00000101

console.log(`a = {a}, b = ${b}`);

console.log('a | b  = ' + (a | b) + ' - > ' + (a | b).toString(2));   // 00000000 00000111
console.log('a & b  = ' + (a & b) + ' - > ' + (a & b).toString(2));   // 00000000 00000001
console.log('a ^ b  = ' + (a ^ b) + ' - > ' + (a ^ b).toString(2));   // 00000000 00000110
console.log('~a & b = ' + (~a & b) + ' - > ' + (~a & b).toString(2));   // 00000000 00000100
console.log('a << 1 = ' + (a << 1) + ' - > ' + (a << 1).toString(2));  // 00000000 00000110
console.log('a >> 1 = ' + (a >> 1) + ' - > ' + (a >> 1).toString(2));  // 00000000 00000001


Bitwise operators with integers:
a = {a}, b = 5
a | b  = 7 - > 111
a & b  = 1 - > 1
a ^ b  = 6 - > 110
~a & b = 4 - > 100
a << 1 = 6 - > 110
a >> 1 = 1 - > 1
Out[21]:
undefined

In [22]:
console.log('Bitwise operators with floats:');

var f1 = 3.5;
var f2 = 5.3;

console.log('f1 = ' + f1 + ', f2 = ' + f2);

console.log('f1 | f2  = ' + (f1 | f2) + ' - > ' + (f1 | f2).toString(2));   // 00000000 00000111
console.log('f1 & f2  = ' + (f1 & f2) + ' - > ' + (f1 & f2).toString(2));   // 00000000 00000001
console.log('f1 ^ f2  = ' + (f1 ^ f2) + ' - > ' + (f1 ^ f2).toString(2));   // 00000000 00000110
console.log('~f1 & f2 = ' + (~f1 & f2) + ' - > ' + (~f1 & f2).toString(2));   // 00000000 00000100
console.log('f1 << 1 = ' + (f1 << f2) + ' - > ' + (f1 << 1).toString(2));  // 00000000 00000110
console.log('f1 >> 1 = ' + (f1 >> f2) + ' - > ' + (f1 >> 1).toString(2));  // 00000000 00000001


Bitwise operators with floats:
f1 = 3.5, f2 = 5.3
f1 | f2  = 7 - > 111
f1 & f2  = 1 - > 1
f1 ^ f2  = 6 - > 110
~f1 & f2 = 4 - > 100
f1 << 1 = 96 - > 110
f1 >> 1 = 0 - > 1
Out[22]:
undefined

In [23]:
console.log('Bitwise operators with non-number types:');

console.log('~true = ' + ~true);
console.log('~false = ' + ~false);
console.log('"~JavaScript" = ' + ~'JavaScript')
console.log('"js" & true = ' + ('js' | true))
console.log('"js" & true = ' + ('js' ^ true))


Bitwise operators with non-number types:
~true = -2
~false = -1
"~JavaScript" = -1
"js" & true = 1
"js" & true = 1
Out[23]:
undefined

Операторы сравнения

  • Применяются для сравнения переменных
    • ==, <, >, >=, <=, !=,===,!==
    • Для определения эквивалентности === и !== предпочтительны

In [25]:
console.log('Regular comparisons: ');
var a = 5;
var b = 4;

console.log('a = ' + a + ', b = ' + b);
console.log('(a >= b)  = ' + (a >= b)); // True
console.log('(a != b)  = ' + (a != b)); // True
console.log('(a == b)  = ' + (a == b)); // False
console.log('(a == a)  = ' + (a == a)); // True
console.log('(a != ++b) = ' + (a != ++b)); // False
console.log('(a > b)   = ' + (a > b));  // False


Regular comparisons: 
a = 5, b = 4
(a >= b)  = true
(a != b)  = true
(a == b)  = false
(a == a)  = true
(a != ++b) = false
(a > b)   = false
Out[25]:
undefined

In [26]:
console.log('Special comparisons: ');
var zeroInt = 0;
var oneInt = 1;

var zeroFloat = 0.0;
var oneFloat = 1.0;

var emptyStr = '';
var oneStr = '1';
var str = 'JavaScript';

var nullValue = null;
var emptyObject = {};

console.log('0 == 0.0 = ' + (zeroInt == zeroFloat));
console.log('1 == "1" =' + (oneInt == oneStr));
console.log('1 === "1" =' + (oneInt === oneStr));


console.log('0 == "" = ' + (zeroInt == emptyStr));
console.log('0 === "" = ' + (zeroInt === emptyStr));

console.log(nullValue == emptyStr)


Special comparisons: 
0 == 0.0 = true
1 == "1" =true
1 === "1" =false
0 == "" = true
0 === "" = false
false
Out[26]:
undefined

Операторы присваивания

  • присваивают знаение переменной
    • =, +=, -=, |=, ...

In [27]:
var x = 6;
var y = 4;
console.log(y *= 2); // 8
var z = y = 3; // y=3 and z=3  
console.log(z); // 3
console.log(x |= 1); // 7
console.log(x += 3); // 10
console.log(x /= 2); // 5


8
3
7
10
5
Out[27]:
undefined

Другие операторы

  • Оператор конкатенации строка +
  • Если второй из операндов не является строкой, то он приводится к ней.

  • Оператор доступа к члену . используется для доступа к члену объекта

  • Квадратные скобки [] используются как индексы для доступа к члену обьекта или массива
  • Скобки ( ) используются для переобпределения стандартного потока очередности вычислений или вызова функций
  • Оператор услович ?: имеет форму
    • (if b true то результат x иначе результат y)
  • new оператор создания нового объекта
  • typeof оператор возвращающий тип обьекта

In [32]:
var first = 'First';
var second = 'Second';
console.log(first + second); // FirstSecond
var output = 'The number is : ';
var number = 5;
console.log(output + number);
// The number is : 5


FirstSecond
The number is : 5
Out[32]:
undefined

In [33]:
var a = 6;
var b = 4;
console.log(a > b ? 'a > b' : 'b >= a'); // a > b
var c = b = 3; // b = 3;
console.log(c); // 3
console.log((a + b) / 2); // 4.5
console.log(typeof a); // number
console.log(typeof []); // object

var num = new Number(6);
console.log(num instanceof Number);
console.log(6 instanceof Number);


a > b
3
4.5
number
object
true
false
Out[33]:
undefined

In [34]:
var person = {};
person.name = 'George';
person.age = 21;

console.log(typeof person);
console.log(person.name, person.age);
console.log(person['name'], person['age']);
console.log(person);

delete person.age;

console.log(person);


object
George 21
George 21
{ name: 'George', age: 21 }
{ name: 'George' }
Out[34]:
undefined

In [ ]: