背景
本文是来自JavaScript高级程序设计第4版,记录的是正常定义和需要注意的点(也就是其实不够全面,单纯是为了加深印象而已)
详细说明
一元操作符
递增/递减
++i / —i
let a = 1
console.log(++a) // 2
console.log(a) // 2
i++/i—
let a = 1
console.log(a++) // 1
console.log(a) // 2
注意:
- 前缀和后缀的区别在于,前缀是同时操作,后缀是求值后才发生
- 下面例子自行查看
a = 'a'
console.log(a++) // NaN
a = '1'
console.log(a++) // 1
a = true
console.log(a++) // 1
a = Infinity
console.log(a++) // Infinity
a = undefined
console.log(a++) // NaN,因为Number(undefined) NaN
a = {}
console.log(a++) // NaN
a = null
console.log(a++) // 0
一元加减
符号放前面变量前面的表示方式,是一种数字转换方式
实际操作中,我们使用这个方式用来转换数字,同Number()方法let num = 25
num = +num
console.log(num) // 25
一元减同加,只不过是变了符号a = 'a'
console.log(+a) // NaN
a = false
console.log(+a) // 0
a = Infinity
console.log(+a) // Infinity,Infinity本来就是数字的一种
a = undefined
console.log(+a) // NaN
a = null
console.log(+a) // 0
a = []
console.log(+a) // 0 Number([]) == 0/Number([1]) == 1/Number([1, 'a']) == NaN
条件操作符(三元操作符)
三元操作符其实是if/else的简写形式,代码如下:let flag = 1
let res = flag === 1 ? 'success' :'failed';
位操作符
数值在底层其实都是64位的,而我们的位操作符则是先转换为32位进行操作后,再转换为64位
小知识补充: 1. 有符号整数,一共是32位,前31位表示数值,最后一位表示符号,0代表正数,1代表负数 2. 也存在无符号整数,但是很少,默认就是有符号的,无符号整数只有正数的情况,所以表示的范围更大! 3. 二进制表示32位整数 4. 负数其实就是整数补位,也就是0变成1,1变成0,然后+1 |
---|
按位非 ~
负号为:~
其实就是讲每一位变成相反的,1变成0,0变成1
let num1 = 25;
let num2 = ~num1;
console.log(num2) // -26
上面这个例子就是,现将25转换为二进制的32位数:000000000000000000000000011001,然后取补,则变成:11111111111111111111111111100110,此时,我们再转换为十进制,就变成了-26
怎么转换为十进制呢?
方法如下:
- 先-1,则变成:11111111111111111111111111100101
- 取反:00000000000000000000000000011010
- 最后算出来就是26,然后加上负号即可
以上结果也可以换一种方式
let num1 = 25;
let num2 = -num1 -1; // -26
按位与 &
符号:&
其实就是讲每一位进行对比,取并且的值为最后每一位的值
第一个数值的位 | 第二个数值的位 | 结果 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 0 |
0 | 1 | 0 |
0 | 0 | 0 |
let res = 25 & 3
console.log(res) // 1
按位或 |
符号:|
其实就是数值的每一位按着或的逻辑确定每一位的值
第一个数值的位 | 第二个数值的位 | 结果 |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
let res = 25 | 3;
console.log(res) //27
按位异或 ^
符号:^
按位异或与按位或的区别在于,它只有在一位上是1的时候返回1,如果两位相同,则返回0
第一个数值的位 | 第二个数值的位 | 结果 |
---|---|---|
1 | 1 | 0 |
1 | 0 | 1 |
0 | 1 | 1 |
0 | 0 | 0 |
let res = 25 ^ 3;
console.log(res) //26
左移 <<
符号: <<
数字整体向左移动对应位数,后面补0
let val = 2
let newVal = val << 5 //64
有符号右移 >>
符号:>>
跟左移相反,是往右边移动对应位数,前面补0
let val = 64
let newVal = val >> 5; // 2
无符号右移 >>>
符号: >>>
32位都向右移动对应位数
如果是正数,则跟 >> 值相同
如果是负数,则差别可能会很大,因为补充的是0,所以如果是负数,则符号会被挪动
let val = 64
let newVal = val >>> 5; // 2
let val1 = -64
let newVal1 = val1 >>> 5 // 134217726
布尔操作符
逻辑非 !
符号:!
对于现在的值取反
规则如下:
- 如果是Boolean类型,则直接对值求反就行,不如true变成false
- 如果是对象,则返回false
- 如果是空字符串,则返回true
- 如果是非空字符串,则返回false
- 如果是数值0,则返回true
- 如果是非0的数值(包括Infinity),则返回false
- 如果是null,则返回true
- 如果是NaN,则返回true
- 如果是Undefined,则返回true
通常,我们喜欢用!!来对一个未知的类型就行Boolean的转换,结果如果Boolean()
逻辑与 &&
符号:&&
规则如下:
- 如果第一个数是对象,则返回第二个数
- 如果第二个数是对象,则只有第一个数求值为true的时候才能返回第一个对象
- 如果两个都是对象,则直接返回第二个
- 如果有一个是null,则返回null
- 如果有一个是NaN,则返回NaN
- 如果第一个是undefined,则返回undefined
&&是一个短路操作,即如果第一个数已经是false了,那第二个数是不会被求值的,也就是直接不执行了
逻辑或 ||
符号:||
注意点:
- 如果两个数都是null,则返回null
- 如果两个数都是NaN,则返回NaN
- 如果两个数都是undefined,则返回undefined
||也有短路特征,即如果第一个求值是true,则第二个不会执行
乘性操作符
乘法操作 *
注意: