20200229
Plan
- 你不知道的 js
Notes
- parseInt 的陷阱
parseInt(1 / 0, 19); // 18
1/0 先被转换为 Infinite,然后 Infinite 被转换为字符串的"Infinite"。 然后 parseInt 从"I"开始解析,"I" 在 19 进制下为 18。然后继续到"n",无法解析,停止。结果输出 18。
- 隐式转换
{
} // 被认为是一个代码块,所以不会有操作
+[]; // 0
[] + {}; // "[object, object]"
- String(a) 和 a + ""的区别? 都可以转换为字符串,但是流程稍有不同。
a = {
valueOf() {
return 42;
},
toString() {
return 4;
}
};
a + ""; // 42;
String(a); // 4;
a + ""会先调用valueOf然后对其返回的值进行 ToString 操作。String(a)会直接进行 ToString 操作。
"&&" 和 "||" 返回的不是 Boolean,而是两个操作数中的一个。
Symbol 不能被隐式转换
s = Symbol("s");
String(s); // "Symbol(s)"
s + ""; // Uncaught TypeError: Cannot convert a Symbol value to a string
- "==" vs "==="
- 性能基本没有差别
- "==" 转换规则
类型相等 => 判断值是否相等
类型都为对象 => 判断指向的同一个引用
类型不同 => 强制转换
3.1 字符串 - 数字:字符串转换为数字进行比较
3.2 其他类型 - Boolean:把 Boolean 类型转换为数字(一般这种情况才会相等 0 == false, 1 == true)
3.3 null - undefined: 相等
3.4 对象 - 非对象:转化对象再进行比较
More
- "==" 毒瘤