2016-07-31 1 views
2

Я не слишком глубоко в JavaScript. Поэтому сделали это:React: Почему необходимо иметь неизменяемые реквизиты, если значения передаются как по значению в любом случае?

var demo = 'test'; 

var obj = { 
    x: 'abc' 
} 

function foo(str) { 
    str += '_123'; 

    return str; 
} 

var ret = foo(demo); 
var retObj = foo(obj.x); 

console.log('Result: %s', ret); // => 'test_123' 
console.log('Used parameter: %s', demo); // 'test' 

console.log('Result: %s', retObj); // 'abc_123' 
// The value of the property is still unchanged. So 
// it has been passed in as by value. As as copy. 
console.log('Used parameter: %s', obj.x); // 'abc' 

Передаю строку функции. Один раз в качестве примитивной переменной и в следующий раз как свойство объекта.

После этого исходные данные не изменяются. => Внешняя система не изменяется.

Теперь я задаюсь:

Почему они имеют эту неизменность особенность в Реагировать?

Я имею в виду: говорят, что функция должна что-то делать и обеспечивать результат. Но не менять систему в целом.

Но если данные передаются как по значению в любом случае? Зачем делать такую ​​большую вещь из непреложности?

+1

Если вы передали фактический объект функции, функция могла бы мутировать этот объект (включая изменение или удаление существующих свойств и добавление новых). – nnnnnn

+0

Не все передается по значению. – naomik

ответ

3

В обоих примерах вы передаете строку функции. obj - объект, но obj.x - это строка.

JavaScript обрабатывает строки и числа (примитивы) как неизменные. Так что если вы делаете:

var a = "bob"; 
var b = a; 
b = "jack"; 

Исходная строка a будет неизменным.

Но объекты разные. Если вы делаете:

var propsObj = { name: "bob" }; 
var newPropsObj = propsObj; 
newPropsObj.name = "jack"; 

Тогда propsObj также изменится, так propsObj теперь { name: "jack" }.

React использует материал, который вы передаете в качестве реквизита и состояния, чтобы сделать его виртуальным DOM. Поскольку реакция использует их, чтобы увидеть, изменилось ли что-либо, и отобразить только то, что изменилось, реагируйте, полагаясь на ваш код, чтобы не менять реквизит или состояние после того, как вы передали его, чтобы реагировать.

Во втором примере это заставит реагировать на мысли, что новый и старый реквизиты все те же, поэтому отреагируйте (неправильно) на вывод, что его не нужно повторно отображать.

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