JavaScript条件语句的三种简写技巧:三元运算符与逻辑短路

作者:异步漫步时间:2026-10-30 08:53:09浏览:194

本文深入解析JavaScript中三种常见的条件表达简写方式:传统的if...else结构、三元运算符(?:)以及逻辑与或运算符(&&/||)。通过对比jQuery源码中的实际应用,阐述了如何利用逻辑运算符的短路特性实现变量赋值与函数执行,并讨论了在代码简洁性与可读性之间的权衡策略。

JavaScript条件语句简写概述

在许多资深开发者的代码中,经常能看到精简的条件表达式。参考Thomas Frank的文章《3 ways 2 say if》,其中对传统的if...else、三元运算符(?:)以及逻辑与或(&&/||)三种条件表达的特点和适用场景进行了总结。

第一种方式是标准的if...else结构。

传统if...else与三元运算符对比


// Set r to 0 or 1 
var r= Math.floor(2*Math.random()) 
 
// Set a, b and c to "small" if r==0 an else set them to "big" 
// using three different techniques 
 
// Method 1: If else 
var a; if (r==0){a = "small"} else {a = "big"}; 
 
// Method 2: Conditional operator 
var b = r==0 ? "small" : "big"; 
 
// Method 3: And/or operators 
var c = r==0 && "small" || "big"; 
 
// Check the values of our variables 
alert(r+" "+a+" "+b+" "+c);

第二种方式是if...else if...else多分支结构。

多分支条件判断的三种实现


// Set r to 0,1,2 or 3 
var r= Math.floor(4*Math.random()) 
 
// Set a, b and c to "nada","small","big" and "huge" 
// depending on the value or r using three different techniques 
 
// Method 1: If.. else if... else 
var a; 
if (r==0){a="nada"} 
else if (r==1){a="small"} 
else if (r==2){a="big"} 
else {a="huge"}; 
 
// Method 2: Conditional operators 
var b = 
r==0 ? "nada" 
: r==1 ? "small" 
: r==2 ? "big" 
: "huge"; 
 
// Method 3: And/or operators 
var c = 
r==0 && "nada" 
|| r==1 && "small" 
|| r==2 && "big" 
|| "huge"; 
 
// Check the values of our variables 
alert(r+" "+a+" "+b+" "+c);

第三种方式涉及执行特定函数。

利用逻辑运算符执行函数


// Set r to 0,1,2 or 3 
var r= Math.floor(4*Math.random()) 
 
// The global variable x and our four functions 
var x=""; 
nada=function(){x+="Nada! "}; 
small=function(){x+="Small! "}; 
big=function(){x+="Big! "}; 
huge=function(){x+="Huge! "}; 
 
// Call a specific function depending on the value of r 
// using three different techniques 
 
// Method 1: If.. else if... else 
if (r==0){nada()} 
else if (r==1){small()} 
else if (r==2){big()} 
else {huge()}; 
 
// Method 2: Conditional operators 
r==0 ? nada() 
: r==1 ? small() 
: r==2 ? big() 
: huge(); 
 
// Method 3: And/or operators 
r==0 && (nada() || true) //nada()函数不一定返回true,为了保证后续的逻辑或||判断不被执行,需要返回true值,下同
|| r==1 && (small() || true) 
|| r==2 && (big() || true) 
|| huge(); 
 
// Check the values of our variables 
alert(r+" "+x);

第四种方式则是直接执行代码块。

利用逻辑运算符执行代码块


// Set r to 0,1,2 or 3 
var r= Math.floor(4*Math.random()) 
 
// The global variable x 
var x=""; 
 
// Executing different code depending on the value of r 
// using three different techniques 
 
// Method 1: If.. else if... else 
if (r==0){x+="Nada! "} 
else if (r==1){x+="Small! "} 
else if (r==2){x+="Big! "} 
else {x+="Huge! "}; 
 
// Method 2: Conditional operators 
r==0 ? function(){x+="Nada! "}() 
: r==1 ? function(){x+="Small! "}() 
: r==2 ? function(){x+="Big! "}() 
: function(){x+="Huge! "}(); 
 
