对象面试题
//test1
var a={};
var obj1={
n:2
}
var obj2={
n:3
}
//在设置和获取对象的属性的时候,一定要把key转换为字符串,调用toString
a[obj1]=4;
a[obj2]=5;
console.log(a);//我的答案:5//错误,应该为:[object Object]
//分析:没仔细分析这里的打印a是什莫意思,就单纯的理解为是输出a的值了,下次一定要注意!!!
console.log(a[obj1]);//5
//test2
/* 2个引用变量指向同一个对象,让一个引用变量指向另一个对象, 另一个引用变量还是指向原来的对象 */
var o3 = {
m: 3
}
赋值都是变量的值的赋值,把o1所代表的地址赋值给了o2
var o4 = o3
//修改了o3的地址值,o4还是原来o3的值
o3 = {
m: 4
}
console.log(o4.m, o4 === o3) //3 false
//test3
/* 2个引用变量指向同一个对象, 通过一个引用变量修改对象内部数据, 另一个引用变量也看得见 */
var o1 = {
m: 1
}
//赋值都是变量的值的赋值,把o1所代表的地址赋值给了o2
var o2 = o1;
//给o2扩展属性 其实是给o2地址所代表的对象扩展的属性
o2.m = 2;
console.log(o1.m, o1 === o2) //2 true
//test4
var O5={
m:5;
};
var o6=o5;
//传参其实就是一个赋值操作 obj=o5
function fn(obj){
//obj从新赋值了,不会影响o5和O6
obj={
m:6
};
}
fn(o5);
console.log(o5.m,o6.m,o6===o5);//5 5 true
//test5
var o5 = {
m: 5
};
var o6 = o5;
function fn(obj) {
//o5 o6 obj 是同一个地址
obj.m = 6
}
fn(o5)
console.log(o5.m, o6.m, o6 === o5) //6 6 true
//我的问题:这里为什么是6?
//因为这里的o5和o6使用的同一个地址进行数据的存储,其中一个改变之后,另外一个也看得见
// 2个引用变量指向同一个对象, 通过一个引用变量修改对象内部数据, 另一个引用变量也看得见