你不知道的JavaScript(二)
第三章 原生函数
JS有很多原生函数,为基本的数据类型值提供了封装对象,String,Number,Boolean等。我们可以通过{}.call.toString()来查看所有typeof返回object的对象的内置属性[[class]],这个属性无法直接访问。我们基本类型调用的方法和属性都是通过封装对象去访问的,例如var a = “abc”; a.length//3,但是有一点需要注意的是new Boolean(false)//true,为false封装对象时,它是一个真值(即总是返回true),平时在用到封装对象中的基本类型值的时候,JS会发生隐式拆封。
第四章 强制类型转换
强制类型转换是JS里难以掌握的,但是在实际应用中它又是很有用处的,我们十分有必要去深入理解和合理运用它。类型转换有显式和隐式之分,后者就是强制类型转换,例如var a = 42; var b = a + “”;//“42”,这里数字a被转换为了字符串b。
非字符串转换为字符串,在没有自行定义的情况下,普通对象调用toString方法返回内部的[[Class]]值,JSON.Stringfy函数在将对象序列化为字符串时,如果定义了toJSON方法就会首先调用该方法,用返回值进行序列化,在数组中如果遇到undefined,空function,那么会在对应位置返回null以保证单元位置不变。
在将非数字值转换为数字时就会进行ToNumber操作,false转换为0,true转换为1,undefined转换为NaN,null转换为0,对于对象来说,会首先调用valueOf,没有就调用toString来返回基本类型,然后再强制转换为数字值,如果均不返回数字,则会报错。
转换为布尔值时,从逻辑上说,出现在假值列表上的才为假值,+0,-0,infinite,null,undefined,””,NaN等,要特别注意的是这些假值封装的对象是真值(所有对象都是真值),除了””以外的字符串也都是真值。
~这个符号能有奇妙的功能,~X可以视为-(X+1)。通常用+X来把X转换为数字,用X+””来将X转换为字符串,用X|0来将X取整。
对于+运算符,先是调用toString进行字符串拼接,如果不行就用valueOf转换为数字,进行加法操作。
对于比较运算,数字和字符串比较先转化为数字,如果有布尔类型就将布尔类型转换为数字,字符串或数字和对象比较,先把对象用toString,valueOf转换为字符串或者数字。