-2

文字列のようなリテラル型を使用すると子スコープが新しいプロパティを作成し、以下の例でオブジェクト表記を使用すると新しいオブジェクトを作成しない理由を知りたい

paretscope.aString = 'parent string'

//now initialize a string in child scope so it will create a new property in child scope
childScope.aString = 'child string'

paretscope.model={key:"abc"}

// now i modify an object property in child scope but it will not create
// a new object in child scope instead it will modify object in parent scope

childscope.model.key ="xyz"
4

1 に答える 1

3

この問題は、プリミティブ値やオブジェクト/配列とは何の関係もありません。プロパティ[1]にどれだけ正確にアクセス/変更するかが問題です。

childScope.aString = 'child string'

プロパティに新しい値を割り当てaStringいます。これにより、要素にプロパティがまだ存在しない場合に作成されます。その名前の継承されたプロパティがあるchildScopeかどうかは問題ではありません。割り当てを行うと、プロパティは常にオブジェクト自体に作成されます。childScope

childScope.model.key ="xyz"

プロパティに新しい値を割り当てているのではなく、値自体にプロパティを追加しているので、まったく別のものです。

文字列の割り当てと同等のプロセスは、新しいオブジェクトをmodelプロパティに割り当てることです。

childScope.model = {key:"xyz"}

1: ただし、可変および不変のデータ型に少し関連しています。JavaScript のプリミティブ値はすべて不変です。つまり、値を変更するには、新しい値を作成する必要があります。ただし、配列とオブジェクトは可変であるため、新しい配列やオブジェクトを作成せずに要素/プロパティを追加できます。

そのため、不変データ型の値はプロパティ/変数に新しい値を割り当てる必要がありますが、可変データ型の値はその場で変更できます

于 2013-04-02T13:41:34.603 に答える