返回介绍

第一部分 类型和语法

第二部分 异步和性能

3.2 封装对象包装

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

封装对象(object wrapper)扮演着十分重要的角色。由于基本类型值没有 .length 和 .toString() 这样的属性和方法,需要通过封装对象才能访问,此时 JavaScript 会自动为基本类型值包装 (box 或者 wrap)一个封装对象:

var a = "abc";

a.length; // 3
a.toUpperCase(); // "ABC"

如果需要经常用到这些字符串属性和方法,比如在 for 循环中使用 i < a.length ,那么从一开始就创建一个封装对象也许更为方便,这样 JavaScript 引擎就不用每次都自动创建了。

但实际证明这并不是一个好办法,因为浏览器已经为 .length 这样的常见情况做了性能优化,直接使用封装对象来“提前优化”代码反而会降低执行效率

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

封装对象释疑

使用封装对象时有些地方需要特别注意。

比如 Boolean :

var a = new Boolean( false );

if (!a) {
  console.log( "Oops" ); // 执行不到这里
}

我们为 false 创建了一个封装对象,然而该对象是真值(“truthy”,即总是返回 true ,参见第 4 章),所以这里使用封装对象得到的结果和使用 false 截然相反。

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

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]"

再次强调,一般不推荐直接使用封装对象(如上例中的 b 和 c ),但它们偶尔也会派上用场。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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