// Method 3: And/or operators 
r==0 && (function(){x+="Nada! "}() || true) 
//有人在评论中指出这里的匿名函数是不必需的,在只有一条可执行代码时是这样的,但是如果有多条代码需要执行,匿名函数还是不错的
|| r==1 && (function(){x+="Small! "}() || true) 
|| r==2 && (function(){x+="Big! "}() || true) 
|| function(){x+="Huge! "}(); 
 
// Check the values of our variables 
alert(r+" "+x);

代码简洁性与运行效率的权衡

原作者主要关注代码的简短程度,因此在实现相同功能时,通常更倾向于使用三元运算符,认为逻辑与或的方式需要输入更多字符,显得较为繁琐。然而,在涉及函数执行时,传统的if...else结构往往更加直观。有观点指出,客户端代码的简洁性对于减小传输体积的价值,远大于微小的运行效率提升,且运行效率还受用户代理(UA)影响。因此,从形式上选择更简洁的条件语句写法,其意义往往超过对运行效率的考量。

逻辑与或运算符的核心原则

在仅包含两种判断条件的情况下,使用if...else或三元运算符都非常直观,而逻辑与或(&&/||)的运算逻辑则相对复杂。但只要掌握以下两个核心原则,即可轻松应对:

首先,逻辑与(&&)和逻辑或(||)运算符的计算方向均为自左向右。对于逻辑与(&&),一旦遇到第一个可转换为false的值(如null、undefined、0、空字符串""、NaN等),计算即停止;对于逻辑或(||),一旦遇到第一个可转换为true的值,计算即停止。整个表达式的返回值是最后被检测的那个条件的值,而不仅仅是布尔值true或false。

其次,逻辑与(&&)运算符的优先级高于逻辑或(||)运算符。

基于第一个原则,表达式r==0和"small"按自左向右顺序计算。若r==0为true,则继续检测"small",由于"small"是非空字符串(可转换为true),最终c取值为"small";若r==0为false,则跳过逻辑与部分,直接检测逻辑或(||)的第二个条件"big",同理c取值为"big"。根据第二个原则,在上述代码中变量c的运算无需额外添加括号。

简写运算符在库源码中的应用

由于三元运算符(?:)和逻辑与或(&&/||)能在一定程度上精简代码,它们在jQuery等库的源码中应用广泛。归纳而言,这类运算符主要有两类应用场景:一是用于赋值或返回值,二是用于执行代码(此处暂按此分类)。

在jQuery或其他库中,用于赋值的用法十分常见。一个经典应用是为接口参数提供默认值,例如可以编写如下代码:

用于赋值的默认值处理


var myObj = function(options) {
  var color = options.color || this.defaults.defaults;
  var backgroundColor = options.backgroundColor
      || this.defaults.backgroundColor;
};
myObj.prototype.defaults = {
  color : "#393939",
  backgroundColor : "#222"
}
var myIns = new myObj({
  color : "#80FF80"
});
console.log("color:"+myIns.color+", backgroundColor: "+myIns.backgroundColor);

无论是使用三元运算符还是逻辑与或,由于它们不具备if...else结构中由花括号{}包裹的代码块功能,因此它们只能执行单行代码。例如:

单行代码执行的限制


(xmlHttpRequest.readyState==4 && xmlHttpRequest.status ==200) ? alert("Success!"): alert("Failure!");

因此,如果需要执行多条代码,应当使用匿名函数。例如:

多行代码执行的匿名函数方案


(xmlHttpRequest.readyState==4 && xmlHttpRequest.status ==200) ? function(){alert("Success!"); var a=100; alert(a);}: alert("Failure!");

在jQuery 1.7.1的源代码中,这两种简写形式随处可见,例如在第2643行中就有相关应用。

jQuery源码中的实际案例


// Hook for boolean attributes
boolHook = {
  get: function( elem, name ) {
    // Align boolean attributes with corresponding properties
    // Fall back to attribute presence where some booleans are not supported
    var attrNode,
      property = jQuery.prop( elem, name );
    return property === true || 
typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
      name.toLowerCase() :
      undefined;
  },
  set:function(){
  ...
  }
}

看来还需要继续深入学习并进行总结。

以上关于JavaScript简写条件语句的内容就是小编分享给大家的全部,希望能对大家有所帮助,也希望大家多多支持本站。

作者最新文章