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;
}

所以不耻下问 ←_← 忽略我的小学语文水平,我错了!_!。。。。


9 回复

我觉得你这个成语不能这么用,高中语文典型错误啊。

我觉得两个感叹号应该是代码风格的问题,表示先强制转换为布尔再判断。 因为我简单测试了一下,还是不转换快。。。


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;
}

解释

  1. 双重否定 (!!) 的作用

    在 JavaScript 中,!! 是一种将值转换为布尔值的方法。它通过两次取反操作来实现这一点:

    • 第一次取反 (!) 将值转换为它的布尔补码(即非布尔值会转换为其对应的布尔值)。
    • 第二次取反 (!) 将其转换回布尔值。

    例如:

    var something = null; // 非布尔值
    console.log(!!something); // 输出 false
    
  2. 效率对比

    从理论上讲,!! 操作符确实会执行两次取反操作,因此在某些极端情况下可能会稍微慢一些。然而,在实际应用中,这种微小的性能差异通常是可以忽略不计的。

  3. 代码意图

    使用 !! 可以明确地表达开发者希望检查某个值是否为真值(即不是 null, undefined, false, 0, NaN, 或空字符串)。这使得代码更具可读性和意图性。

  4. 推荐用法

    如果你的目的是明确检查一个值是否为真值,那么使用 !! 是一种清晰且一致的做法。不过,如果你只是简单地检查一个变量是否存在或是否为真值,直接使用 if (something) 也是完全可以接受的。

总结来说,虽然 !! 操作符可能在某些极端情况下稍微慢一点,但它提供了更好的代码可读性和意图性。在大多数情况下,这种微小的性能差异可以忽略不计。因此,根据具体需求选择合适的写法即可。

楼主水平很高啊,都能下问了啊:)

!!(var) 可以把任何 JavaScript 表达式转换为等价的布尔变量。这里 var 可以是任何变量,比如数字,函数或者对象。

!!如果作为 unary 操作单值,确实没有必要,可以直接用 if (var) 来判断; 但是如果是要做比较的话,首先使用严格的 === 可以避免很多预想不到的等价。

!!最大的作用是要预防 NaN,这是 JS 的一个坑之一,因为 NaN === NaN //返回 false,但是 !!NaN === !! NaN 就是 true,符合常人逻辑了

楼主看代码很细心啊,赞一个

在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){}。但在绝大多数情况下,两者是可以互换的。

回到顶部