JavaScript 允许我们像使用对象一样使用原始类型(字符串,数字等)。
虽然对象相比原始类型,可以用上方法这个很好的东西,但是对象比原始类型 “更重”,它们需要额外的资源来支持运作。
当作对象的原始类型
以下是 JavaScript 创建者面临的悖论:
- 人们可能想对诸如字符串或数字之类的原始类型执行很多操作。最好将它们作为方法来访问。
- 原始类型必须尽可能的简单轻量。
于是,创建者提出了以下解决方法:
- 原始类型还是原始类型。只是单个值,没有方法等属性。
- JavaScript 允许直接像对象那样,直接访问字符串,数字,布尔值和 symbol 的方法和属性。
- 为了使上一条生效,需要 JS 引擎创建提供额外功能的特殊的 “对象包装器”,** 使用后即销毁 **。
当然,每种原始类型的包装器都是不同的。String,Number,Boolean 和 Symbol。
例如,str.toUpperCase()
返回一个大写的 str
let str = "world";
str.toUpperCase(); // "WORLD"
- 访问原始值的属性时,会创建一个包含字符串字面值的特殊对象,并且具有有用的方法,例如 toUpperCase()
- 执行方法
- 特殊对象被销毁,原始值保留
JavaScript 引擎高度优化了这个过程。它甚至可能跳过创建额外的对象。但是它仍然必须遵守规
范,并且表现得好像它创建了一样。
包装器的创建
在 JavaScript 中,由于历史原因,new Number(9), new String("sss")
是可以的,但极其 ** 不推荐 **
因为变成了对象,会造成意外的:
- 类型判断出错,
- 布尔值判断出错
null/undefined 没有任何方法
它们没有对应的 “对象包装器”,也没有提供任何方法。从某种意义上说,它们是 “最原始的”。
练习
为原始类型添加属性
> let str = 'w';
> str.test = 4
> str.test
undefined
> let num = 8;
> num['test'] = 'fff';
> num['test']
undefined
这个例子清楚地表明,原始类型不是对象。
参考
现代 JavaScript 教程 - javascript.info
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论。