赞
踩
前缀版:
变量的值会在语句被求值前改变
后缀版:
递增递减在语句被求值后才改变
let age = 29;
let anotherAge = --age + 2;
console.log(age); // 28
console.log(anotherAge); // 30
规则:
不限于整数
对于字符串,如果是有效的数值形式,则转换为数值再应用改变。变量类型从字符串变成数值。
对于字符串,如果不是有效的数值形式,则将变量的值设置为NaN 。变量类型从字符串变成
数值。
对于布尔值,如果是false,则转换为0 再应用改变。变量类型从布尔值变成数值。
对于布尔值,如果是true,则转换为1 再应用改变。变量类型从布尔值变成数值。
对于浮点值,加1 或减1。
如果是对象,则调用其(第5 章会详细介绍的)valueOf()方法取得可以操作的值。对得到的
值应用上述规则。如果是NaN,则调用toString()并再次应用其他规则。变量类型从对象变成
数值。
let num1 = 25; // 二进制00000000000000000000000000011001
let num2 = ~num1; // 二进制11111111111111111111111111100110
console.log(num2); // -26
按位与操作在两个位都是1时返回1,在任何一位是0时返回0。
let result = 25 & 3;
console.log(result); // 1
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
AND = 0000 0000 0000 0000 0000 0000 0000 0001
按位或操作在至少一位是1时返回1,两位都是0时返回0。
let result = 25 | 3;
console.log(result); // 27
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
OR = 0000 0000 0000 0000 0000 0000 0001 1011
按位异或与按位或的区别是,它只在一位上是1的时候返回1(两位都是1或0,则返回0)
let result = 25 ^ 3;
console.log(result); // 26
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
XOR = 0000 0000 0000 0000 0000 0000 0001 1010
按照指定的位数将数值的所有位向左移动
let oldValue = 2; // 等于二进制10
let newValue = oldValue << 5; // 等于二进制1000000, 即十进制64
左移会保留它所操作数值的符号。比如,如果-2左移5位,将得到-64,而不是正64。
将数值的所有32位都向右移,同时保留符号(正或负)。有符号右移实际上是左移的逆运算。
let oldValue = 64; // 等于二进制1000000
let newValue = oldValue >> 5; // 等于二进制10, 即十进制2
对正数来说,这跟有符号右移效果相同。但对负数来说,结果就差太多了。无符号右移操作符将负数的二进制表示当成正数的二进制表示来处理。因为负数是其绝对值的二补数,所以右移之后结果变得非常之大,
let oldValue = -64; // 等于二进制11111111111111111111111111000000
let newValue = oldValue >>> 5; // 等于十进制134217726
规则:
console.log(!false); // true
console.log(!"blue"); // false
console.log(!0); // true
console.log(!NaN); // true
console.log(!""); // true
console.log(!12345); // false
逻辑非操作符也可以用于把任意值转换为布尔值。同时使用两个叹号(!!),相当于调用了转型函数Boolean()。无论操作数是什么类型,第一个叹号总会返回布尔值。第二个叹号对该布尔值取反,从而给出变量真正对应的布尔值。结果与对同一个值使用Boolean()函数是一样的
console.log(!!"blue"); // true
console.log(!!0); // false
console.log(!!NaN); // false
console.log(!!""); // false
console.log(!!12345); // true
规则:
逻辑与操作符是一种短路操作符,意思就是如果第一个操作数决定了结果,那么永远不会对第二个操作数求值。对逻辑与操作符来说,如果第一个操作数是false,那么无论第二个操作数是什么值,结果也不可能等于true。
规则:
逻辑或操作符也具有短路的特性。只不过对逻辑或而言,第一个操作数求值为true,第二个操作数就不会再被求值了。
特殊的行为:
特殊的行为。
特殊的行为。
•如果操作数是数值,则执行常规除法运算,返回余数。
•如果被除数是无限值,除数是有限值,则返回NaN。
•如果被除数是有限值,除数是0,则返回NaN。
•如果是Infinity除以Infinity,则返回NaN。
•如果被除数是有限值,除数是无限值,则返回被除数。
•如果被除数是0,除数不是0,则返回0。
•如果有不是数值的操作数,则先在后台用Number()函数将其转换为数值,然后再应用上述规则。
ECMAScript 7新增了指数操作符,Math.pow()现在有了自己的操作符**,结果是一样的:
console.log(Math.pow(3, 2); // 9
console.log(3 ** 2); // 9
console.log(Math.pow(16, 0.5); // 4
console.log(16** 0.5); // 4
不仅如此,指数操作符也有自己的指数赋值操作符**=,该操作符执行指数运算和结果的赋值操作
let squared = 3;
squared **= 2;
console.log(squared); // 9
let sqrt = 16;
sqrt **= 0.5;
console.log(sqrt); // 4
返回结果:
•如果有任一操作数是NaN,则返回NaN;
•如果是Infinity加Infinity,则返回Infinity;
•如果是-Infinity加-Infinity,则返回-Infinity;
•如果是Infinity加-Infinity,则返回NaN;
•如果是+0加+0,则返回+0;
•如果是-0加+0,则返回+0;
•如果是-0加-0,则返回-0。
不过,如果有一个操作数是字符串,则要应用如下规则:
•如果两个操作数都是字符串,则将第二个字符串拼接到第一个字符串后面;
•如果只有一个操作数是字符串,则将另一个操作数转换为字符串,再将两个字符串拼接在一起。
如果有任一操作数是对象、数值或布尔值,则调用它们的toString()方法以获取字符串,然后再应用前面的关于字符串的规则。对于undefined和null,则调用String()函数,分别获取"undefined"和"null"。
返回规则:
•如果两个操作数都是数值,则执行数学减法运算并返回结果。
•如果有任一操作数是NaN,则返回NaN。
•如果是Infinity减Infinity,则返回NaN。
•如果是-Infinity减-Infinity,则返回NaN。
•如果是Infinity减-Infinity,则返回Infinity。
•如果是-Infinity减Infinity,则返回-Infinity。
•如果是+0减+0,则返回+0。
•如果是+0减-0,则返回-0。
•如果是-0减-0,则返回+0。
•如果有任一操作数是字符串、布尔值、null或undefined,则先在后台使用Number()将其转换为数值,然后再根据前面的规则执行数学运算。如果转换结果是NaN,则减法计算的结果是NaN。
•如果有任一操作数是对象,则调用其valueOf()方法取得表示它的数值。如果该值是NaN,则减法计算的结果是NaN。如果对象没有valueOf()方法,则调用其toString()方法,然后再将得到的字符串转换为数值。
let result1 = 5 - true; // true被转换为1, 所以结果是4
let result2 = NaN - 1; // NaN
let result3 = 5 - 3; // 2
let result4 = 5 - ""; // ""被转换为0, 所以结果是5
let result5 = 5 - "2"; // "2"被转换为2, 所以结果是3
let result6 = 5 - null; // null被转换为0, 所以结果是5
规则:
•如果操作数都是数值,则执行数值比较。
•如果操作数都是字符串,则逐个比较字符串中对应字符的编码。
•如果有任一操作数是数值,则将另一个操作数转换为数值,执行数值比较。
•如果有任一操作数是对象,则调用其valueOf()方法,取得结果后再根据前面的规则执行比较。如果没有valueOf()操作符,则调用toString()方法,取得结果后再根据前面的规则执行比较。
•如果有任一操作数是布尔值,则将其转换为数值再执行比较。
会比较数据类型
let max = (num1 > num2) ? num1 : num2;
•乘后赋值(*=)
•除后赋值(/=)
•取模后赋值(%=)
•加后赋值(+=)
•减后赋值(-=)
•左移后赋值(<<=)
•右移后赋值(>>=)
•无符号右移后赋值(>>>=)
逗号操作符可以用来在一条语句中执行多个操作,如下所示:
let num1 = 1, num2 = 2, num3 = 3;
在一条语句中同时声明多个变量是逗号操作符最常用的场景。不过,也可以使用逗号操作符来辅助赋值。在赋值时使用逗号操作符分隔值,最终会返回表达式中最后一个值:
let num = (5, 1, 4, 8, 0); // num的值为0
在这个例子中,num将被赋值为0,因为0是表达式中最后一项。逗号操作符的这种使用场景并不多见,但这种行为的确存在。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。