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