《你不知道的JavaScript 中卷》读书笔记 - 01

156 阅读2分钟

第二章 值

简单值(即标量基本类型值,scalar primitive)总是通过值复制的方式来赋值 / 传递,包括 null、undefined、字符串、数字、布尔和 ES6 中的 symbol。

复合值(compound value)——对象(包括数组和封装对象,参见第 3 章)和函数,则总 是通过引用复制的方式来赋值 / 传递。

第三章 原生函数(内建函数)

  1. 有点类似Java语言中的包装类

  2. 原生函数可以被当作构造函数来使用,但其构造出来的对象可能会和我们设想的有所出入

    var a = new String( "abc" );
    
    typeof a; // 是"object",不是"String"
    
    a instanceof String; // true
    
    Object.prototype.toString.call( a ); // "[object String]"
    
  3. 所有 typeof 返回值为 "object" 的对象(如数组)都包含一个内部属性 [[Class]](我们可以把它看作一个内部的分类,而非传统的面向对象意义上的类)。这个属性无法直接访问,一般通过 Object.prototype.toString(..) 来查看。

第四章 强制类型转换

  1. aScript 书籍中强制类型转换被说成是危险、晦涩和糟糕的设计。

  2. JSON.stringify(..) 在对象中遇到 undefined、function 和 symbol 时会自动将其忽略,在数组中则会返回 null(以保证单元位置不变)。

  3. 我们可以向 JSON.stringify(..) 传递一个可选参数 replacer,它可以是数组或者函数,用来指定对象序列化过程中哪些属性应该被处理,哪些应该被排除,和 toJSON() 很像。如果 replacer 是一个数组,那么它必须是一个字符串数组,其中包含序列化要处理的对象的属性名称,除此之外其他的属性则被忽略。如果 replacer 是一个函数,它会对对象本身调用一次,然后对对象中的每个属性各调用一次,每次传递两个参数,键和值。如果要忽略某个键就返回 undefined,否则返回指定的值。

    var a = {
        b: 42,
        c: "42",
        d: [1,2,3]
    };
    JSON.stringify( a, ["b","c"] ); // "{"b":42,"c":"42"}"
    JSON.stringify( a, function(k,v){
        if (k !== "c") return v;
    });
    // "{"b":42,"d":[1,2,3]}"
    
  4. parseInt 会将非字符串的参数 调用toString方法转换字符串。

  5. 建议使用 Boolean(a) 和 !!a 来进行显式强制类型转换。

  6. 符号不能够被强制类型转换为数字(显式和隐式都会产生错误),但可以被强制类型转换为布尔值(显式和隐式结果都是 true)。

    var s1 = Symbol( "cool" );
    String( s1 ); // "Symbol(cool)"
    s2 + ""; // TypeError
    
  7. 宽松相等和严格相等常见的误区是“== 检查值是否相等,=== 检查值和类型是否相等”。听起来蛮有道理,然而还不够准确。正确的解释是:“== 允许在相等比较中进行强制类型转换,而 === 不允许。

  8. 实现 a == 2 && a == 3 为true

    var i == 2;
    Number.property.valueOf = function () {
        return i++
    }
    a == 2 && a == 3 // true