20200229

@xiaojingzhao

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;
  1. a + "" 会先调用 valueOf 然后对其返回的值进行 ToString 操作。
  2. String(a) 会直接进行 ToString 操作。
  • "&&" 和 "||" 返回的不是 Boolean,而是两个操作数中的一个。

  • Symbol 不能被隐式转换

s = Symbol("s");
String(s); // "Symbol(s)"
s + ""; // Uncaught TypeError: Cannot convert a Symbol value to a string
  • "==" vs "==="
  1. 性能基本没有差别
  • "==" 转换规则
  1. 类型相等 => 判断值是否相等

  2. 类型都为对象 => 判断指向的同一个引用

  3. 类型不同 => 强制转换

    3.1 字符串 - 数字:字符串转换为数字进行比较

    3.2 其他类型 - Boolean:把 Boolean 类型转换为数字(一般这种情况才会相等 0 == false, 1 == true)

    3.3 null - undefined: 相等

    3.4 对象 - 非对象:转化对象再进行比较

More

  • "==" 毒瘤