2013-02-19 3 views
0

У меня есть метод hitTest, который проверяет обнаружение столкновений и может возвращать объект Point (если произошло столкновение) или (если нет столкновения) он возвращает null или undefined (я не очень понимаю, когда он возвращает null или undefined, но я доверяю консоли Chrome).проверьте, не определены ли два объекта или нет в JavaScript.

Я должен проверить столкновение на 2 предмета. И проверьте, произошло ли одно или два столкновения. Я пробовал этот код:

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

но он не работает.

сейчас .. Я знаю, что js - это рискованный язык, и я думаю об умном способе сделать это, не записывая typeof 4 раза. Я думаю о питоном коротком замыкании логических операторах ...

+0

'||' возвращает первый найденный 'истинный' и' false', если не 'true' найдено. '&&' возвращает первое найденное 'false' и' true', если не 'false' найдено. – Teemu

+0

спасибо. добавьте его как ответ, и я могу использовать его в качестве правильного ответа. – nkint

+0

Вы хотите, чтобы ваше утверждение if было истинным, если есть (0, не менее 1, 2) столкновений? –

ответ

2

Вы можете использовать &&, он возвращает первый обнаруженный false/null/undefined/0, т.е. if не будет проходить, если либо result1 или result2 является null.

+1

Лучше сказать это: Для '&&' для передачи, ОБА должны быть 'истинными'. Для передачи '||' только один должен быть «истинным». – krillgar

+0

@krillgar Да, если бы мы говорили о 'if'. Я говорил о '&&' operator, который действительно возвращает любой из своих операндов. Хотя исправлен ответ, так как 'if' сам не терпит неудачу ... – Teemu

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:

Логическое И (&&)

выражение1 & & выражение2
Если первый операнд (expr1) может быть преобразован в false, оператор && возвращает false, а не значение expr1.

Логическое ИЛИ (||)

выражение1 || 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(); }; 
Смежные вопросы