原始类型的方法 - 深入数据类型

  1. 当作对象的原始类型
  2. 包装器的创建
  3. null/undefined 没有任何方法
  4. 练习
    1. 为原始类型添加属性
  5. 参考

JavaScript 允许我们像使用对象一样使用原始类型(字符串,数字等)。
虽然对象相比原始类型,可以用上方法这个很好的东西,但是对象比原始类型 “更重”,它们需要额外的资源来支持运作。

当作对象的原始类型

以下是 JavaScript 创建者面临的悖论:

  • 人们可能想对诸如字符串或数字之类的原始类型执行很多操作。最好将它们作为方法来访问。
  • 原始类型必须尽可能的简单轻量。

于是,创建者提出了以下解决方法:

  1. 原始类型还是原始类型。只是单个值,没有方法等属性。
  2. JavaScript 允许直接像对象那样,直接访问字符串,数字,布尔值和 symbol 的方法和属性。
  3. 为了使上一条生效,需要 JS 引擎创建提供额外功能的特殊的 “对象包装器”,** 使用后即销毁 **。

当然,每种原始类型的包装器都是不同的。String,Number,Boolean 和 Symbol。
例如,str.toUpperCase() 返回一个大写的 str

let str = "world";
str.toUpperCase(); // "WORLD"
  1. 访问原始值的属性时,会创建一个包含字符串字面值的特殊对象,并且具有有用的方法,例如 toUpperCase()
  2. 执行方法
  3. 特殊对象被销毁,原始值保留

JavaScript 引擎高度优化了这个过程。它甚至可能跳过创建额外的对象。但是它仍然必须遵守规
范,并且表现得好像它创建了一样。

包装器的创建

在 JavaScript 中,由于历史原因,new Number(9), new String("sss") 是可以的,但极其 ** 不推荐 **

因为变成了对象,会造成意外的:

  1. 类型判断出错,
  2. 布尔值判断出错

null/undefined 没有任何方法

它们没有对应的 “对象包装器”,也没有提供任何方法。从某种意义上说,它们是 “最原始的”。

练习

为原始类型添加属性

> let str = 'w';
> str.test = 4
> str.test
undefined
> let num = 8;
> num['test'] = 'fff';
> num['test']
undefined

这个例子清楚地表明,原始类型不是对象。

参考

现代 JavaScript 教程 - javascript.info


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论。
我的空间