Как бы вы правильно объяснили, почему эти два примера различаются?
// 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]
Что касается того, почему метка переменной ведет себя по-разному между ними, многие ресурсы утверждают, что это из-за разницы между ссылочными типами и типами значений. Но разве это не относится только к различиям между самими значениями?
Когда явно говорится только о метке переменной (то есть почему метки в первом примере не отслеживают изменения значения, тогда как во втором примере это происходит), разве истинное различие не связано с мутацией vs. переназначение?
В конце концов, мы могли бы так же легко переназначить myArray или ourArray, и ни один из них не имел бы какой-либо постоянной связи. И, если бы примитивные значения были теоретически изменяемыми в JavaScript, первый пример можно было бы заставить вести себя так же, как и второй.
Последующий вопрос
Я также читал противоречивую информацию о том, существуют ли примитивные значения только один раз в памяти. Если, например, номер один существует в памяти только один раз, тогда было бы уместно визуализировать метки переменных как метки с именами, при этом каждая метка, которая ссылается на номер один, «привязана» к одному и тому же номеру, верно?
Опять же, если номер один может быть видоизменен, то каждый бейджик будет отслеживать те же изменения, что и номер один. Но поскольку одно из них неизменяемо, теги имен могут либо продолжать ссылаться на один и тот же номер один, либо их можно снять и прикрепить к другому значению (переназначить).
Я здесь на правильном пути?
Number
, которым вы присвоили другие свойства, но это полностью зависит от того, как компилятор обрабатывает их. - person Mike Cluck   schedule 19.03.2016