关于javascript:JS原始类型为什么能调用方法

1次阅读

共计 763 个字符,预计需要花费 2 分钟才能阅读完成。

参考地址:原始类型的办法


如果,有这样一段代码,将字符串转换为大写:

let str = 'abc';

str.toUpperCase(); // 'ABC'

这是一段简略又一般的代码,按说 str 是字符串类型,它存储的是一个单值,并且是不可变的,它不能像对象那样,能够存储多个属性,像这样:

let user = {};
      
user.name = '张三';
user.say = function () {return '你好';};
  
user.name; // 张三
user.say(); // 你好

通过代码能够看到,不能给一般类型增加属性

let user = '';
      
user.name = '张三';
user.say = function () {return '你好';};

user.age; // undefined
user.say(); //  user.say is not a function

那么,为什么原始类型(比方字符串)可能调用办法(比方 toUpperCase())呢?其原理是: 为了使办法起作用,创立了提供额定性能的非凡“对象包装器”,应用后即被销毁

“对象包装器”对于每种原始类型都是不同的,它们被称为 StringNumberBooleanSymbolBigInt。因而,它们提供了不同的办法。

以之前的代码为例:

let str = 'abc';

str.toUpperCase(); // 'ABC'

理论产生的状况:

  1. 字符串 str 是一个原始值。因而,在拜访其属性时,会创立一个蕴含字符串字面值的非凡对象,并且具备可用的办法,例如 toUpperCase()
  2. 该办法运行并返回一个新的字符串。
  3. 非凡对象被销毁,只留下原始值 str

所以原始类型能够提供办法,但它们仍然是轻量级的。

JavaScript 引擎高度优化了这个过程。它甚至可能跳过创立额定的对象。然而它依然必须恪守标准,并且体现得如同它创立了一样。

正文完
 0