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

第3章 原生函数

  • 所有typeof返回值为“object”的对象都包含一个内部属性[[Class]],一般用Object.prototype.toString.call([1,2,3])可以得到
  • valueOf():得到封装对象中的基本类型值
  • 不要创建和使用空单元数组,应该要创建[undefiend,undefiend]这样的数组
  • Array.apply(null,{length:3})创建出[undefiend,undefiend,undefiend]
  • 常用的原生函数有:
    • String(): 一般不直接使用
    • Number():一般不直接使用
    • Boolean():一般不直接使用
    • Array():尽量不使用,不加new也行
    • Object():尽量不使用
    • Function():尽量不使用
    • RegExp():尽量不使用
    • Date():有用
    • Error():有用,不加new也行
    • Symbol():不能带new

第4章 强制类型转换

  • 类型转换:显式将值从一种类型转换为另一种类型,发生在静态类型语言的编译阶段,在代码中就可以看出
  • 强制类型转换:隐式将值从一种类型转换为另一种类型,发生在动态类型语言的运行时

ToString

  • toString是非字符串到字符串的强制类型转换
  • 对于普通对象来说,除非自定义,否则toString()返回内部属性[[class]]的值
  • JSON.stringfy(…)不是强制类型转换,但是使用到了toString方法

ToNumber

  • toPrimitive:对象转换为相应的基本类型值,首先检查valueOf()方法,再使用toString()方法的返回值

ToBoolean

  • 包装了假值的封装对象,强制转换成boolean是true

    1
    2
    3
    4
    var a=new Boolean(false);
    var b=new Number(0);
    var c=new String("");
    var d=Boolean(a&&b&&c); // true
  • 假值对象:浏览器在某些特定情况下,在常规JS语法基础上自己创建了一些外来值。比如document.all。假值对象强制类型转换为布尔型的结果为false

  • 真值无限多,记住假值

    • undefined
    • null
    • false
    • +0、-0、NaN
    • “ “

显式强制类型转换

  • a.toString()涉及隐式转换,因为基本类型(比如数字42)没有toString方法,会先创建一个封装对象,再对该对象调用toString。显式转换中含有隐式转换。
  • +c运算符显式将C转换为数字,而非数字加法运算
  • ~按位取反,相当于-(x+1)。只有-1可以让值成为0
  • 抽象渗漏:indexOf()>=0或者!=-1这样的写法不好,在代码中暴露了底层的实现细节。可以使用~indexOf()只有在结果为-1的时候结果为0
  • ~~xx|0Math.floor(..)效果一样,可以截除数字值的整数部分

显式解析数字字符串

  • 解析允许字符串含有非数字字符,解析会从左到右,如果遇到非数字字符就停止:parseInt
  • 转换不允许出现数字字符,否则就失败返回NaN:Number

显式转换为布尔值

  • Boolean(..)和!!,会显式强制类型转换为布尔值
  • b=a?true:false在三元运算符中,a进行了隐式强制类型转换,应该使用Boolean(..)或者!!进行显式强制类型转换

隐式强制类型转换

  • & 和 || 运算符的返回值并不一定是布尔类型,而是两个操作数其中一个的值。
  • 符号类型可以被显式转换成字符串,隐式会报错,不能转换为数字,转换为布尔值为true。

== 和 ===

  • ==允许在相等比较中进行强制类型转换,但是===不允许

  • 1
    2
    3
    var x=true;
    var y="42";
    x==y //false

    首先toNumber(x)将true转换为1,此时1===“42”,两者类型仍然不同,字符串和数字之间比较会把字符串转成数字,即1==42.

  • 只有null==undefiend才true,两者之一于其他任何值(0,false,“”)都为false

  • 特别注意:

    1
    2
    3
    4
    []==0  //true  
    ""==0 //true
    "0"==0 //true
    []=="" //true
  • 0=="\n" //true因为””、”\n”、” “等空字符串转换为数字是0