【发布时间】:2021-09-26 13:53:35
【问题描述】:
我正在向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 个方法)。
这是真的吗?
我也从中读到了以下内容
JavaScript 引擎高度优化了这个过程。它甚至可能完全跳过额外对象的创建。但它仍必须遵守规范并表现得好像它创造了规范一样。
这是什么意思?以上几行让我更加困惑整个过程完成了多少次。
【问题讨论】:
-
什么是“特殊对象”?是的,可能创建了许多对象,不查看源就无法知道,通常不应该关心。
-
感谢您的回答!我只想知道这个事实。现在我会继续前进:)
-
我不明白您所说的第 2 步“复制 str 变量的值”和 3“修改复制的版本”的意思。不涉及复制。
-
@Bergi 我认为复制是因为 str 变量的原始值在我调用 4 个方法后仍然保持不变。如果我错了,请纠正我。谢谢。
标签: javascript primitive-types