javascript
运算符
算数运算符 + - * / %
关系运算符 > < >= <= != === !==
值为布尔值,两边都是字符串时则比较ASCII码(单个); 多个时则逐个比较(1-1 2-a…); 两个有一个数值时,将另一个转换成数值.
注:当一个数是NaN,则==返回的是false,!=返回的是true,且NaN与自身不等。
===:恒等,当数值和数据类型都相等才返回true
null转为数字时是0,undefined转为数字是NaN.
逻辑运算符 && || !(优先级先&&再||)
与:表达式1&&表达式2 (两个为真时真)
如果第一个表达式的值为真,则返回表达式2
如果第一个表达式的值为假,则返回表达式1
或:表达式1||表达式2 (两个为假时假)
如果第一个表达式的值为真,则返回表达式1
如果第一个表达式的值为假,则返回表达式2
非:!表达式
先将表达式的值取布尔值再取反(非0即真,非空即真)
console.log((!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]);
一元运算符 ++ –
对原有变量+1,a++(++后置,先取a作为a++的表达式的值在a+1)与++a(++前置);
赋值运算符 基本赋值=
复合赋值+= -= *= /= %=
如num=num+5;与num+=5;相同
表达式
自动数据类型转换
1.其中一个是字符串且符号为+,其他会转为字符串并拼接;
2.其中一个是字符串且符号不为+,字符串转为数字再运算;(字符为纯数字会运算,否则为NaN,NaN和任何运算都是NaN)
3.字符串以外的数据,在运算时,先转为数字再运算;(true为1,false为0,null为0,undefined为NaN)
操作符
~ 按位非(反码)
用于数字类型即取反后-1
~5 = -6
// 一般用于indexOf() ~-1 = 0
~ ~两次取反
保持原值,但布尔值会转为数字
~~true = 1
~~5 = 5
~~6.25 = 6 //相当于parseInt且效率更高
^ 位异或
对两个二进制操作数逐位进行比较,返回结果
12 ^ 5 = 9
& 按位与
用于判断奇偶
偶数 & 1 = 0
奇数 & 1 = 1
| 位或
用于对两个二进制操作数逐位进行比较,并计算返回结果
可以用于取整
123.45 | 0 = 123
?. 可选链
let a;
let b = a?.name;
/* 只有当a存在,同时a具有name属性的时候,才会把值赋给b,否则就会将undefined赋值给b
重要的是,不管a存在与否,这么做都不会报错*/
// 操作 obj?.a obj?.[a] arr?.[index] fun?.(args)
?? 合并空值
let b;
let a = 0;
let c = { name:'zs' }
b = a ?? c;
/* 当a除了undefined、或者null之外的任何值,b都会等于a,否则就等于c*/
??= 空值赋值
let b = '你好';
let a = 0
let c = null;
let d = ’123‘
b ??= a; // b = “你好”
c ??= d // c = '123'
/* 当??=左侧的值为null、undefined的时候,才会将右侧变量的值赋值给左侧变量.其他所有值都不会进行赋值*/
&&=
let num1 = 5;
let num2 = 10;
num1 &&= num2;
console.log(num1); // 10
// 等价于
num1 && (num1 = num2);
if (num1) {
num1 = num2;
}
||=
let num1;
let num2 = 10;
num1 ||= num2;
console.log(num1); // 10
// 等价于
num1 || (num1 = num2);
if (!num1) {
num1 = num2;
}