百度js面试题

来源:互联网 发布:赛酷ocr软件 编辑:程序博客网 时间:2024/06/06 06:52
该题的难度系数: ★★★★(3~5颗星之间)

涉及的相关技术点: 1). 内存分析 2). 原型链 3). 运算符的优先级

题目如下:

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

问:console.log(a.n, b.n)和console.log(a.x, b.x)的值分别为多少?

运行结果如下:



接下来,我们分析下解题思路:

var a = {n: 1} 就是声明一个对象a,并把属性名为n,属性值为1的对象赋给它,


var b = a,然后再把对象a赋值给b,也就是现在a和b都指向了同个地方,值均为{n:1}


接下来的a.x = a = {n: 2}就是一个连等的赋值语句,这里要主要的是,赋值的时候,是从右向左赋值的,还有就是涉及到优先级问题,就是‘a.x’的优先级比赋值‘=’的优先级来得高,即现在先在内存里面声明了个属性x,暂时还没有值,如图所示:


现在开始右侧的赋值,也就是a={n:2},那么现在a对象的值已经变了,也就是说跟原来断掉关系了,如图所示:


接下来,再把a赋值给a.x,也就是现在的x也指向了{n:2}这个对象,如图所示:


最后,我们回过头来看下刚才的问题,答案就一目了然了。

a.n的值就是2了,

b.n的值就是1了,

a.x值为undefined,因为我们现在遵循的是属性查找,就是在整个原型链上查找,如果原型链上找不到,就返回undefined了,

b.x的值就是对象{n:2}了。