0

我有一个方法 hitTest 可以检查碰撞检测并可以返回一个 Point 对象(如果发生碰撞)或(如果没有碰撞)它返回nullundefined(我还没有深入了解它何时返回 null 或 undefined 但我相信铬控制台)。

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

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

但它不起作用。

现在..我知道 js 确实是一种棘手的语言,我想了一个聪明的方法来做到这一点,而无需编写typeof4 次。我正在考虑python短路逻辑运算符...

4

3 回答 3

2

您可以使用&&,它返回第一个检测到的false/null/undefined/0,即if不会通过,如果result1要么result2null

于 2013-02-19T19:25:48.233 回答
1

对于这种类型的东西,underscore.js 很漂亮: http ://underscorejs.org/#isNull 和 http://underscorejs.org/#isUndefined

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

于 2013-02-19T19:26:54.357 回答
1

你不需要写typeof4 次,但无论如何;

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

//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:

逻辑与 ( &&)

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

逻辑或 ( ||)

expr1 || expr2 返回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

此外,您可以使用isset()类似于 PHP 中的快捷方法来正确验证您的对象:

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

所以; 你的代码是:

var result1 = hitTest(player, object1),
    result2 = hitTest(player, object2);
if ( isSet(result1) && isSet(result2) )  { blabla(); };
于 2013-02-19T19:39:11.233 回答