你真的理解操作符吗? 我敢说我没有
一元操作符
操作符
let a = 1;
a++;
a--;
a+=1;
tip: 对于字符串,如果是有效的数值形式,则转换为数值再应用改变。变量类型从字符串变成数值。
对于字符串,如果是有效的数值形式,则转换为数值再应用改变。变量类型从字符串变成数值。
对于布尔值,如果是false,则转换为0再应用改变。变量类型从布尔值变成数值
对于布尔值,如果是true,则转换为1再应用改变。变量类型从布尔值变成数值。
对于浮点值,加1或减1。
一元加和减
let a=1;
a +=1;
a -= 1;
布尔操作符
逻辑非
console.log(! false); // true
console.log(! "blue"); // false
console.log(!0); // true
console.log(! NaN); // true
console.log(! ""); // true
console.log(!12345); // false
逻辑非逻辑非操作符由一个叹号!这个操作符始终返回布尔值,无论应用到的是什么数据类型。逻辑非操作符首先将操作数转换为布尔值,然后再对其取反。
如果操作数是对象,则返回false。
如果操作数是空字符串,则返回true。
如果操作数是非空字符串,则返回false。
如果操作数是数值0,则返回true。
如果操作数是非0数值(包括Infinity),则返回false。
如果操作数是null,则返回true。
如果操作数是NaN,则返回true。
如果操作数是undefined,则返回true。
逻辑与
逻辑与操作符是一种短路操作符,意思就是如果第一个操作数决定了结果,那么永远不会对第二个操作数求值
let found = true;
let result = (found && someUndeclaredVariable); // 这里会出错
console.log(result); // 不会执行这一行
letfound=false;
let result = (found && someUndeclaredVariable); // 不会出错
console.log(result); // 会执行
如果第一个操作数是对象,则返回第二个操作数。
如果第二个操作数是对象,则只有第一个操作数求值为true才会返回该对象。
如果两个操作数都是对象,则返回第二个操作数。
如果有一个操作数是null,则返回null。
如果有一个操作数是NaN,则返回NaN。
如果有一个操作数是undefined,则返回undefined。
逻辑或
与逻辑与类似,如果有一个操作数不是布尔值,那么逻辑或操作符也不一定返回布尔值。它遵循如下规则。
如果第一个操作数是对象,则返回第一个操作数。
如果第一个操作数求值为false,则返回第二个操作数。
如果两个操作数都是对象,则返回第一个操作数。
如果两个操作数都是null,则返回null。
如果两个操作数都是NaN,则返回NaN。
如果两个操作数都是undefined,则返回undefined。
数学操作符
乘法操作符
如果操作数都是数值,则执行常规的乘法运算,即两个正值相乘是正值,两个负值相乘也是正值,正负符号不同的值相乘得到负值。
如果有任一操作数是NaN,则返回NaN。
如果是Infinity乘以0,则返回NaN。
如果是Infinity乘以非0的有限数值,则根据第二个操作数的符号返回Infinity或-Infinity。
如果是Infinity乘以Infinity,则返回Infinity。
如果有不是数值的操作数,则先在后台用Number()将其转换为数值,然后再应用上述规则。
.除法操作符
如果操作数都是数值,则执行常规的除法运算,即两个正值相除是正值,两个负值相除也是正值,符号不同的值相除得到负值。
如果有任一操作数是NaN,则返回NaN。
如果是Infinity除以Infinity,则返回NaN。
如果是0除以0,则返回NaN。
如果是非0的有限值除以0,则根据第一个操作数的符号返回Infinity或-Infinity。
如果是Infinity除以任何数值,则根据第二个操作数的符号返回Infinity或-Infinity。
如果有不是数值的操作数,则先在后台用Number()函数将其转换为数值,然后再应用上述规则。
取模操作符
letresult=26%5;//等于1
如果操作数是数值,则执行常规除法运算,返回余数。
如果被除数是无限值,除数是有限值,则返回NaN。
如果被除数是有限值,除数是0,则返回NaN。
如果是Infinity除以Infinity,则返回NaN。
如果被除数是有限值,除数是无限值,则返回被除数。
如果被除数是0,除数不是0,则返回0。
如果有不是数值的操作数,则先在后台用Number()函数将其转换为数值,然后再应用上述规则。
关系操作符
let result = "23" < "3"; // true
23 <3 //false
如果操作数都是数值,则执行数值比较。
如果操作数都是字符串,则逐个比较字符串中对应字符的编码。
如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。
如果有任一操作数是对象,则调用其valueOf()方法,取得结果后再根据前面的规则执行比较。如果没有valueOf()操作符,则调用toString()方法,取得结果后再根据前面的规则执行比较。
如果有任一操作数是布尔值,则将其转换为数值再执行比较。