有一个数组,里面的元素对象,
var poem = [
{name: "cold",age: 23,height: 177},
{name: "cool",age: 41,height: 163},
{name: "warm",age: 25,height: 137},
]
我可以通过定义一个变量等于数组中的一个对象
var cool = poem[1]
cool.name = "coolest"
cool.height = 188
然后这个数组第这个元素就变了,
console.log(poem)
//输出结果如下:
/*[
{ name: 'cold', age: 23, height: 177 },
{ name: 'coolest', age: 41, height: 188 },
{ name: 'warm', age: 25, height: 137 }
]*/
```小白提问,柑橘是很基础的问题,但是我知识有限,希望得到解答
poem 变量存放了数组对象的引用;一个数组对象所占的空间在堆上被分配,然后返回其引用;更改poem下标1里的内容实际上更改了内存中的内容,
首先你要知道,数组内的每个元素都相当于是一个单独变量,下面用变量来解释会好理解一些。
js中对象是按引用地址传递的。
当把一个对象从一个变量传递到另一个变量中时,两个变量都指向这同一个对象的引用地址。
var a={x:1};
var b=a; //a和b变量都指向同一个对象的引用地址。
当对对象的属性赋值时,实际上是先读取变量中的引用地址找到对象,再改变这个对象的属性。
这样之后再用另一个变量中的引用地址所找到的也是这同一个对象,会获取到一样的对象内容。
b.x=2;
alert(b.x); //输出 2
alert(a.x); //输出 2
但是这种引用只在读取变量时有效,当对变量重新赋值时,原有的引用就会断开。
b={x:3}; //b变量重新指向一个新对象的引用地址。不会影响到a变量。
alert(b.x); //输出 3
alert(a.x); //输出 2
因为取的是内存地址 你又没有创建新的内存地址引用 所有 获取的是 原来的内存地址
JS 对象的值在堆内存中,而数组和里面的对象都在堆内存中。
JS数组中存储的对象其实只是堆内存中数据的引用,也就是一个地址,像这样: 0x123adf (0x123adf 指向 {name: "cool",age: 41,height: 163})。
var cool = poem[1]; 只是把这个地址复制一份赋给 cool。
这样就是 一个对象两个地方引用。在任何一个引用的地方修改了堆内存中的数据。其他引用这个对象的地方也就跟着变了。
只要你能引用的到,就能改的到。
说明白一点, 其实和 var a=1; a=2; 这样修改 a的值没有区别。
数组内 和 对象内 的值, 只要能引用的到,就能改的到。
数组,对象,和一般变量(例如 var a;),区别只是数据结构而已。
前者是复合类型,后者是普通类型。 都是可以读取值和赋值的。