原生函数

JavaScript 中常用的原生函数有

    String()
    Number()
    Boolean()
    Object()
    Array()
    Function()
    RegExp()
    Date()
    Error()
    Symbol()    //ES6

其中 String、Number、Boolean 这三个函数,分别对应于三种基本类型 string、number、boolean 的包装类型。它们也支持使用 new 的方式来构建,这样它们也就可以使用相应包装类型上的 prototype 函数。当然,如果直接在基本类型上调用相应的函数,则引擎会自动将其封装为相应的包装类型。并且纵使是在循环中多次调用同一个变量的方法,不用担心每次都会重新包装。引擎会自己进行相应的优化。

使用 Object 则可以对包装过程统一包装的接口,它会自动处理相应的类型,并给出对应相应的包装类型。如果需要将对应的 包装类型 拆箱成基本类型,可以使用 valueOf() 方法返回对应的基本类型。

var a = "a";

typeof a;                                     //"string"
typeof Object(a);                             //"object"
Object.prototype.toString.call(Object(a));    //[object String]

typeof Object(a).valueOf();                   //"string"

对于数组(Array)、对象(Object)、函数(Function) 与正则表达式(RegExp),它们都有相应的字面量形式,如果可以那么应该优先使用字面量的形式。

数组的函数形式具有两种语义,如果参数的值仅有一个并且是 number 类型,那么它会被当作预设数组的长度。而不是数组中的值,对应的数组元素全部都会被置为空。

Array.apply 调用的时候,如果第二个参数是一个伪数组对象,它会被拆分出来。

new Array(1,2);                     //[1, 2]

var a = new Array(1);               //[empty]
a[0];                               //undefined
a.length;                           //1

var b = new Array("a");             //["a"]
a[0];                               //"a"
a.length;                           //1

var c = Array.apply(null, [1]);     //[empty]
c[0];                               //undefined
c.length;                           //1

var obj = {"0":1, "length":2}
var d = Array.apply(null, obj);     //[1, "empty"]

 函数的构造形式极少用到,不过有些地方却是有用的。比如动态的去构建一个函数,它的值都为字符串,最后一个参数作为函数体,前面的参数作为这个函数会使用到的参数。

var b = 2;

new Function("a", "return a + b;")(1);    //3

正则表达式的构造形式尽管不能静态被编译与优化,但是它还是有着一些自己的优势,和函数一样。我们可以动态的构建一个正则表达式,然后使用其来判断或者其他处理。

var a = "ab";

new RegExp(a).test(a);        //true

Date、Error、以及 Symbol 没有字面量的形式,它们只能使相应的函数。

Date 的构建可以传入字符串或者数字,数字是以 1970 年以来的毫秒值,它可以使用负数,代表 1970 年以前的日期。

Error 一般用于抛出异常,它可以包含一个描述信息。一般是字符串,另外还有一些用于描述特定类型错误的错误类型,如 EvalError、RangeError、ReferenceError 等...

Symbol 是 ES6 新增的基本类型,它不能使用 new 来构造,一般用它来构建属性。这些属性不能被枚举,但是可以通过 Object.getOwnPrototypeSymbols() 来获取对象身上的所有符号属性。

new Symbol();                       //TypeError: Symbol is not a constructor

var a = Symbol('abc');

var b = {[a]:1}                     //{Symbol(abc):1}

Object.keys(b);                     //[]

Object.getOwnPropertySymbols(b);    //[Symbol(abc)]

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值