【问题标题】:Why is my constant not pointing to new value为什么我的常数没有指向新的价值
【发布时间】:2016-07-05 19:25:28
【问题描述】:

如果我没记错的话,variable 名称正在使用的指针在内存中无法更改,但变量 points 的内容可能会更改。

let name = "google";
const foo = name;
console.log(foo); //prints google
name = "yahoo"; 
console.log(foo); //prints google again instead of yahoo

它不应该打印 yahoo,因为变量名的值已更改.. 谁能解释一下。

另一个例子,它的变化......

const foo = [];
foo.push("test");
console.log(foo); // outputs ["test"]

我在这里很困惑,谁能解释一下。

【问题讨论】:

  • 第一个例子并不特定于常量。原始字符串被复制,没有传递引用。在第二种情况下,引用没有改变,对象的属性不是常量,只有对象与引用 foo 的绑定是常量。要实现具有常量属性的对象,请使用const foo = Object.freeze([]);。简而言之,const foo = ; 只是阻止你使用未来 foo = ;
  • const 表示允许突变const xs = [1,2]; xs.push(3),禁止重新分配const ys = [1,2]; ys = [1,2,3] // fails

标签: javascript ecmascript-6 constants


【解决方案1】:

您的第一个示例使用不可变字符串,第二个示例使用可变对象。

JS 字符串在声明或创建后是不可变的,所以foo 不是对name 的值的引用,它指向的是字符串。您没有更改字符串,而是指向不同的字符串。

数组变量指向对象,并在它被变异后继续指向同一个对象。但是,您仍然指向同一个对象,因为 const 并不深。

这也凸显了对 JS 的 const 的一个常见误解,它的功能更像 Java 的 final 而不是 C++ 的 const。您将 变量 声明为 const,而不是对象的实例,因此它只会阻止您重新分配给变量,不会阻止您改变底层对象。

【讨论】:

    【解决方案2】:

    来自 MDN:

    const 声明创建一个对值的只读引用。这并不意味着它持有的值是不可变的,只是变量标识符不能被重新分配。

    这意味着您可以更改分配给const 的值,例如通过更改数组或对象,但不能为const 变量分配新值。例如:

    有效

    const a = [];
    a.push(5);
    console.log(a);
    
    const b = {};
    b['foo'] = 'bar';
    console.log(b);

    无效:这会抛出错误

    const a = [];
    a = [5];
    console.log(a);
    
    const b = {};
    b = {'foo': 'bar'};
    console.log(b);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多