js百度面试题

小编推荐:Fundebug专注于JavaScript、微信小程序、微信小游戏,Node.js和Java实时BUG监控。真的是一个很好用的bug监控费服务,众多大佬公司都在使用。

说出以下代码运行结果

var a = {n: 1}

var b = a;

a.x = a = {n: 2}

console.log(a.x);

console.log(b.x)

输出:

undefined

n:2

解析:

var a = {n: 1}    // 定义变量 a 为一个新对象,且这个新对象有一个值为 1 的 n 成员

var b = a;    // 定义变量 b ,并且让 b 也引用变量 a 的对象

// 经过上面这两句之后,变量 a 和 b 都引用了对象 {n:1}

// 下面这句是问题的关键

a.x = a = {n: 2}

// a.x = 表示要给 a 引用的那个对象 {n:1} 的 x 成员赋值

// 实际上,此时变量 b 也引用了这个对象 {n:1}

// 此时,JavaScript引擎首先给 {n:1} 添加一个空的 x 成员,即:{n:1,x:undefined}

// 接下来要给{n:1,x:undefined}.x 赋的是什么值呢?

// 要赋的值是 a = {n: 2}

// 也就是先让变量 a 引用一个新的对象 {n:2}

// 然后再把 a 的新值赋给 {n:1,x:undefined}.x

// 所以原来的那个对象变成了 {n:1,x:{n:2}}

// 由于变量 b 始终引用那个原来的对象,所以 b 的值是 {n:1,x:{n:2}}

// 由于变量 a 被赋予了一个新的对象,所以 a 的值是 {n:2}

// 这面这两句是控制台输出

console.log(a.x);    // 变量 a 引用的对象是 {n:2},没有 x 成员,所以输出 undefined

console.log(b.x);    // 变量 b 引用的对象是 {n:1,x:{n:2}},所以输出 {n:2}  



作者:向布谷鸟说早安
链接:https://www.jianshu.com/p/3be87ab6cf7c

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了9亿+错误事件,得到了Google、360、金山软件、百姓网等众多知名用户的认可。欢迎免费试用!

猜你喜欢

转载自blog.csdn.net/qq_40126542/article/details/85231765