引用类型
js数据类型分为值类型和引用类型(array\object)。前者存放值,后者存放地址。也就是说后者在改变内容时为链式的
1)
var a = {n: 1};
var b = a; // 此时的a、b共享一个地址{n:1}
a.x = a = {n: 2}; // 第一步,设置共享地址{n:1}的新属性x,值为{n:2};第二步,将a赋予全新的地址{n:2}
// 最终 a={n:2}; b={n:1,x:{n:2}}
console.log(a.x) // undifined
console.log(b.x) // {n:2}2)
// example 1
var a={}, b='123', c=123;
a[b]='b'; // 相当于a['123'] = 'b'
a[c]='c'; // 相当于a['123'] = 'b'
// 最终的a = {123:c}
console.log(a[b]); // c
// example 2
var a={}, b=Symbol('123'), c=Symbol('123'); //由于Symbol类型的唯一性,导致用不相同
a[b]='b';
a[c]='c';
// 最终的a = {Symbol(123): "b", Symbol(123): "c"}
console.log(a[b]); // b
// example 3
var a={}, b={key:'123'}, c={key:'456'};
a[b]='b'; // 由于对象被转换成字符串,所以这里和后面相当于 a['[object Object]'] = 'b'
a[c]='c';
// 最终的a = {[object Object]: "c"}
console.log(a[b]);// c
对象的属性名始终会被转换成字符串,对象转字符串返回[object Object]
function changeObjProperty(o) {
o.siteUrl = "http://www.baidu.com" // 这里的o为传入的对象地址
o = new Object(); // 这里的o为全新创建的对象地址
o.siteUrl = "http://www.google.com" // 这里的o同上
}
let webSite = new Object();
changeObjProperty(webSite);
console.log(webSite); // 这里的对象为传入对象,所以siteUrl为"http://www.baidu.com"4)
var a = (function(foo){ // foo值为{foo:{bar:1}}
return typeof foo.bar; // foo.bar不存在,所以undefined
})({foo:{bar:1}});
console.log(a);别问,问就是仔细看
总结
- 对象的属性名称,在大部分情况下始终是个字符串(除Symbol),如果不是也会被转为字符串
- 对象转字符串为
[object Object] - 引用类型作为参数进行方法传递时,仍然为引用类型,指向同一个内存
- 仔细看题 一步步分析
