JavaScript: функции, переданные в качестве параметра в блок if - PullRequest
2 голосов
/ 26 августа 2010

В приведенном ниже коде как пропускная черта как

 function (n) { return n; } 

для foo оценивается как true в блоке if?

 function foo(bar) {

    if (bar) {
       // true
    } else {
       // false
    }
 }

Это меня озадачило, поэтому любая помощь очень ценится.

Ответы [ 4 ]

6 голосов
/ 26 августа 2010

Если bar привязан к анонимной функции, то это объект.Объекты являются «правдивыми» в JavaScript.

Единственные значения в JavaScript, которые являются «ложными»:

  • false
  • null
  • undefined
  • '' (пустая строка)
  • 0 (ноль как число)
  • NaN

Все остальное является «правдивым», включая объекты функций.

Если бы вы хотели вызвать анонимную функцию, вы бы сделали if (bar(5)), которая бы вызывала вашу анонимную функцию с аргументом 5.Тогда ваша анонимная функция вернет n (в данном случае 5).Поскольку 5 не является ложным объектом, это также относится к ветви true.Выполнение if (bar(0)) дойдет до ветви else, потому что 0 - ложь.

5 голосов
/ 26 августа 2010

Все, что не null, 0, false, пустая строка или undefined будет оцениваться до true в операторе if(something), так работает слабая типизация в JavaScript. 1007 *

Если вам нужна более конкретность, вы можете обратиться к оператору typeof , чтобы проверить ожидаемый тип, или использовать другую более строгую проверку, например:

if(bar === true) {

Использование === проверяет эквивалентность типов и .

0 голосов
/ 26 августа 2010

Всегда возвращается true, потому что bar не равен нулю.если выражение в операторе if не является логическим выражением (например, if (x <7)), тогда выполняется проверка на нулевое значение.Если он равен null, он возвращает false, в противном случае - true. </p>

В вашем примере вы определили bar как функцию {возвращает n;}, поэтому ваш оператор if оценивается как true.

Если bar возвращает bool (true или false), вам нужно вызвать функцию и получить результат, а не передавать ссылку на функцию - это делается с помощью скобок:

var exampleA = bar(false); // executes function bar and returns the result (false) in exampleA
var exampleB = bar; // stores a reference to the function bar in variable exampleB
0 голосов
/ 26 августа 2010

Вы можете использовать typeof (), если хотите знать, какой тип он возвращает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...