我刚刚被介绍去构架(n00b),并且一直跟随着有关前端大师的课程学习。呈现方式如下:
let [firstVar, secondVar] = ["firstValue", "secondValue"]
有道理。我可以(并且已经)验证firstVar
的值为"firstValue"
和secondVar
的值为"secondValue"
。
令人困惑的是,我似乎无法重新分配存储在这些变量中的值。我已经使用了const
和let
(以上面显示的方式),并试图重新分配变量。在使用const
声明变量的地方,不会引发任何错误。如果我在浏览器控制台中玩耍,则会得到以下信息:
const [firstThing, secondThing] = ["first value", "second value"]
console.log(firstThing) // expected output: first value
firstThing = "some new thing"
console.log(firstThing) // expected output: first value
FireFox控制台中此行为的屏幕快照(我导航到about:blank以确保内存中没有旧变量):
同样,不会引发任何错误(在尝试重新分配给const
变量时,通常会发生此错误。
如果执行以下操作,则会得到预期的行为:
[firstThing] = ["some new value"]
// TypeError: invalid assignment to const 'firstThing'
使用let
完成销毁后,我可以(似乎)使用类似的语法重新分配值(将变量和新值括在方括号中)。
编辑:
人们显示他们在运行浏览器中显示的代码时无法重现该问题。我最初没有在Node REPL中使用它,但是这样做会产生预期的行为(尝试将其重新分配给const
var会引发错误,let
变量可以重新分配)。此时,我很好奇为什么浏览器中的行为与此不同。我正在使用64.0.2版本。
为弄清楚这一点,我略读了以下内容:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment
https://javascript.info/destructuring-assignment
似乎都没有涉及将值重新分配给使用解构创建的变量(或对象)的问题。从技术上来说,我的处理方式是否正确?我也开始被介绍到垃圾收集等中(我只有最简单的介绍),所以我想知道我正在使用的重新分配“技术”是否正在创建一堆不会收集垃圾的东西或创建怪异的指针等,可能会在以后引起问题。
答案 0 :(得分:0)
这似乎在FireFox中有点奇怪。我刚刚更新为65.0,此现象不再发生。
答案 1 :(得分:-1)
没有引发错误(尝试重新分配给const变量时,通常会发生这种错误。
我无法复制。运行该代码时,我看到一个错误:“未捕获的TypeError:分配给常数变量。”
const [firstThing, secondThing] = ["first value", "second value"]
console.log(firstThing) // expected output: first value
firstThing = "some new thing"
console.log(firstThing) // expected output: first value
如果我使用let
,它可以让我重新分配。
let [firstThing, secondThing] = ["first value", "second value"]
console.log(firstThing) // expected output: first value
firstThing = "some new thing"
console.log(firstThing) // expected output: first value
也无法在firefox的控制台中复制:
要诊断您的环境与我们的环境之间的差异有点困难。可能知道其他版本的浏览器,也许是插件。无论如何,您发布的代码仅替换为let而不是const是重新分配变量的正确方法。