JavaScript 原生函数

原生函数

常用的原生函数有:

  • String()
  • Number()
  • Boolean()
  • Array()
  • Object()
  • Function()
  • RegExp()
  • Data()
  • Error()
  • Symbol()

封装对象

通过构造函数(如 new String(‘abc’))创建出来的是封装了的基本类型值(如 “abc”)的封装对象。

内部属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Object.prototype.toString.call( [1,2,3] );
// "[object Array]"
Object.prototype.toString.call( /regex-literal/i );
// "[object RegExp]"

Object.prototype.toString.call( null );
// "[object Null]"
Object.prototype.toString.call( undefined );
// "[object Undefined]"

Object.prototype.toString.call( "abc" );
// "[object String]"
Object.prototype.toString.call( 42 );
// "[object Number]"
Object.prototype.toString.call( true );
// "[object Boolean]"

封装对象包装

一般情况下,我们不需要直接使用封装对象。最好的办法是让 JavaScript 引擎自己决定什 么时候应该使用封装对象。换句话说,就是应该优先考虑使用 “abc” 和 42 这样的基本类型 值,而非new String(“abc”)和new Number(42)。

如果想要自行封装基本类型值,可以使用 Object(..) 函数(不带 new 关键字):

1
2
3
4
5
6
7
8
9
10
var a = "abc";
var b = new String( a );
var c = Object( a );
typeof a; // "string"
typeof b; // "object"
typeof c; // "object"
b instanceof String; // true
c instanceof String; // true
Object.prototype.toString.call( b ); // "[object String]"
Object.prototype.toString.call( c ); // "[object String]"

拆封

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

1
2
3
4
5
6
var a = new String( "abc" );
var b = new Number( 42 );
var c = new Boolean( true );
a.valueOf(); // "abc"
b.valueOf(); // 42
c.valueOf(); // true

Symbol(..)

符号(Symbol)。符号是具有唯一性的特殊值(并 非绝对),用它来命名对象属性不容易导致重名

符号并非对象,而是一种简单的标量基本类型。

小结

JavaScript 为基本数据类型值提供了封装对象,称为原生函数(如 String、Number、Boolean 等)。它们为基本数据类型值提供了该子类型所特有的方法和属性(如:String#trim() 和 Array#concat(..))。

对于简单标量基本类型值,比如 “abc”,如果要访问它的 length 属性或 String.prototype 方法,JavaScript 引擎会自动对该值进行封装(即用相应类型的封装对象来包装它)来实 现对这些属性和方法的访问。