我有一个方法hitTest检查碰撞检测并且可以返回一个Point对象(如果发生碰撞)或(如果没有碰撞)它返回null
或undefined
(我避风港)不知道什么时候它返回null或未定义,但我相信chrome控制台。)
我必须在2个物体上测试碰撞。并检查是否发生了一次或两次碰撞。我试过这段代码:
var result1 = hitTest(player, object1);
var result2 = hitTest(player, object2);
if( result1 || result2 ) { blabla() };
但它不起作用。
现在..我知道js绝对是一种棘手的语言,我想到了一种聪明的方法来做到这一点,而不是写typeof
4次。我正在考虑python短路逻辑运算符......
答案 0 :(得分:2)
您可以使用&&
,如果false/null/undefined/0
或if
为result1
,则会返回第一个检测到的result2
,即null
赢得通过{{1}}。
答案 1 :(得分:1)
对于这类事情,underscore.js很漂亮:http://underscorejs.org/#isNull和http://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(); };