你不知道的js(中卷) 第3章 原生函数

    JavaScript有原生函数,也叫内建函数,有如下几个:String、Number、Boolean、Array、Object、Function、RegExp、Date、Error、Symbol(ES6新增的)

    原生函数可以被当作构造函数来使用,创建出来的是封装了基本类型值的封装对象。

    JavaScript中,所有对象都包含一个内部属性[[Class]],它不能被直接访问,但是可通过Object.prototype.toString来查看。

    基本类型值没有各种工具属性和方法,但封装对象有。JavaScript会在需要的时候,自动把基本类型值包装成一个封装对象,使得对基本类型值也能使用各种工具属性和方法。

    JavaScript引擎内部对“自动包装”已经做了性能优化,所以我们使用者,在能用基本类型值得情况下尽管用基本类型值,这样代码性能反而是较高的。

   自己封装基本类型值可以用Object()方法,Object(基本类型)可得到一个封装对象。

   拆封:封装对象.valueOf(),可得到基本类型值。

   在需要用到封装对象中的基本类型值的地方会发生隐式拆封。所以一般封装、拆封都不需要手动执行。

   原生函数作为构造函数时会发生的事:

   如Array()接收多个参数时,多个参数会被放到一个数组中。如果接收一个参数,且该参数为number类型,则会被当作数组的预设长度。这样构造出来的数组很迷,因为它length是那个参数设置的,而数组内0-(length-1)位上却是空的,连null值或者undefined值都没有。它成了一个稀疏数组。

    对稀疏数组执行map可能会失败。总之,不要创建和使用稀疏数组。

    然后作者说,不要用Function构造函数,不要把它当作eval替代品。(哦原来可以当作eval替代品);用常量形式来定义正则表达式效率会更高,不过有时候确实需要动态构造正则,RegExp构造函数还是可以用用的。

    Date和Error构造函数经常使用没毛病。

    Symbol(它不能当构造函数用,会报错)用于定义符号。符号的值(一般情况来讲)是唯一的,所以常被用于添加私有属性或特殊属性。

    原生函数的原型不一定是普通对象,比如Function.prototype是一个函数,RegExp.prototype是一个正则表达式,而Array.prototype是一个数组。它们甚至可以被修改(当然一般不该这么做)。

    原生函数的原型可以作为默认值,比起把[]、function(){}、/(? :)/作为默认值来,可以节省开销。(不过这样的话,得注意不能随便改默认值了)

你可能感兴趣的:(你不知道的js(中卷) 第3章 原生函数)