首页 话题 小组 问答 好文 用户 我的社区 域名交易 唠叨

[分享]原始类型为什么能调用方法

发布于 2024-09-10 17:03:46
0
220

假如,有这样一段代码,将字符串转换为大写:let str abc; str.toUpperCase(); // ABC这是一段简单又普通的代码,按说str是字符串类型,它存储的是一个单值,并且是不可...

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

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())呢?其原理是:为了使方法起作用,创建了提供额外功能的特殊“对象包装器”,使用后即被销毁

“对象包装器”对于每种原始类型都是不同的,它们被称为 StringNumberBooleanSymbol 和 BigInt。因此,它们提供了不同的方法。

以之前的代码为例:

let str = 'abc';

str.toUpperCase(); // 'ABC'

实际发生的情况:

  1. 字符串 str 是一个原始值。因此,在访问其属性时,会创建一个包含字符串字面值的特殊对象,并且具有可用的方法,例如 toUpperCase()

  2. 该方法运行并返回一个新的字符串。

  3. 特殊对象被销毁,只留下原始值 str

所以原始类型可以提供方法,但它们依然是轻量级的。

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

评论
一个月内的热帖推荐
九秘
Lv.1种子选手

209

帖子

18

小组

362

积分

赞助商广告
站长交流