2016-07-31 7 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>

の戻り値の型のチェック:predicateの戻り値の型を確認する方法:

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

} 

私がお聞きしたいですか?

私はこのケースを防ぎたい:その戻り値の型を予測するか、推測する方法はありませんので、

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

ないこれが可能であることを確認してください。 JavaScript関数は、1回の呼び出しで数値を返し、別の呼び出しで文字列を返すことができます。 –

+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'のように" falsey "とみなされても常に結果を返します。したがって、述語を呼び出した結果が偽である場合は、そのまま移動します。 – Soviut

関連する問題