gpt4 book ai didi

javascript - 重新分配、变异、引用类型和值类型

转载 作者:行者123 更新时间:2023-11-30 16:12:04 26 4
gpt4 key购买 nike

您如何恰本地解释为什么这两个示例不同?

// Reassignment
let a = 1;
let b = a;
a = 2;
console.log(b); // → 1

// Mutation
let myArray = [1, 2, 3];
let ourArray = myArray;
ourArray[2] = 10;
console.log(myArray); // → [1, 2, 10]

关于为什么变量标签在两者之间表现不同,许多资源声称这是因为引用类型和值类型之间的差异。但是,这不只适用于值(value)观 本身之间的差异吗?

当明确谈论变量标签时(即为什么第一个示例中的标签不跟踪值的更改,而第二个示例中的标签),真正的区别不是与 有关吗突变与重新分配

毕竟,我们可以很容易地重新分配 myArray 或 ourArray,而且它们都不会有任何类型的持续链接。而且,如果原始值在理论上在 JavaScript 中是可变的,则可以使第一个示例的行为与第二个示例相同。

跟进问题

我还阅读了有关原始值是否仅在内存中存在一次的相互矛盾的信息。例如,如果第一在内存中只存在一次,那么将变量标签可视化为名称标签是合适的,每个引用第一的名称标签都“粘”到同一个第一,对吗?

同样,如果第一名能够发生变异,那么每个名字标签都会追踪到第一名的相同变化。但由于 one 是不可变的,nametags 可以继续引用相同的数字 1,也可以将它们取下并固定为不同的值(重新分配)。

我走在正确的轨道上吗?

最佳答案

您在问题中将实现细节(“内存中存在一次”)与评估策略(“引用类型和值类型”)和特定表达式(“变异与重新分配”)混合在一起。实现细节因浏览器而异,将来可能会发生变化。

Javascript 中有两种求值策略:

  • Copy by value(调用函数时按值传递)
  • Copy by reference(调用函数时按引用传递)

值类型

值类型总是按值复制。假设字符串在 Javascript 中是可变的:

let s = "abc";
let t = s;

s[0] = "x";
s; // "xbc";
t; // "abc";

基于值类型的变量(或标识符或名称绑定(bind))直接包含它们的值。如果这样一个可变字符串发生变异,那么只有相应标识符的值会受到影响。

与字符串不同,数字是原子的。对于原子原语,突变和重新分配没有实际区别:

let n = 0;
n = 1, n++, n = n + 1; // all reassignments

引用类型

持有引用类型的变量仅包含对此类型的引用,这是 Javascript 中的复杂值(对象)。如果两个变量引用同一个对象,则它们各自保存该引用的副本,而不是直接别名。因此,如果两个变量之一被重新分配,这不会影响另一个。

引用类型具有身份,也就是说,它们的身份不再与值相关联:

let xs = [1];
xs === [1]; // false

关于javascript - 重新分配、变异、引用类型和值类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36095779/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com