js中所谓的 — “短路”条件调用

今天在浏览《Javascript高级程序设计》的译者:曹力的blog:http://shiningray.cn的时候,看到了一个有意思的js编写方式:“短路”条件调用

var f = false; var t = true;
var n=2;
var z = (f == 4) || (t == n);  // the key
alert(z);
// output:2

之前在看一些库的源码的时候都看到过类似的这种用法,但是由于无法用简单的例子测试而没有借鉴来实践在自己的项目中。在曹力的blog里看到了这个简单的例子,终于

豁然开朗了。既可以作为判断,又能根据需要来赋值,可谓一举两得,这种编写方式值得借鉴!!

原文网址:《函数式JavaScript编程指南

另外在它的blog里也看到了一篇关于优化js的不错的文章,文章中提供了很多js细节上的效率问题,推荐大家阅读:《如何优化JavaScript脚本的性能

2009/12/04 update:
上面提到了“短路”的编写方法,也让我想到了另外的一些编写方式来避免丑陋的if…else…的格式,本人是非常讨厌if..else..的,除非必要,否则都会使用另外的方式来代替它。

//假设id为一个已知的变量
var getById= typeof id === "string" ? function(){
                       return document.getElementById(id);
                  } : function(){
                       return id;
                  }

上面使用三元运算符的方式也很好的避免了丑陋的if..else..判断。

大家的手印:

  1. 番茄2010年01月7日于2:01 上午

    这个不算“短路”吧,很常见的用法啊,连我都知道,||和&&运算符返回的就是最后一次被求值的表达式的值,是||运算符的话,如果第一个表达式为true,则返回左边表达式,而不再计算右边表达式,如果左边为false,则返回右边表达式,&&运算符的话,如果左边为false则返回左边表达式,不再计算右边,如果左边为true,则返回右边表达式。
    比如:
    ver evtTarget = evt.target || evt.srcElement
    var div1 = document.createElement && document.createElement(‘div’);
    如果支持document.createElement的话,最后返回的是那个新建的div。如果不支持的话,最后返回的是document.createElement,因为是未定义的属性,所以值是undefined

    Supersha 回复:

    @番茄, 这只是一种概念性的东西吧,要不然,你说什么是“短路”?

你的手印呢?