2016-07-31 147 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'被認爲是'falsey'就像'false'和'null'一樣。所以如果調用謂詞的結果是錯誤的,那就繼續前進。 – Soviut