const VS Object.freeze()


Const


contキーワードとして宣言されたデータ型は、データアドレスを再参照できません.
const value1 = 1;
let value2 = 1;

value1 = value2;	//Uncaught TypeError: Assignment to constant variable!!!
で、value 1とvalue 2は同じデータアドレスを参照します.(Stackから...)、すなわち、元のデータ型については、データを有効に使用するために、値が同じであれば、同時にデータアドレスを参照する.そのため、同じ値でもデータアドレスによってデータが浪費される(?)止めるためだと思った.
もしそうなら、contキーワードとして宣言されたデータ型は、他のデータアドレスを再参照できないのではなく、データアドレスが同じ場合にデータアドレスのキーワードを再参照できなければよい.
value1 = value2;	//Uncaught TypeError: Assignment to constant variable!!!
ただし、リファレンスタイプであればconstと宣言してもpropertyの値を変更できます.これは、参照データ型がデータアドレスを再参照する必要がなく、同じデータアドレスでのみ値を変更できるためです.(リファレンスタイプはheapというデータ領域にあります.)
const obj1 = {name: 'Kim', score: [1,2]};
obj1.name = 'Lee';
console.log(obj1.name)	// expected output -> 'Lee'
では、リファレンスタイプ(配列、オブジェクト、関数)は値の変更を阻止できませんか?
->この機能のための方法は...

Object.freeze()


オブジェクトをフリーズして値を変更できない方法として扱うと便利です.
const obj1 = {name: 'Kim', score: [1,2]};
Object.freeze(obj1)
obj1.name = 'Lee';
obj1.score.push(3);

console.log(obj1.name);
// expected output -> 'Kim'

console.log(obj1.score);
// expected output -> [1, 2, 3]
obj1.nameObject.freeze(obj1)によって値が変化しないことがわかりますが、obj1.scoreはなぜpushに増加したのでしょうか.
リファレンスタイプ(配列、オブジェクト、関数)などにはproperty(属性)値があります.ただし、その属性が別の参照資料タイプの位置を示す場合、第1の参照資料タイプと第1の参照資料タイプの属性にその属性の参照資料タイプがある場合、データアドレスは第2の参照資料タイプとは異なる.
コードでみんなに見せましょう
let obj1 = {name: 'Kim', score: [1,2]};
let obj2 = Object.assign({}, obj1);

console.log(obj1 === obj2)
// expected output -> false

console.log(obj1.score === obj2.score)
// expected output -> true
ここでobj 1とobj 1scoreのデータアドレスが異なるため、Object.assign()を行うときobj 1.nameにコピーするのは新しいオブジェクトですがobj 1です.scoreはobj 1のデータアドレスとは異なるために深くコピーされ、obj1.scoreobj2.scoreが同じになる.Object.freeze()も同様であり、obj1obj1.scoreのデータアドレスが異なるため、Object.freeze()obj1.scoreのデータアドレスを参照することができず、つまりobj1.scoreのデータアドレスを参照することができず、obj1.scoreの値に凍結することができず、変更することができない.
したがって、リファレンスタイプを完全に変更(変更)するには、次の手順に従ってconstとobjectを行います.freeze()は適切に使用するべきです.
// obj1뿐만아니라 obj1.score까지도 immutable하게 만듬
const obj1 = {name: 'Kim', score: [1,2]};
Object.freeze(obj1);
Object.freeze(obj1.score);
obj1.score.push(3);	// 오류는 뜨지 않지만 적용되지 않음

// obj1.score과 obj2.score가 다른 데이터주소값을 갖도록 해주기위해서
// Object.assign을 한번 더해줌. (완전 얇은 복사가 됌)
const obj2 = Object.assign({}, obj1);
obj2.score = Object.assign({}, obj2.score);


console.log(obj1 === obj2);
// expected output -> false;

console.log(obj1.score === obj2.score);
// expected output -> false;

console.log(obj1.score);
// expected output -> [1, 2]
抗生物質は微生物から生じる物質であり、他の微生物の増殖を抑制または殺す.
抗生物質が発明されて多くの人を救ったが、これまでもそうだったが、抗生物質の乱用はよくないことが認識されているように.
インスタント食品が多くの人を飢餓から救い出したのに乱用されたように、インスタント食品は悪い食べ物だと考えられる.
可変も悪い概念ではない.上手に書いて大丈夫です.しかし悪用されると,誤りも多くなり,ますます難しくなるので,誤りを用いる意図や状況を把握し,可変と不可変を意識的に用いる.
そして.
変わらないことは知っておくべきことがたくさんあり、難しいことです.
ライブラリを提供します.
'immer'
npm install immer
'mori'