我目前有两个执行相同操作的函数,这是一个名为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;
}
最后的解决方案虽然更先进,但我想知道这两个功能的优缺点,哪个更好?也许我的解决方案会在某些时候导致一些错误?
答案 0 :(得分:6)
第一个函数快捷方式,即只要遇到非数字就会返回false
。第二个函数总是处理所有输入并在最后决定。
第一个功能效率更高。
答案 1 :(得分:3)
我会选择第一个,原因有三个:
Array.prototype.filter.call
看起来很难看。 for
循环更加熟悉,因此更易于阅读。deceze
所说的,第二个在函数内部创建一个函数。这需要记忆。虽然在大多数情况下差异不会明显,但仍然不是很有效。编辑:如果你想真正高效,你也可以改变这个:
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的人,他可能会比我更好地解释一些事情:)