从这个页面
V8 中的 JavaScript 值表示为对象并分配在 V8 堆,无论它们是对象、数组、数字还是 字符串。这允许我们将任何值表示为指向 对象。
在此代码中(JS(V8)):
let x=33.5;
let y=x;
据我所知,V8 中的
33.5
不是一个小整数,因此 33.5
不会被视为 smi
,因此它将被视为对象并在堆中分配
in
let x=33.5;
x
指向堆中的一个对象,该对象将保存该值(即 33.5
)
我的问题是:
在
let y=x;
将在堆中创建另一个新对象,并且该对象将(也)保存该值(即
33.5
)(换句话说:y
将指向x
所指向的对象的另一个对象)?
OR 这里发生的只是
y
和 x
将指向同一个对象,并且 Only 当您尝试更改 y
的值时(或者当您尝试更改 x
的值时) )
将创建一个新对象(保存新值)(更改 y
值的示例是这一行(如果将此行添加到我的代码中)y=83.5;
)?
你的推理不正确:
当你编码时
let x = 33.5;
,有 5 个语法元素:
let
]。 。 :创建仅限于“局部范围”的变量x
]。 。 。 。 :该变量的标识符=
]。 。 。 。 : 赋值运算符33.5
]。 :数值;
]。 。 。 。 :指令结束指示器你推理中的主要缺陷是忽略了赋值运算符。
在 JavaScript 中,赋值运算符有不同的工作方式,具体取决于其
right part
上存在的类型(在 JS 中,left part
是“submissive”)。
-- 在第一行中,只需创建一个包含您的值的数字对象。
-- 在你的第二行中 (
let y = x;
):x
]确实成为了“堆中存在的对象”,但它是primitive Objects
类别的对象。assignment operator
将创建一个新对象y
,其中包含对象x
中存在的值。
它们仍然是您问题中所示的对象。
但你的定义只涉及
heap
及其包含的元素,没有进一步的精确性,这不允许对 JavaScript 语言的其他方面进行丝毫猜测。
特别是: