以下内容可能存在个人理解的部分,并非完全参照原文
如有疑问,请以书中内容为准
接着上一篇的内容
3.5 操作符
在应用于对象时,相应的操作符通常会调用对象的valueOf()
和(或)toString()
方法
一元操作符
递增++
和递减--
操作符直接借鉴于C
var age = 29;
++age;
前置表示运算前加,后置表示运算后加
var num1 = 2;
var num2 = 20;
var num3 = num1-- + num2; // 22
var num4 = num1 + num2; // 21
递减也是一样
一元+
和-
操作符与数学书上相同
不过在用于非数值类型时,该操作符会像Number()
转型函数一样对这个值进行转换
递增和递减操作符也是如此
位操作符
ECMAScript中所有的数值都以 IEEE-754 64位 格式存储,但操作符并不直接操作64位的值。而是先将64位的值转换为32位的整数,然后执行操作,最后再将结果转回64位。
对于有符号的整数,32位中的前31位用于表示整数的值。第32位用于表示数值的符号:0表示正数,1表示负数。这个表示符号的位叫做 符号位。
负数会使用 二进制补码 存储。
然而ECMASript会尽力隐藏这些信息
var num = -18;
alert(num.toString(2)); // "-10010"
在以二进制字符串形式输出一个负数时,我们看到的只是这个负数绝对值的二进制码前面加上了一个负号。
注意:在对NaN和Infinity值进行位操作时,这两个值都会被当成0来处理。
1.按位非(~)
严格意义来说,按位非操作符~
,是将数值的二进制码按位取反
书上原文说的是返回数值的反码,但根据定义正数的反码是它本身
var num1 = 25; // 二进制 00000000000000000000000000011001
var num2 = ~num1; // 二进制 11111111111111111111111111100110
alert(num2); // -26
简单来说,按位非操作的结果就是:操作数的负值减1
按位非是在数值表示的最底层执行操作,因此速度更快
2.按位与(&)
从本质上讲,按位与操作就是将两个数值的每一位对齐,然后按位进行与操作。
var result = 25 & 3;
// 25 00000000000000000000000000011001
// 3 00000000000000000000000000000001
alert(result); // 1
它们对应位上只有一位同时是1
3.按位或(|)
同理,按位进行或操作
4.按位异或(^)
异或就是相异为1相同为0
5.左移(<<)
直接上代码
var oldValue = 2; // 等于二进制的 10
var newValue = olaValue << 5; // 等于二进制的 1000000,十进制的64
注意,左移不会影响符号位。如果将-2向左移动5位,结果将是-64。
6.右移(>>)
一样,但是被移出去的位会消失
var oldValue = 64; // 等于二进制的 1000000
var newValue = olaValue >> 5; // 等于二进制的 10,十进制的2
var a = 3;
var b = a >> 1; // 1
var c = a >> 2; // 0
布尔操作符
主要要注意的是非布尔类型的转换
1.逻辑非(!)
- 如果操作数是一个对象,返回false
- 如果操作数是一个空字符串,返回true,非空则返回false
- 如果操作数是数值0,返回true,任意非0数值(包括Infinity)返回false
- 如果操作数是null,返回true
- 如果操作数是NaN,返回true
- 如果操作数是undefined,返回true
实际上这就是把操作数用Boolean()
函数转换后进行逻辑非运算
2.逻辑与(&&)
这里有一个特点:如果第一个操作数是对象,且第一个操作数求值结果为true时返回第二个操作数,而第一个操作数是undefined则返回undefined
因此会有一种技巧
var result = (res && res.result); // res由其他地方传入
如果res未被定义则会返回undefined,而不会因为访问了undefined的属性而报错
不用再写繁琐的if结构
if(res){
var result = res.result;
}
3.逻辑或(||)
这里有点不同:如果第一个操作数是对象则返回第一个操作数,如果第一个操作数求值结果为false返回第二个操作数,如果两个操作数都是undefined则返回undefined
看例子比较明白
function sum(a,b){
a = a || 1
b = b || 1
return a+b
}
sum(); // 2
可以用这个特性做函数变量的默认值
乘性操作符
ECMAScript定义了三个乘性操作符:乘法、除法、求模
如果操作数不是数值,会先使用Number()
将其转换为数值
只谈特殊情况
1.乘法
- 乘积如果超过ECMAScript数值的表示范围,则返回
Infinity
或-Infinity
- 如果有一个操作数是NaN,则结果是
NaN
- 如果是Infinity与0相乘,则结果是
NaN
- 如果是Infinity与非0整数(包括Infinity)相乘,则结果是
Infinity
或-Infinity
2.除法
- 如果有一个操作数是NaN,则结果是
NaN
- 如果Infinity被Infinity除,结果是
NaN
- 如果是零被零除,结果是
NaN
- 如果是非零的有限数被零除,则结果是
Infinity
或-Infinity
3.求模
可以按照除法理解