检查两个对象是否未定义或在javascript中为null

时间:2013-02-19 19:08:51

标签: javascript null undefined logical-operators

我有一个方法hitTest检查碰撞检测并且可以返回一个Point对象(如果发生碰撞)或(如果没有碰撞)它返回nullundefined(我避风港)不知道什么时候它返回null或未定义,但我相信chrome控制台。)

我必须在2个物体上测试碰撞。并检查是否发生了一次或两次碰撞。我试过这段代码:

var result1 = hitTest(player, object1);
var result2 = hitTest(player, object2);
if( result1 || result2 )  { blabla() };

但它不起作用。

现在..我知道js绝对是一种棘手的语言,我想到了一种聪明的方法来做到这一点,而不是写typeof 4次。我正在考虑python短路逻辑运算符......

3 个答案:

答案 0 :(得分:2)

您可以使用&&,如果false/null/undefined/0ifresult1,则会返回第一个检测到的result2,即null赢得通过{{1}}。

答案 1 :(得分:1)

对于这类事情,underscore.js很漂亮:http://underscorejs.org/#isNullhttp://underscorejs.org/#isUndefined

我经常使用这些助手来解决JS中的边缘情况,例如你提到的那些

答案 2 :(得分:1)

你不需要写typeof 4次但是无论如何;

条件语句和运算符的强制范式:

//TYPE           //RESULT
Undefined        // false
Null             // false
Boolean          // The result equals the input argument (no conversion).
Number           // The result is false if the argument is +0, −0, or NaN; otherwise the result is true.
String           // The result is false if the argument is the empty String (its length is zero); otherwise the result is true.
Object           // true

来自Mozilla:

逻辑AND(&&

  

expr1&&表达式2
  如果第一个操作数(expr1)可以转换为false,则&&运算符将返回false而不是expr1的值。

逻辑或(||

  

expr1 ||表达式2   如果可以转换为expr1,则返回true;否则,返回expr2。因此,当与布尔值一起使用时,如果任一操作数为||,则true返回true;如果两者都是false,则返回false

true || false // returns true
true || true // returns true
false || true // returns true
false || false // returns false
"Cat" || "Dog"     // returns Cat
false || "Cat"     // returns Cat
"Cat" || false     // returns Cat

true && false // returns false
true && true // returns true
false && true // returns false
false && false // returns false
"Cat" && "Dog" // returns Dog
false && "Cat" // returns false
"Cat" && false // returns false

此外,您可以像在PHP中一样使用快捷方式isset()方法来正确验证对象:

function isSet(value) {
    return typeof(value) !== 'undefined' && value != null;
}

因此;你的代码是:

var result1 = hitTest(player, object1),
    result2 = hitTest(player, object2);
if ( isSet(result1) && isSet(result2) )  { blabla(); };