关于JS(V8)的行为

问题描述 投票:0回答:1

从这个页面

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;
)?

javascript v8
1个回答
0
投票

你的推理不正确:

当你编码时

let x = 33.5;
,有 5 个语法元素:

  1. [
    let
    ]。 。 :创建仅限于“局部范围”的变量
  2. [
    x
    ]。 。 。 。 :该变量的标识符
  3. [
    =
    ]。 。 。 。 : 赋值运算符
  4. [
    33.5
    ]。 :数值
  5. [
    ;
    ]。 。 。 。 :指令结束指示器

你推理中的主要缺陷是忽略了赋值运算符。

在 JavaScript 中,赋值运算符有不同的工作方式,具体取决于其

right part
上存在的类型(在 JS 中,
left part
是“submissive”)。

-- 在第一行中,只需创建一个包含您的值的数字对象。

-- 在你的第二行中 (

let y = x;
):
[
x
]确实成为了“堆中存在的对象”,但它是
primitive Objects
类别的对象。
在这种情况下,
assignment operator
将创建一个新对象
y
,其中包含对象
x
中存在的值。

它们仍然是您问题中所示的对象。
但你的定义只涉及

heap
及其包含的元素,没有进一步的精确性,这不允许对 JavaScript 语言的其他方面进行丝毫猜测。

特别是:

  • 关于对象类型的多样性。
  • 关于赋值运算符的功能。

一些信息=> https://v8.dev/blog/react-cliff#javascript-types

© www.soinside.com 2019 - 2024. All rights reserved.