宝哥软件园

javascript引用类型指针是如何工作的

编辑:宝哥软件园 来源:互联网 时间:2021-09-09

我们先举个例子:

脚本var a={ n :1 };var b=a;a . x=a={ n :2 };console . log(a . x);//-未定义的console . log(b . x);////[Object Object]/脚本上面的例子看似简单,但结果并不容易理解,所以很容易想到——“A . X不是指向对象A吗?为什么log(a.x)未定义?”“b.x不应该和a.x一样吗?为什么log会出现两个对象?”

当然,你可以先自己了解。如果能看到原因和工作机制,自然不需要往下看。

让我们分析一下这段简单代码的工作步骤,进一步了解js引用类型“赋值”的工作模式。

首先是

var a={ n :1 };var b=a;

这里,A指向一个对象{n:1}(姑且称之为对象A),B指向对象A指向,也就是说此时A和B都指向对象A:

这一步很容易理解,然后继续看下一行非常重要的代码:

a . x=a={ n :2 };

我们知道js的赋值顺序总是从右向左,但是因为。是优先级最高的运算符,这行代码“计算”出A.X.

这时,事情发生了。——a指向的对象{n:1}添加了属性x(尽管该x未定义):

从图中可以看出,因为B像A一样指向对象A,所以A的X属性除了A.X之外,还可以用b.x来表示.

然后,按照“从右向左”的赋值操作顺序,首先执行a={n:2}。此时A指向的对象已经变成了新的对象{n33602}(我们称之为对象B):

然后继续执行a.x=a,很多人会认为这是“对象B也增加了一个属性X,指向对象B本身”

但事实上,情况并非如此。由于js一开始已经计算了a.x,已经解析出a.x是对象A的X,所以如果你回来在同样的公式下给a.x赋值,就不会再说a.x是对象B的X了。

因此,a.x=a应理解为对象a的属性x指向对象B:

那么这个时候结果就很明显了。当console.log(a.x)时,a指向对象b,但是对象b没有属性x,没关系,在查找对象的属性时,JavaScript会遍历原型链向上,直到找到给定名称的属性。但是当搜索到达原型链的顶端——也就是object . prototype——指定的属性B.prototype.x仍然没有找到,自然会输出undefined;

在console.log(b.x)中,因为b.x代表对象A的x属性,指向对象B,所以自然会输出[object Object]。注意这里的[object Object]并不是指两个对象,而是对象的字符串形式以“[Object Object]”的形式隐式调用对象对象的toString()方法。因此,[对象对象]只代表一个对象

以上就是本文的全部内容,希望大家喜欢。

更多资讯
游戏推荐
更多+