Javascript foo=foo.bar=foobar

Javascript foo=foo.bar=foobar,javascript,Javascript,我对我正在使用的应用程序中遇到的一些问题感到非常困惑 我的对象中有一个名为move的方法,它在单击列表项时执行此操作(简化) var board = { move: function() { var unique_id = Puzzle.pieces.id = 28; // More stuff going on with the unique_id variable. }, } 然后,在整个应用程序中,Puzzle.pieces.id用于将id分配给以下内容: $

我对我正在使用的应用程序中遇到的一些问题感到非常困惑

我的对象中有一个名为
move
的方法,它在单击列表项时执行此操作(简化)

var board = {
  move: function() {
     var unique_id = Puzzle.pieces.id = 28;
     // More stuff going on with the unique_id variable.
  },
}
然后,在整个应用程序中,Puzzle.pieces.id用于将id分配给以下内容:

$('#puzzle-piece-' + Puzzle.pieces.id + '');
经过一段时间的思考,我得出以下结论: 调用该方法时,
unique\u id
将临时属性分配给Puzzle命名空间对象中的pieces对象。然后,单击新列表项时,属性将被新值覆盖


如果这是正确的,那么在整个应用程序中快速使用临时值是一种常见做法吗?如果不是,它真正的作用是什么?

var unique\u id=Puzzle.pieces.id=28

意味着

将Puzzle.pieces.id设置为28。设置它的动作返回28。将unique_id设置为该返回值。

此语句:

 var unique_id = Puzzle.pieces.id = 28;
做了与这些完全相同的事情:

 var unique_id;
 Puzzle.pieces.id = 28;
 unique_id = Puzzle.pieces.id;
因此,它将
28
赋值给
Puzzle.pieces
对象的“id”属性,然后将该值赋值给局部变量
unique\u id
。需要注意的重要事项是,对“id”属性的赋值发生在对局部变量的赋值之前,“id”属性实际上与局部变量没有太大关系,只是作为其值的来源。否则,两者是相互独立的,任何一方都可以在事后改变,而不会影响另一方

“id”属性不是临时性的。如果它已经存在,那么该代码会给它一个新值。如果它不存在,那么它就被创建了。在这两种情况下,该属性将一直保留,直到显式删除为止

编辑-注释中正确指出,
Puzzle.pieces
对象可以为“id”属性定义一个setter函数,这意味着该属性的值可能不是
28
。因此,真正的等价物是

 var unique_id;
 Puzzle.pieces.id = 28;
 unique_id = 28;
初始化

var unique_id = Puzzle.pieces.id = 28;
被解析为

var unique_id = (Puzzle.pieces.id = 28);

外部
=
右侧的值将始终为
28

如果您直接将unique\u id设置为28,它可能会变成一个整数。如果pieces.id不是整数,那么unique_id可能会以其他类型结束

var unique_id = Puzzle.pieces.id = 28;
相当于:

Puzzle.pieces.id = 28;
var unique_id = Puzzle.pieces.id;
var unique_id = 28;    
Puzzle.pieces.id = 28;
在局部变量中保留对id的引用有几个好处,首先,键入
unique\u id
vs
Puzzle.pieces.id
更容易,其次,它允许缩微器实现更高的压缩比,因为它可以安全地将
unique\u id
压缩为例如
a

根据评论,它更准确地等同于:

Puzzle.pieces.id = 28;
var unique_id = Puzzle.pieces.id;
var unique_id = 28;    
Puzzle.pieces.id = 28;

向对象添加临时属性并在不再需要它们之后删除它们似乎很有用。但这是一种不好的做法,因为它会大大降低性能。什么是临时属性?我只看到一个局部变量。你可能读过答案了吗?值得指出的是,局部变量
unique\u id
很可能只是作为一种效率度量。该方法可能被重写以省去局部变量,并在其使用的所有地方使用
unique_id
;但是,这需要对每个值访问进行两次属性查找。(在名为
unique\u id
的变量中存储硬编码值也有点奇怪。当每个函数调用都分配相同的值时,很难看出它的唯一性。)@下划线\u d-OP在发布问题之前怎么能阅读答案?我在和@sam100rav交谈。我以为上下文会清楚地说明这一点。也许我应该向他们明确表达我的意见。(我也会给你加上标签,但每篇文章1个,所以…)这适用于弱类型语言,比如JS。指出这样的真理无助于回答被问到的具体问题。这个答案是不正确的。变量和对象属性在javascript中没有固有的类型,而这个答案所说的可能发生的事情实际上永远不会发生。它也更有效,因为访问局部变量值比两次属性查找要省工得多。不过,
id
是通过引用分配还是复制?我知道对象是通过引用指定的,但不是原语。如果没有看到声明,我想我们真的不知道。@underline\d-
id
根本没有分配给
unique\id
。计算赋值表达式
Puzzle.pieces.id=28
得到的值是分配给
unique\u id
的值。根据规范,该值是赋值本身的右边值(即28)。@riscarrott可能想要编辑他们的帖子,在这种情况下。谢谢你证实我的怀疑,汉克斯,没有考虑参考部分。它确实更容易输入和维护。我不确定这两段代码是否等效。如果
Puzzle.pieces.id
有一个setter和/或getter,那么第二种情况下的结果可能与第一种情况下的结果大不相同。(在第一种情况下,表示赋值表达式的值是右边的值[不管设置左边值涉及什么getter/setter机制(如果有的话)))很有趣,谢谢你写出来。在创建属性之前和之后,我一直通过将对象登录到控制台进行测试,现在一切都清楚了。关于临时性的部分在我看来是令人困惑的,我的意思是它只在客户端刷新之前存在,但这显然是程序默认返回的地方:)@TedHopp在存在setter/getter函数的情况下,你是对的;财产可能会做任何事。您是对的,赋值表达式的值始终是赋值,而不是调用getter的结果。我会更新答案