• 原生函数
    js常见的原生函数如下:
    String();
    Number();
    Boolean();
    Array();
    Object();
    Function();
    RegExp();
    Date();
    Error();
    Symbol(); es6新增
    原生函数可以被当做构造函数来使用,但是其构造出来的内容表现出的是对象的形式。因为使用了构造器函数来调用。

    1
    2
    3
    4
    5
    6
    var a = new String('abc');
    typeof a; // object
    a instanceof String; // true
    a instanceof Object; // true
    Object.prototype.toString.call(a); // [object String]
    console.log(a); // String {"abc"}
    • 内部属性[[Class]]
      所有typeof返回值为”object”的对象都包含一个内部的属性[Class]。这个属性无法直接访问,一般通过Object.prototype.toString()来查看
      1
      2
      Object.prototype.toString.call([]); // [object Array]
      Object.prototype.toString.call({}); // [object Object]

    多数情况下,对象的内部[[Class]]属性和创建该对象的内建构造函数保持对应.

    • null和undefined的内部[[class]]属性
      1
      2
      Object.prototype.toString.call(null); //[object Null]
      Object.prototype.toString.call(undefined) // [object Undefined]

    js中Null()和Undefined()这样的原生函数并不存在,但是内部[[Class]]属性仍然是”Null”和”Undefined”

    • 拆封
      如果想要得到封装对象中的基本类型值,可以使用valueOf()函数

      1
      2
      3
      4
      5
      6
      var a = new String('abc'); // 封装
      var b = new String(42);
      var c = new String(true);
      a.valueOf(); // 'abc'
      b.valueOf(); // 42
      c.valueOf(); // true
    • 原生函数作为构造函数
      数组,对象,函数和正则表达式在使用字面量的形式来创建他们那时实际上和使用构造函数的效果是一样的(创建的值都是通过封装对象来包装).