console.log(obj1.a === obj2.a); //比较值和地址,值一样,但是地址不应该是不同的吗?为什么是true呢
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>
</head>
<body>
<script>
var obj1 = {
a: 1,
b: 2,
c: [44, 55, 66],
};
// var obj2 = obj1;
// console.log(obj2);//不克隆
// console.log(obj1 == obj2);//是一个数组,证明了不克隆,仍然是一个对象
// 下边我们来浅克隆
// 只克隆对象的表层,如果对象的某些属性值又是引用类型,则不进一步克隆它们,只是传递它们的引用,使用for...in...循环即可实现对象的浅克隆
var obj2 = {};
for (var k in obj1) {
obj2[k] = obj1[k];
}
console.log(obj2);
console.log(obj1.a == obj2.a); //基本类型比较的是值,本来就相等
console.log(obj1.a === obj2.a); //比较值和地址,值一样,但是地址不应该是不同的吗?为什么是true呢
console.log(obj1.c == obj2.c); //引用类型比较的是地址
// 浅克隆,比如c属性的值是引用类型值,那么本质上obj1和obj2的属性是内存中同一个数组,并没有被克隆分开。
obj1.c.push(77);
console.log(obj2); //也加上了77.说明是浅克隆了,这里的引用类型值没有被克隆
</script>
</body>
</html>
正在回答
同学你好,如下注释已经解释该问题了:
obj1.a的值是数字1,obj12.a的值也是数字1,数字是基本类型;而基本类型不论是“==”还是“===”,比较的是“值”(不是地址)。由于1和1,数值是相等的,所以console.log(obj1.a === obj2.a)是true。
祝学习愉快!
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星