返回介绍

第一部分 类型和语法

第二部分 异步和性能

3.1 内部属性 [[Class]]

发布于 2023-05-24 16:38:21 字数 1270 浏览 0 评论 0 收藏 0

所有 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文