从布尔运算符“转换”返回的目的是什么?

时间:2013-05-03 19:04:17

标签: javascript underscore.js

来自underscore

  _.isElement = function(obj) {
    return !!(obj && obj.nodeType === 1);
  };

!!的目的是什么?它认为声明的结果总是正确或错误。

我已经看到这种方式被用作"演员"到布尔类型。

但我不认为这里没有必要。

2 个答案:

答案 0 :(得分:6)

!!技巧确保输出为真 false。

当obj求值为false-y值(例如“”或0)时,表达式obj && ..将导致obj的值。

有时输入对象与结果无关,而且这种“强制转换”(它根本不是强制转换,而是强制转换)可以清除API并避免泄漏细节 - 可以确保仅 返回true或false。

以下是a && b的TTL,请注意结果不一定是真还是假:

a         b        a && b
-------   ------   ------
TRUTH-y   ANY      b
FALSE-Y   ANY      a

以下是!e的TTL,结果始终为true或false:

e         !e       !!e
-------   ------   ------
TRUTH-y   false    true
FALSE-y   true     false

表达原始表达式的另一种方法,我经常使用它:

return obj ? obj.nodeType === 1 : false;

答案 1 :(得分:3)

请注意,如果obj为0,NaN,null,undefined或空字符串,则表达式将评估为{,1}。如果你需要确保返回一个显式的布尔变量,那么你必须强制转换。