javascript - 当我们将原语视为 JavaScript 中的对象时会发生什么?

标签 javascript primitive-types

我正在从 javascript.info 学习 JS .现在我正在阅读 Methods of primitives .

当我们运行下面的代码时

let str = 'hello';
alert( str.toUpperCase() ); // HELLO

内部发生以下情况 (1) 创建一个特殊对象 (2) 复制 str 变量的值 (3) 修改复制的版本 (4) 返回复制的版本而不触及原始 str 变量 (5) 最后那个特殊对象被销毁。

作者是这么说的。但是当我们有这样的事情时

let str = 'Hello';
console.log(str.toUpperCase());          // HELLO
console.log(str.split('l'));             // (3) ["He", "", "o"]
console.log(str.startsWith('h'));        // false
console.log(str.concat(' JavaScript'));  // Hello JavaScript
console.log(str);                        // Hello

我只想知道,每次我们把一个图元当作一个对象时,是否会创建一个特殊的对象?从上面的代码来看,我认为整个过程(创建一个对象,执行一些过程并销毁)完成了 4 次(因为我调用了 4 个方法)。

这是真的吗?

我还从中读到了以下内容

The JavaScript engine highly optimizes this process. It may even skip the creation of the extra object at all. But it must still adhere to the specification and behave as if it creates one.

这是什么意思?上面几行让我对整个过程完成了多少次更加困惑。

最佳答案

I just want to know that, is a special object created everytime we treat a primitive as an object? I am thinking that the whole process is done for 4 times, because I called 4 methods.

是的,这是真的。

The JavaScript engine highly optimizes this process. It may even skip the creation of the extra object at all. But it must still adhere to the specification and behave as if it creates one.

这是什么意思?

这意味着创建 4 个对象是一种浪费 - 一个就足够了,而且您仍然会得到相同的结果(在本例中)。该规范以“表现得好像”的方式编写,它不管理 javascript 引擎的实现需要如何逐步工作,而只管理它需要具有的可观察行为。如果一个引擎足够聪明,知道它可以跳过一个步骤,例如做不必要的复制或创建未使用的对象,那么只要执行结果仍然相同,它就被允许这样做。

对于原始值的方法调用,这是一个相对简单的优化——引擎不需要在内存中实际分配一个对象,它可以直接跳到在假设的特殊对象上查找属性的步骤.

关于javascript - 当我们将原语视为 JavaScript 中的对象时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68431374/

相关文章:

size - bool 保证是 1 个字节吗?

Java 集合。为什么没有原始类型?

javascript - 脚本仅适用于 IE

javascript - 我们如何使用 Cypress.io 测试标记在 Google map 上的显示?

c - 在C中,读取字符和整数时变量值会发生变化

java long 除法两个值意外的结果

javascript - 使用 angularjs 的图库弹出窗口不起作用,但使用 javascript 工作正常

javascript - Framework7 onPageInit 不工作

javascript - jquery 停止委托(delegate)事件被调用两次

ruby - 为什么我不能在 Ruby 中递归地附加到数组的末尾?