JavaScript 实用技巧:布尔值、三元运算符与性能优化
本文汇总了JavaScript开发中的常用技巧。涵盖如何正确处理False布尔表达式及短路求值,利用三元运算符简化条件逻辑,以及使用join()方法优化字符串拼接。同时介绍了NodeList遍历的性能陷阱及数组迭代的高效替代方案,帮助提升代码质量与执行效率。
本文整理并分享了JavaScript开发中的一些实用技巧,旨在为开发者提供参考。
正确理解布尔表达式中的 False 值
一、正确理解布尔表达式中的 False 值
在JavaScript中,以下类型的值在布尔上下文中会被转换为 false:
null undefined ''(空字符串) 0(数字零)
然而,以下值虽然看似为空,但在布尔表达式中却返回 true:
'0'(字符串形式的零) [](空数组) {}(空对象)
下面这段代码存在逻辑隐患:
代码如下:
while (x != null) {
如果确定变量 x 不会取值为 0、空字符串或 false,可以直接简化为:
代码如下:
while (x) {
若需明确检查字符串是否为 null 或空,可编写如下代码:
代码如下:
if (y != null && y != '') {
但更简洁的写法是:
代码如下:
if (y) {
需要注意,JavaScript 中存在许多容易混淆的比较行为,例如:
Boolean('0') == true '0' != true 0 != null 0 == [] 0 == false Boolean(null) ==false null != true null != false Boolean(undefined) ==false undefined != true undefined != false Boolean([]) == true [] != true [] == false Boolean({}) == true {} != true {} != false
三元操作符的简洁用法
三元操作符 (?:) 可用于替代以下冗长的代码结构:
if (val != 0) {
return foo();
} else {
return bar();
}
可以改写为更简洁的形式:
代码如下:
return val ? foo() : bar();在动态生成 HTML 代码时,三元操作符同样非常有用:
代码如下:
var html = '';
利用 && 和 || 进行短路求值
三、利用 && 和 || 进行短路求值
二元布尔操作符具有短路特性,即仅在必要时才会计算最后一项。
"||" 常被称为 'default'(默认值)操作符,例如:
function foo(opt_win) {
var win;
if (opt_win) {
win = opt_win;
} else {
win = window;
}
// ...
}
你可以使用它来简化上述代码:
function foo(opt_win) {
var win = opt_win || window;
// ...
}
"&&" 同样可以精简代码。例如:
if (node) {
if (node.kids) {
if (node.kids[index]) {
foo(node.kids[index]);
}
}
}
可以改写为:
if (node && node.kids && node.kids[index]) {
foo(node.kids[index]);
}
或者:
var kid = node && node.kids && node.kids[index];
if (kid) {
foo(kid);
}
不过,过度使用会导致代码可读性下降:
代码如下:
node && node.kids && node.kids[index] && foo(node.kids[index]);四、使用 join() 来创建字符串
通常建议采用以下更清晰的方式:
function listHtml(items) {
var html = '';
for (var i = 0; i < items.length; ++i) {
if(i > 0) { html += ', ';
}
html += itemHtml(items[i]);
}
html +='';
return html;
}
但在 IE 浏览器中这种写法性能较差,可以改用以下方式:
function listHtml(items) {
var html = [];
for (var i = 0; i < items.length; ++i) {
html[i] = itemHtml(items[i]);
}
return '' + html.join(', ') + '';
}
此外,还可以利用数组作为字符串构造器,最后通过 myArray.join('') 转换为字符串。不过,由于赋值操作的速度快于数组的 push() 方法,因此建议优先使用赋值操作。
使用 join() 来创建字符串
四、使用 join() 来创建字符串
NodeList 遍历的性能优化
NodeList 是通过给节点迭代器添加过滤器实现的。这意味着获取其属性(如 length)的时间复杂度为 O(n),而通过 length 遍历整个列表则需要 O(n^2) 的时间复杂度。
var paragraphs = document.getElementsByTagName_r('p');
for (var i = 0; i < paragraphs.length; i++) {
doSomething(paragraphs[i]);
}
因此,更好的做法是:
var paragraphs = document.getElementsByTagName_r('p');
for (var i = 0, paragraph; paragraph = paragraphs[i]; i++) {
doSomething(paragraph);
}
这种方法适用于所有的 collections 和数组(只要数组不包含 falsy 值)。
在上述示例中,也可以通过 firstChild 和 nextSibling 属性来遍历子节点。
var parentNode = document.getElementByIdx_x('foo');
for (var child = parentNode.firstChild; child; child = child.nextSibling) {
doSomething(child);
}
希望本文所述的技巧能对大家的 JavaScript 程序设计有所帮助。
为什么JS调用reload后页面没有立即更新
2026-11-05 13:38:29
crypto-js 加密结果与 Java/Python 后端不一致怎么解决
2026-11-05 12:09:48
js文件缓存导致代码不更新怎么强制刷新
2026-11-04 22:30:24
JS逆向调试技巧:编写Hook脚本监控加密函数输入输出
2026-11-04 10:42:46
Babylon.js 性能优化技巧:实例化网格与遮挡剔除
2026-11-03 23:43:22
