About
最近没有工作反倒能够有时间细读慢品阮一峰大神的Js教程,本文主要记录作者在阅读该教程时的一些理解和容易混淆以及忘记的知识点。
一、算术运算符
- 相比其他语言,JavaScript中没有整除符号,所以在Js中如何实现整除呢?
1. Math.ceil(4/3); //向上整除 4/3=2;
2. Math.floor(4/3); //向下整除 4/3=1;
3. Math.round(5/2);//四舍五入
4. parseInt(5/2);//丢弃小数部分,保留整数部分
准确的说第2、4种方法可以实现取整运算。
- 加法运算符有几个需要注意的地方,前面的博文中也讲到了Js有时会进行自动类型转换,所以可能会有不被预期的结果出现,这里需要mark
1. true + false + 1 + '1' // '21'
// true 被转成1,false 被转成0,前面三个字符相加得2,然后和字符串相加涵义为拼接。
2. '3' + 4 + 5 // '345'
// 同样,前两个算子相加时因为其中有一个算子为字符串,那么结果为字符串
3. 1 - '2' // -1
// 相减时会先把字符串转为数字,然后运算
4. 1 - 'a' // NaN
因为字符串 a 无法用数字表示,所以该表达式为 NaN
5. 1 * '2' 或者 '2' / 1 // 2
乘除同理,既然是算术运算,都是把字符串转为数字再进行计算。
6. var obj = { p: 1 }
obj + 2 //'[object Object]2'
// 先调用对象的valueOf,如果返回对象则调用toString,返回'[object Object]'
总结一下:
(1)'+' 运算符具有字符串拼接的意思,所以需要根据表达式判断,一旦参与计算的算子有字符串,
就会把整个表达式视为字符串拼接,而'+'为左结合,所以在多元运算中需要注意'+'的位置。
(2)其他运算符除了数值计算外无他意,所以运算法则是将算子转成数字后计算,如果无法转换为数字,
则结果为NaN
- 如何判断一个整数是不是奇数?
/ 错误的写法
function isOdd(n) {
return n % 2 === 1;
}
isOdd(-5) // false
isOdd(-4) // false
// 正确的写法
function isOdd(n) {
return Math.abs(n % 2) === 1;
}
isOdd(-5) // true
isOdd(-4) // false
因为取余运算符 % 的运算结果与第一个算子有关,所以在运算时应使用绝对值函数
- 自增运算符简直大坑,不建议使用,如题:
var x = 1
x++ + ++x //4
// 首先 x=1 ,x++ 表达式为1,此时 x=2,然后 ++x表达式为3,所以结果为4
// 可以看出 x++ 表达式中x虽然自增了但返回的是x自增以前的值
// ++x 表达式中x也自增了,并且返回的是x自增后的结果
- 指数运算符是左结合还是右结合?
右结合
二、比较运算符
- 非数字如何比较大小?
(1)如果是字符串,那么依次比较其字符的Unicode码点
(2)如果是汉字,则直接比较Unicode码点
(3)如果是对象或者其他复杂类型数值,则与Number运算法则一样,
先执行valueOf,如果是对象再执行toString,然后比较。
- '= =' 和 '= = ='的区别?
相等运算符 == 会隐式执行类型转换,即转换后再进行比较,而 === 不会,所以一般不建议使用 ==。
三、布尔运算符
- 哪几个值使用取反运算符 '!' 后为true?
undefined null false 0 NaN ''
- 如果需要把一个变量的值转成布尔值,有什么方法?
(1)Boolean(x)
(2)!!x // 对一个值进行连续取反就代表转成布尔值
四、二进制位运算
- 如何将一个数转为32位整数?
function toInt32(x) {
return x | 0;
}
或者
function toInt32(x) {
return ~~x;
}
- 二进制取反运算
~3 // -4
~~2 // 2
运算过程:将3的32位整数形式按位取反,取反后变成负数,而Js用补码表示负数,所以,
要把这个数减1然后再次取反加上负号就对应该数的十进制数值了。
其中过程比较复杂,可简单记忆成一个数与其二进制取反数值相加等于-1.
网友评论