对象引用问题

对象引用问题 - 1

var a = { n: 1 };
var b = a;
a.x = a = { n: 2 };

console.log(a.x); // --> undefined
console.log(b.x); // --> {n: 2}
  1. 优先级.的优先级高于=,所以先执行 a.x,堆内存中的{n: 1}就会变成{n: 1, x: undefined},改变之后相应的 b.x 也变化了,因为指向的是同一个对象。
  2. 赋值操作是从右到左,所以先执行 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]);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值