《你不知道的JS(中)》读书笔记4

第1章 类型

  • 检测null值类型

    1
    2
    var a=null;
    (!a && typeof a==="object");
  • 变量没有类型,只有值才有类型。变量可以随时持有任何类型的值。

  • 在对变量执行typeof操作时,得到的结果并不是该变量的类型,而是该变量持有的值的类型

  • ReferenceError:b is not defined是指变量undeclared

  • 应对多个脚本文件在共享命名空间中加载变量的情况,有两种方法:

    • 使用typeof Undeclared安全防范机制
    • 检查全局变量,访问不存在的对象属性不会产生ReferenceError错误

第2章 值

数组

  • 使用delete运算符可以将单元从数组中删除,但是单元删除后,数组的length不会发生变化

  • 数组也是对象,可以包含字符串键值和属性

    1
    2
    3
    4
    5
    6
    var a=[];
    a[0]=1;
    a["footer"]=2;
    a.length; //1
    a["footer"]; //2
    a.footer; //2
  • 如果字符串键值能够被强制类型转换成十进制数字的话,它就会被当做数字索引来处理

    1
    2
    3
    var a=[];
    a["13"]=42;
    a.length; //14
  • 将arguments对象(类数组)将函数的参数当做列表来访问

    1
    2
    3
    var arr=Array.prototype.slice.call(arguments);
    // 以上在ES6中已经废除,在ES6中使用如下形式
    var arr=Array.from(arguments);

字符串

  • 字符串不可变是指字符串的成员函数不会改变其原始值,而是创建并返回一个新的字符串,而数组的承运函数都是在其原始值上进行操作。

  • 虽然字符串没有这些函数,但是可以通过“借用”数组的非变更方法来处理字符串

  • 字符串反转,split会把字符串转成字符数组,join会把字符数组变成字符串

    1
    2
    var a="foo";
    var c=a.split("").reverse().join(""); // "oof"

数字

  • JavaScript使用64位二进制存储数字

  • toExponential():科学计数法

  • tofixed():指定小数部分的显示位数

  • toPrecision():指定有效数位的显示位数

  • 42.toFixed(3)无效,但是42..toFixed(3)有效,因为.运算符会被优先识别为数字常量的一部分,然后才是对象属性访问运算符

  • 0.1+0.2===0.3//false处理误差范围值,通常称为“机器精度”

    1
    2
    3
    function numbersCloseEnoughtToEqual(n1,n2){
    return Math.abs(n1-n2)<Number.EPSILON
    }
  • 最大浮点数 Number.MAX_VALUE

  • 最小浮点数 Number.MIN_VALUE

  • 安全呈现的最大整数 Number.MAX_SAFE_INTEGER

  • 安全呈现的最小整数 Number.MIN_SAFE_INTEGER

  • void ___返回结果是undefined

特殊的数字

NaN

  • 不是数字的数字
  • 唯一的非自反值

  • ES6开始使用Number.isNaN(…)

  • ES6之前使用如下代码

    1
    2
    3
    4
    5
    6
    7
    8
    if(!Number.isNaN){
    Number.isNaN=function(n){
    return(
    typeof n==="number"&&
    window.isNaN(n)
    )
    }
    }

无穷数

  • 可以从有穷走向无穷,但无法从无穷回到有穷
  • Infinity/Infinity结果是NaN

负零

  • 区分0和-0

    1
    2
    3
    4
    function isNegZero(n){
    n=Number(n);
    return (n===0)&&(1/n===-Infinity);
    }
  • ES6中Object.is(..)处理特殊值的相等比较

值和引用

  • 引用无法改变另外一个引用的指向

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function foo(x){
    x.push(4);
    x; //[1,2,3,4]
    x=[4,5,6];
    x.push[7];
    x; //[4,5,6,7]
    }
    var a=[1,2,3];
    foo(a);
    a; // [1,2,3,4]

    函数传递a的时候,将引用a的复本赋值给x,但a仍然指向[1,2,3]。x=[4,5,6]并不影响a的指向

  • 有两种方式:值复制、引用复制。基本数据类型是值复制,引用数据类型是引用复制。如果要让基本数据类型使用引用复制,可以写在一个对象中,相对的,也可以将引用类型进行一次浅复制。

  • 标量基本类型值是不可更改的

    1
    2
    3
    4
    5
    6
    7
    function foo(x){
    x=x+1;
    }
    var a=2;
    var b=new Number(a);
    foo(b);
    console.log(b); //Number {2}