第一部分 类型和语法
第二部分 异步和性能
文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
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]] 属性和创建该对象的内建原生构造函数相对应(如下),但并非总是如此。
那么基本类型值呢?下面先来看看 null 和 undefined :
Object.prototype.toString.call( null ); // "[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]] 的行为发生了一些变化,详情见本系列的《你不知道的 JavaScript(下卷)》的“ES6 & Beyond”部分。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论