Nodejs中if (!!something){} 比 if(something){} 效率高?
Nodejs中if (!!something){} 比 if(something){} 效率高?
今天看pomelo的sample,发现好多地方用到了if(!!something){}
。
var channel = this.channelService.getChannel(name, flag);
if( !! channel) {
users = channel.getMembers();
}
var sessionService = self.app.get('sessionService');
//duplicate log in
if( !! sessionService.getByUid(uid)) {
next(null, {
code: 500,
error: true
});
return;
}
所以不耻下问
←_← 忽略我的小学语文水平,我错了!_!。。。。
我觉得你这个成语不能这么用,高中语文典型错误啊。
我觉得两个感叹号应该是代码风格的问题,表示先强制转换为布尔再判断。 因为我简单测试了一下,还是不转换快。。。
Node.js 中 if (!!something){}
比 if(something){}
效率高吗?
今天在看 Pomelo 的样例代码时,注意到很多地方使用了 if(!!something){}
这样的写法。这种写法是否比传统的 if(something){}
更高效呢?让我们来探讨一下。
示例代码
var channel = this.channelService.getChannel(name, flag);
if(!!channel) {
users = channel.getMembers();
}
var sessionService = self.app.get('sessionService');
// duplicate log in
if(!!sessionService.getByUid(uid)) {
next(null, {
code: 500,
error: true
});
return;
}
解释
-
双重否定 (
!!
) 的作用在 JavaScript 中,
!!
是一种将值转换为布尔值的方法。它通过两次取反操作来实现这一点:- 第一次取反 (
!
) 将值转换为它的布尔补码(即非布尔值会转换为其对应的布尔值)。 - 第二次取反 (
!
) 将其转换回布尔值。
例如:
var something = null; // 非布尔值 console.log(!!something); // 输出 false
- 第一次取反 (
-
效率对比
从理论上讲,
!!
操作符确实会执行两次取反操作,因此在某些极端情况下可能会稍微慢一些。然而,在实际应用中,这种微小的性能差异通常是可以忽略不计的。 -
代码意图
使用
!!
可以明确地表达开发者希望检查某个值是否为真值(即不是null
,undefined
,false
,0
,NaN
, 或空字符串)。这使得代码更具可读性和意图性。 -
推荐用法
如果你的目的是明确检查一个值是否为真值,那么使用
!!
是一种清晰且一致的做法。不过,如果你只是简单地检查一个变量是否存在或是否为真值,直接使用if (something)
也是完全可以接受的。
总结来说,虽然 !!
操作符可能在某些极端情况下稍微慢一点,但它提供了更好的代码可读性和意图性。在大多数情况下,这种微小的性能差异可以忽略不计。因此,根据具体需求选择合适的写法即可。
楼主水平很高啊,都能下问了啊:)
!!(var) 可以把任何 JavaScript 表达式转换为等价的布尔变量。这里 var 可以是任何变量,比如数字,函数或者对象。
!!如果作为 unary 操作单值,确实没有必要,可以直接用 if (var) 来判断; 但是如果是要做比较的话,首先使用严格的 === 可以避免很多预想不到的等价。
!!最大的作用是要预防 NaN,这是 JS 的一个坑之一,因为 NaN === NaN //返回 false,但是 !!NaN === !! NaN 就是 true,符合常人逻辑了
[@otinn](/user/otinn) 讨厌~别笑
楼主看代码很细心啊,赞一个
在Node.js中,if (!!something){}
和 if(something){}
的主要区别在于对 something
的布尔转换。前者通过双重否定操作符 !!
显式地将 something
转换为布尔值,而后者直接进行布尔判断。
性能差异
从性能角度来看,这种差异是微乎其微的。现代JavaScript引擎(如V8)已经非常优化,因此这两种写法在大多数情况下不会显著影响性能。然而,在某些极端情况下,显式的类型转换可能会导致稍微的性能提升,但这通常可以忽略不计。
示例代码
假设我们有一个函数 getChannel
,它可能返回一个对象或 undefined
:
function getChannel(name, flag) {
// 假设这里有一些逻辑来获取频道
return {}; // 或者返回 undefined
}
var channel = getChannel(name, flag);
if (!!channel) {
console.log("Channel exists");
} else {
console.log("No channel found");
}
同样的逻辑,但使用更简洁的方式:
var channel = getChannel(name, flag);
if (channel) {
console.log("Channel exists");
} else {
console.log("No channel found");
}
结论
尽管 if (!!something){}
可以确保变量被明确转换为布尔值,但在实际应用中,这并不会带来明显的性能提升。因此,推荐使用更简洁的 if (something){}
,因为代码更易读且维护性更好。
如果你真的关心性能,并且在某个特定场景下确实发现这种转换有显著效果,那么可以选择使用 if (!!something){}
。但在绝大多数情况下,两者是可以互换的。