引用类型 的问题竟然只有你一个

2020.09.20
评论

引用类型

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);

别问,问就是仔细看

总结

  1. 对象的属性名称,在大部分情况下始终是个字符串(除Symbol),如果不是也会被转为字符串
  2. 对象转字符串为[object Object]
  3. 引用类型作为参数进行方法传递时,仍然为引用类型,指向同一个内存
  4. 仔细看题 一步步分析