对象引用问题 - 1
var a = { n: 1 };
var b = a;
a.x = a = { n: 2 };
console.log(a.x); // --> undefined
console.log(b.x); // --> {n: 2}
- 优先级。
.
的优先级高于=
,所以先执行 a.x,堆内存中的{n: 1}就会变成{n: 1, x: undefined},改变之后相应的 b.x 也变化了,因为指向的是同一个对象。 - 赋值操作是从右到左,所以先执行 a = {n: 2},a 的引用就被改变了,然后这个返回值又赋值给了 a.x,需要注意的是这时候 a.x 是第一步中的{n: 1, x: undefined}那个对象,其实就是 b.x,相当于 b.x = {n: 2}
对象引用问题 - 2
function changeObjProperty(o) {
o.siteUrl = "http://www.baidu.com";
o = new Object();
o.siteUrl = "http://www.google.com";
}
let webSite = new Object();
changeObjProperty(webSite);
console.log(webSite.siteUrl);
答案: “http://www.baidu.com”
原因: o = new Object() 这句代码切断了原本对 o 的引用
[‘1’, ‘2’, ‘3’].map(parseInt) 答案是多少?
答案 [1, NaN, NaN]
map 会给函数传递 3 个参数: (elem, index, array),当相与:
["1", "2", "3"].map((item, index) => {
return parseInt(item, index);
});
parseInt 接收两个参数(sting, radix),其中 radix 代表进制。省略 radix 或 radix = 0,则数字将以十进制解析
因此,map 遍历 [“1”, “2”, “3”],相应 parseInt 接收参数如下
parseInt("1", 0); // 1
parseInt("2", 1); // NaN
parseInt("3", 2); // NaN
考 Symble
// example 1
var a={}, b='123', c=123;
a[b]='b';
a[c]='c';
console.log(a[b]);
---------------------
// example 2
var a={}, b=Symbol('123'), c=Symbol('123');
a[b]='b';
a[c]='c';
console.log(a[b]);
---------------------
// example 3
var a={}, b={key:'123'}, c={key:'456'};
a[b]='b';
a[c]='c';
console.log(a[b]);
// example 1
var a = {},
b = "123",
c = 123;
a[b] = "b";
// c 的键名会被转换成字符串'123',这里会把 b 覆盖掉。
a[c] = "c";
// 输出 c
console.log(a[b]);
// example 2
var a = {},
b = Symbol("123"),
c = Symbol("123");
// b 是 Symbol 类型,不需要转换。
a[b] = "b";
// c 是 Symbol 类型,不需要转换。任何一个 Symbol 类型的值都是不相等的,所以不会覆盖掉 b。
a[c] = "c";
// 输出 b
console.log(a[b]);
// example 3
var a = {},
b = { key: "123" },
c = { key: "456" };
// b 不是字符串也不是 Symbol 类型,需要转换成字符串。
// 对象类型会调用 toString 方法转换成字符串 [object Object]。
a[b] = "b";
// c 不是字符串也不是 Symbol 类型,需要转换成字符串。
// 对象类型会调用 toString 方法转换成字符串 [object Object]。这里会把 b 覆盖掉。
a[c] = "c";
// 输出 c
console.log(a[b]);