2017-03-29 2 views
1

は、インポート・バインディングは、その場合は、最初ではないだろう...私はJSの輸入は、実際に書き込み不可(不変ではない)であることelsewhereを読んで、JSのインポートは不変か書き込み不可ですか?私が言うことができるものから、

import { foo } from './foo'; 
... 
foo.bar = 23; // works 
... 
foo = { bar: 23 }; // syntax error 

が不変です代入文foo.bar = 23;も構文エラーを投げる?

UPDATE(私は今それを理解する方法)

... @FelixKingことにより、優れた答えを言い換えする...

JSの輸入が輸出さのもの(変数、関数、など)への不変のバインディングです。

プリミティブでないインポートでは、インポートされたオブジェクトのプロパティが必ず不変または書き込み不能であるとは限りません。

答えて

6

この場合、最初の代入文foo.bar = 23はありません。また、構文エラーを投げる?

非書き込み可能な変数の値として可変(不変)を指す値自体が場所かでを変更することができるかどうかを記述しています。

あなたが見つけたので、輸入は書き込み可能ではありません。しかし、インポートの値が変更可能であれば、値を更新することができます(その場で)。

foo.bar = 23; 

は、fooに新しい値を割り当てません。 の値がfooであることを確認してから、それを変更します(プロパティの追加または上書きによる)。あなたがした場合

var oldFoo = foo; 
foo.bar = 23; 
oldFoo === foo; // true 

trueを得るでしょう。これは、fooに依然として同じ値が割り当てられていることを示します。値(オブジェクト)を更新しただけです。

プリミティブ値(String、Numberなど)はすべて不変ですが、すべてのオブジェクトは(Object.freezeまたは同様の関数に渡されない限り)変更可能です。

+0

ありがとうございます! JSのインポートには不変のバインディングがありますが、インポートされたオブジェクト自体は変更可能/書き換え不可能であると言うのは正しいでしょうか? – sfletche

+0

はい、インポートバインディングは不変ですが、オブジェクトはデフォルトで変更可能です。 –

+0

優秀!そして書き込み不能とは、 'foo'が既に' bar'プロパティーを(インポートの前に)定義していれば、上記のように 'foo.bar = 23'も構文エラーを投げることを意味します。 (この代入文は、 'foo'が' bar'プロパティを持っていない場合にのみ成功します。)正しいのでしょうか? – sfletche

関連する問題