【问题标题】:Behind the scene working of Javascript const for primitive vs objects? [duplicate]在原始与对象的 Javascript const 的幕后工作? [复制]
【发布时间】:2021-07-30 10:39:30
【问题描述】:

我遇到了一个有趣的概念,其中 const number、string、Boolean 与 Object、arrays 的行为不同。

const num1 = 10
num1 = 20 //throws error

const arr1 = [1,2,3,4]
arr1.push(5) //works
arr1.pop() //works
arr1[2] = 7 //works

arr1 = [2,3] //throws error

对于array 和objects,它允许更改值,但会在赋值中引发错误。这是否意味着,将object 或array 声明为const 没有任何优势,因为您可以随时更改所有值?

如果有人能解释一下,我想知道,const 在幕后是如何工作的?

【问题讨论】:

  • Object.freeze() 可能就是您所追求的。 const 用于防止重新分配,但仍可用于对象/数组
  • const 表示变量不能重新赋值。就是这样。它不会使值不可变。
  • 一个对象(一个数组也是一个对象)实际上是一个指针..const 意味着你不能弄乱那个指针,但是里面的值可以被操纵..arr 可以一个常量,但 arr[0] 不会是
  • 所有原语都是不可变的,即使使用 let 或 var。 var a = 'hello'; a[0] = 'y'; console.log(a) // 'hello;
  • 另外,我不明白你为什么说const 工作方式不同。 num1 = 20 //throws error 和 arr1 = [2,3] //throws error 是相同的操作。重新分配。在这两种情况下,它们都是不允许的。 arr1.push(5) //works 不是重新分配。

标签: javascript arrays object ecmascript-6 constants


【解决方案1】:

const 声明创建一个对值的只读引用。 它所持有的价值仍然是不可变的。数组和对象都持有一些值。这些值和属性可以更改,但不能重新分配相同的变量标识符。

这里的arr1是一个变量标识符

const arr1 = [1,2,3,4]
arr1.push(5) //works // changing the value
arr1.pop() //works //changing the value
arr1[2] = 7 //works // changing the value

这里 arr1 被重新分配,所以它抛出一个错误

 arr1 = [2,3] //throws error // reassigning the same variable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-02
    • 2012-01-28
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-22
    • 1970-01-01
    相关资源
    最近更新 更多