We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
说明: 图画的很糙,大家明白意思就好,还有引用赋值是不是这样的,大家可以提出自己的意见和论证。
var a = {n:1}; var b = a; a.x = a = {n:2}; console.log(a.x); //undefined console.log(b.x); //{n:2}
var a = {n:1};
var a = {n:1}; var b = a;
为了理解最后一句,先看下我总结的(自己瞎写的,无从考证),不成文的规定
比如 var a = b = c = d =1; 像这样的、栈里面的赋值是从右向左赋值的(栈是后进先出) 但是如果是引用对象,比如: var a = b = c = d = {n:123} 就是从左往右赋值的(引用是标记)。 一个不成文的约定,记住暂时。
所以上述最后一句代码,咱们可以拆成:
a.x = {n:2} 和 a = {n:2}
The text was updated successfully, but these errors were encountered:
以上是论证1,可以看出强行加了一个引用赋值是从左往右的(简直就是瞎说),这个可以说是错误的,因为 js赋值操作是 从右到左, 可以查证的地方很多,自行百度。
从右到左
接下来看另一个论证观点: 每个观点都是可以查证的(不提供链接,自行百度、google);
运算符优先级 .的优先级高于 =, 所以先执行 a.x, 堆内存中的 {n:1} 就会变成 {n:1, x:undefined},相应的 b.x也变了,因为指向的是同一个对象
.
=
a.x
{n:1}
{n:1, x:undefined}
b.x
赋值操作是从右到左,所以先执行 a={n:2},a的引用就被改变了。但是需要特别注意,这个值随后又赋值给了 a.x,这时候,其实是第一步的 {n:1, x:undefined} 那个对象。也就是 b.x。
a={n:2}
从 a.x = a = {n:2} 开始,上两句都很简单
a.x = a = {n:2}
a.x = ; 先执行
a.x = ;
随后赋值动作,从右向左
Sorry, something went wrong.
No branches or pull requests
题目是这样的
接下来看下内存堆栈的演变
为了理解最后一句,先看下我总结的(自己瞎写的,无从考证),不成文的规定
所以上述最后一句代码,咱们可以拆成:
The text was updated successfully, but these errors were encountered: