JavaScript条件语句的三种简写技巧:三元运算符与逻辑短路
本文深入解析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简写条件语句的内容就是小编分享给大家的全部,希望能对大家有所帮助,也希望大家多多支持本站。
D3.js 比例尺与坐标轴的配置详解
2026-11-05 16:54:46
JavaScript怎么遍历对象的Symbol键和不可枚举属性
2026-11-05 13:13:39
封装一个健壮的JS字符串判空工具函数
2026-11-05 12:16:14
JavaScript合并数组的三种常用方法:concat、扩展运算符与push
2026-11-05 11:22:29
JavaScript立即执行函数(IIFE)是什么及基本语法
2026-11-05 10:51:19
相关标签:
