这两个JS函数有什么区别?

时间:2016-10-25 15:43:09

标签: javascript

我目前有两个执行相同操作的函数,这是一个名为numbers的函数,如果传递的所有参数都是Number类型,则返回true。否则,该函数应返回false。该函数应该接受任意数量的参数。

所以我做了以下功能:

var numbers = function(numList) {
    for(var i = 0; i < numList.length; i++) {
        if ( typeof numList[i] !== 'number' ) {
           return false;
        }
    }  
    return true;
}

但后来,我找到了另一个解决方案。

var numbers = function() {
    return Array.prototype.filter.call(arguments, function(argument) {
      return typeof argument !== 'number';
    }).length === 0;
}

最后的解决方案虽然更先进,但我想知道这两个功能的优缺点,哪个更好?也许我的解决方案会在某些时候导致一些错误?

5 个答案:

答案 0 :(得分:6)

第一个函数快捷方式,即只要遇到非数字就会返回false。第二个函数总是处理所有输入并在最后决定。

第一个功能效率更高。

答案 1 :(得分:3)

我会选择第一个,原因有三个:

  1. Array.prototype.filter.call看起来很难看。 for循环更加熟悉,因此更易于阅读。
  2. 第一个功能更有效。除了deceze所说的,第二个在函数内部创建一个函数。这需要记忆。虽然在大多数情况下差异不会明显,但仍然不是很有效。
  3. 编辑:如果你想真正高效,你也可以改变这个:

    for(var i = 0; i < numList.length; i++)
    

    ......对此:

    for(var i = 0, l = numList.length; i < l; i++)
    

    这是因为在每次迭代之前评估for循环中的第二个参数。那就是:第一种方式,它在循环的每次迭代之前计算numList.length,而第二种方式只计算一次。

    同样,在大多数情况下,这不会是一个显着的差异,但它是一种拧紧螺丝的方法。

答案 2 :(得分:3)

它们是等价的,但我会使用every函数而不是filter函数来缩短符号:

let numbers = numList => numList.every(x => typeof x === 'number');

答案 3 :(得分:3)

它们是等价的,但是我会使用 some 函数而不是每个函数来缩短符号:

var numbers = numList => !numList.some(x => typeof x !== 'number');

答案 4 :(得分:1)

我觉得第一个更好的解决方案如下:

var numbers = numList.filter(function(a) { return a !== 'number' }

通过这个,您还可以看到我如何使用数组方法Filter。你提供的第二个例子就是这个。它是Array方法的原型。原型就像你在其他语言中获得的类。使用原型可以提供更好的性能,因为它允许更快的对象创建,因此每次实例化对象时都不必创建新的对象。一个很好的例子可以如下

const User = function(name) {
   this.name = name;
 }

 User.prototype.sayHello = function() {
   console.log('Hello ' + this.name)
 }

 const user = new User('Jack')

 user.sayHello()

在此处使用原型可确保始终在原型链中提供sayHello方法。因此,每次实例化此方法时,对象创建要快得多,因为每次都不必重新创建它

你应该在YouTube上观看一个名为FunFunFunction的人,他可能会比我更好地解释一些事情:)