前端JavaScript基础训练系列九十七:原生函数

常用的原生函数有:
• String()
• Number()
• Boolean()
• Array()
• Object()
• Function()
• RegExp()
• Date()
• Error()
• Symbol()——ES6 中新加入的!
实际上,它们就是内建函数。
熟悉 Java 语言的人会发现,JavaScript 中的 String() 和 Java 中的字符串构造函数
String(…) 非常相似,可以这样来用:

var s = new String( "Hello World!" );
     console.log( s.toString() ); // "Hello World!"

原生函数可以被当作构造函数来使用,但其构造出来的对象可能会和我们设想的有所 出入:

var a = new String( "abc" );
typeof a; // 是"object",不是"String" a instanceof String; // true Object.prototype.toString.call( a ); // "[object String]"

通过构造函数(如new String(“abc”))创建出来的是封装了基本类型值(如"abc")的封 装对象。
请注意:typeof 在这里返回的是对象类型的子类型。 可以这样来查看封装对象:

    console.log( a );

由于不同浏览器在开发控制台中显示对象的方式不同(对象序列化 , object serialization), 所以上面的输出结果也不尽相同。
在本书写作期间,Chrome的最新版本是这样显示的:String {0: “a”, 1: “b”, 2: “c”, length: 3, [[PrimitiveValue]]: “abc”},而老版本这样显示: String {0: “a”, 1: “b”, 2: “c”}。最新版本的Firefox这样显示:String [“a”,“b”,“c”];老版本这样显示:“abc”,并且可以点击打开对象查看器。 这些输出结果随着浏览器的演进不断变化,也带给人们不同的体验。
再次强调,new String(“abc”) 创建的是字符串 “abc” 的封装对象,而非基本类型值 “abc”。 3.1 内部属性 [[Class]]
所有 typeof 返回值为 “object” 的对象(如数组)都包含一个内部属性 [[Class]](我们可 以把它看作一个内部的分类,而非传统的面向对象意义上的类)。这个属性无法直接访问, 一般通过 Object.prototype.toString(…) 来查看。例如:

    Object.prototype.toString.call( [1,2,3] );
     // "[object Array]"
     Object.prototype.toString.call( /regex-literal/i );
     // "[object RegExp]"
···
上例中,数组的内部 [[Class]] 属性值是 "Array",正则表达式的值是 "RegExp"。多数情况

 
下,对象的内部 [[Class]] 属性和创建该对象的内建原生构造函数相对应(如下),但并非 总是如此。
那么基本类型值呢?下面先来看看 nullundefined: Object.prototype.toString.call( null );
```js
    // "[object Null]"
     Object.prototype.toString.call( undefined );
     // "[object Undefined]"

虽然 Null() 和 Undefined() 这样的原生构造函数并不存在,但是内部 [[Class]] 属性值仍 然是 “Null” 和 “Undefined”。
其他基本类型值(如字符串、数字和布尔)的情况有所不同,通常称为“包装”(boxing, 参见 3.2 节):

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

上例中基本类型值被各自的封装对象自动包装,所以它们的内部 [[Class]] 属性值分别为 “String”、“Number” 和 “Boolean”。
从 ES5 到 ES6,toString() 和 [[Class]] 的行为发生了一些变化。

  • 10
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值