Dan*_*eld 15 javascript operator-precedence associativity multiple-assignment
我知道赋值运算符是右关联的.
所以例如 x = y = z = 2相当于(x = (y = (z = 2)))
既然如此,我尝试了以下方法:
foo.x = foo = {a:1}
Run Code Online (Sandbox Code Playgroud)
我期望foo使用value创建对象{a:1},然后x将创建属性,该属性foo将只是foo对象的引用.
(实际上,如果我要将多个赋值语句分成两个单独的语句,会发生什么foo = {a:1};foo.x = foo;)
结果实际上是:
ReferenceError:未定义foo(...)
那么我尝试了以下内容:
var foo = {};
foo.x = foo = {a:1};
Run Code Online (Sandbox Code Playgroud)
现在我不再得到例外但是foo.x未定义!
为什么作业不按我的预期工作?
var关键字创建的变量相关联.这不是问题所在.
Mic*_*Liu 10
关联性和评估顺序之间存在重要差异.
在JavaScript中,即使赋值操作符组从右到左的操作数进行评价左至右分别是执行实际任务之前(这也发生从右到左).考虑这个例子:
var a = {};
var b = {};
var c = a;
c.x = (function() { c = b; return 1; })();
Run Code Online (Sandbox Code Playgroud)
变量c最初引用a,但赋值的右侧设置c为b.分配了哪个属性,a.x或者b.x?答案是a.x因为在c仍然引用的情况下,首先评估左侧a.
通常,表达式x = y的计算方法如下:
x并记住结果.y并记住结果.x = y).多项任务会发生什么情况,如x = (y = z)?递归!
x并记住结果.y = z并记住结果.去做这个:
y并记住结果.z并记住结果.y = z).x = (y = z)).现在让我们看看你的例子,稍加编辑:
var foo = {};
var bar = foo; // save a reference to foo
foo.x = (foo = {a:1}); // add parentheses for clarity
Run Code Online (Sandbox Code Playgroud)
foo.x在foo被分配之前进行评估{a:1},因此该x属性被添加到原始{}对象(您可以通过检查来验证bar).
| 归档时间: |
|
| 查看次数: |
274 次 |
| 最近记录: |