【导读】很冒昧在博客名字中包含"Snandy"。因为他是博客园JavaScript社区最活跃分子之一.今早,在读他的一篇博客时,有了另类猜想.因此有了该文.

原文连接:写了10年Javascript未必全了解的连续赋值运算

var a = {n:1};
a.x = a = {n:2};
alert(a.x); 

读到这里时,我以为a.x会输出[object,object].但结果却是undefined.初步分析是这样的:

var a = {n:1};
a = {n:2}
a.x = a;
alert(a.x); 

其结果正是[object,object]. 但与示例一结果不一致.因此思考过后,作了另一番推测:

【猜想】

      QQ截图未命名

      假设javascript引擎刚刚解释完:var a = {n:1}; 时,为对象a分配了内存地址:ff00.因此在解释第二句a.x = a = {n:2}之前,a所指的对象在内存中地址如上图. 其中JavaScript引擎理解a.x的含义是:将内存中ff00处对象的x属性赋值.

      但是具体执行的时候,出现点意外(从右往左执行),当执行到a = {n:2}时,a已经指向了另一个对象.此时a指向的对象可能是ff01.因此如果继续往下执行,a.x的含义区别于该表达式初始化时的含义.因此javascript引擎放弃继续执行.所以a.x会显示undefined.
      .net 程序员应该知道,在foreach内部改变(增加,或删除成员)迭代集合.会抛出异常。与此应该同理吧.

【修正】

function fun(){
	var a = b = 5;
}
fun();
alert(typeof a); // --> undefined
alert(typeof b); // --> number

var a = b = 5 是这样解释的:

b = 5 //此处没有显示申明b,因此b默认为全局变量.
var a = b;

作者: 仰光 发表于 2011-04-07 10:38 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架