Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

小括号与逗号的暧昧关系

  我们经常把小括号当做运算符来看待,但实际上小括号本身并不做任何运算,它只是提供了一个表达式优先级。小括号中表达式的运算结果是什么,小括号外得到的就是什么。这甚至不会影响到结果本身的性质,即使小括号内产生的是一个引用也可以在外部得到。
<script>
var a=1;
(a)=2; //什么情况?
alert(a);
</script>
  上面这段代码,小括号中的表达式是a,这是一个引用(Reference),所以它是可赋值的。但如果我们在小括号中做一些计算,得到的就未必是引用了了。比如 <script>
var a=1;
(1,a)=2; //ReferenceError:无效的左手赋值
</script>
  只有引用才可以赋值,而1,a是经过逗号运算符计算的结果,它不是引用,所以赋值错误。   也许变量的引用比较难理解吧,我们再看看对象属性的引用。 <script>
var o={n:"次碳酸钴",f:function(){alert(this.n)}};
(o.f)(); //次碳酸钴
(1,o.f)(); //undefined
</script>
  前者没有经过任何运算,直接是一个引用,所以我们调用时this依然指向引用的基对象。但是后者就不同,逗号运算符把这个表达式的值单独给取出来失去了引用。这时候我们再调用它就意味着没有指定this,它默认的指向了window,所以我们得到undefined这个结果。
  为什么我要特别强调逗号运算符呢?这是因为它比较容易误导人。如果只普通的算术运算符,(a+1)=2;这一看就知道是个语法错误。但是逗号运算符就不太明显,我们常说逗号运算符的结构是后面的表达式,但是并没有强调这个结果是引用还是值。根据ES5中的描述(ES5-11.14),逗号运算符最终得到的是值而不是引用。
网名:
3.80.32.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^