-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 回答