2016-07-31 3 views
0

Проверка типа возвращаемого предиката

Array.prototype.takeWhile = function (predicate) { 
 
    'use strict'; 
 
    var $self = this 
 
    if (typeof predicate === 'function') { 
 
     let flagged = false, matching_count = 0, nomatching_count = 0; 
 
     for (let i = 0; i < $self.length; i++) { 
 
      let e = $self[i] 
 
      if (predicate(e)) { 
 
       if (!nomatching_count) { 
 
        matching_count++ 
 
       } else { 
 
        flagged = true 
 
        break 
 
       } 
 
      } else { 
 
       nomatching_count++ 
 
      } 
 
     } 
 
     return !flagged ? $self.slice(0, matching_count) : $self 
 
    } 
 
    throw new TypeError('predicate must be a function') 
 
}; 
 

 
var test = function() { 
 
    var array = [1, 2, 3, 4, 5]; 
 
    alert(array.takeWhile(x => x <= 3)) 
 
};
<button onclick="test()">Click me</button>

После условия:

if (typeof predicate === 'function') { 

} 

Я хочу спросить: как проверить тип возвращаемого predicate?

Я хочу, чтобы предотвратить этот случай:

var array = [1, 2, 3, 4, 5]; 
alert(array.takeWhile(function() {})); 
+0

Не уверен, что это возможно. Функция JavaScript могла возвращать число при одном вызове и строку для другого вызова. –

+0

Зачем вам это нужно? Другие методы массива не имеют никакой проверки. – Soviut

+0

@Soviut В сообщении говорится: 'предикат должен быть функцией', а' function() {} '- это функция без какого-либо типа возврата. –

ответ

3

функции Javascript может вернуть что-либо, так что нет никакого способа предсказать или выводя их тип возвращаемого значения. Единственный способ определить тип возвращаемого - запустить функцию и проверить тип результата.

var result = predicate(e); 
if (typeof result === 'undefined') { 
    throw 'Invalid predicate' 
} 

Обратите внимание, что тип возвращаемого значения функции может быть undefined, что и пустая функция будет возвращать.

Однако это кажется излишним, поскольку встроенные методы массива не имеют никакой проверки на этот вид случая кромки. Например, [1,2,3].filter(function() {}); метод Array.filter() возвращает пустой массив, потому что предоставленная функция (предикат) никогда не возвращает true в отношении любых элементов в массиве.

console.log([1,2,3].filter(function() {}));

+0

Прошу прощения. Вы имеете в виду, что некоторые недопустимые случаи могут быть проигнорированы, потому что нет необходимости (или нет необходимости) проверять, не так ли? Хм ... Итак, что это такое автоматически? Что нет? –

+0

Да, предикат всегда возвращает результат, даже если это пустая функция, а 'undefined' считается« ложным », как« false »и« null ». Поэтому, если результат вызова предиката является ложным, тогда просто продолжайте движение. – Soviut

Смежные вопросы