2016-09-17 3 views
1

Eloquent JavaScript говорит строковые значения неизменны, как ответ на первый вопрос, StackOverflow в: Understanding Javascript immutable variableEloquent JavaScript: неизменная струна значения

Но если мы напишем следующее: var string = "hello world"; string = "permitted";, строка действительно изменяется.

Ответ, о котором я упоминал выше, просто объясняет, что объекты изменяемы, а не другие значения.

Поскольку строка может быть изменена, как я уже говорил вам выше, означает ли это, что примитивное значение строки автоматически преобразуется в объект, когда ему присваивается значение «=»?

Таким образом, предыдущий код был бы строго эквивалентен: var string = new String("hello world"); string = new String("permitted"). Это объясняет, почему значение строки изменяется.

+2

Вы можете перезаписать переменную, но вы не можете изменить строку, например 'string.replace (something) 'создает новую строку, она ** не может ** изменять строку, потому что она * неизменная *. – adeneo

+1

Но вы не изменяете строку. Вы просто назначаете новую строку этой переменной. –

+0

@NiettheDarkAbsol: Да, я согласен с вами. Это действительно происходит? –

ответ

2

Вы должны различать переназначения и мутации:

let x = "abc"; 
 

 
x = "123"; // reassignment 
 
console.log(x); 
 

 
x[0] = "9"; // mutation 
 
console.log(x);

После мутации x все еще содержит "123", потому что String s являются immutabl е. Если бы String s были изменчивыми, то он, конечно, содержал бы "912".

Кроме того, необходимо различать следующие термины:

  • Переменная

С помощью этой декларации let x = "abc" вы объявляете переменную x и инициализировать его со значением "abc".

  • Identifier

Всякий раз, когда x используется в коде (кроме случаев, когда декларирование) это просто идентификатор и должен быть привязан к соответствующей переменной декларации JavaScript. Обратите внимание, что вы можете иметь несколько объявлений, как let x = "abc" в различных областях и, следовательно, имя связывания необходимо:

let x = "abc"; 
 

 
{ // another scope 
 
    let x = "123"; 
 

 
    { // and yet another scope 
 
    console.log(x); // which is the corresponding variable of this identifier? 
 
    } 
 
}

Если вы хотите, чтобы предотвратить, что переменная может быть переназначен, вы на самом деле можете это сделать в ES2015:

const x = "abc"; 
x = "123"; // throws an Error 

Обратите внимание, что вы изменили объявление переменной для достижения такого поведения.

+0

Когда вы говорите, что '' String' 'являются неизменными, вы говорите о примитивном значении или об объекте? (потому что в JS эти оба значения существуют) –

+0

@ Lern-X Строка 'Object' является просто примитивом' String', завернутым в 'Object':' let x = new String ("abc") '. «Строковый» примитив все еще неизменен. «X [0] =« x »' дает '' abc "', но оболочка не является: 'x.prop = true; x.prop' возвращает 'true'. – ftor

1

Возможно, демонстрация покажет вам, что означает, что строка является неизменной.

var stringobject = new String("test"); // or "test"; both yield same result 
 
console.assert(stringobject.valueOf() === "test", "before"); 
 

 
stringobject[0] = "T"; // replace first char 
 
console.assert(stringobject.valueOf() === "Test", "after"); 
 

 
console.log("Success?"); // or is it?

Смежные вопросы