我一直试图理解这个功能很长一段时间,但这对我来说没有意义。该函数的目标是删除与其他参数编号匹配的参数数组中的任何数字。
为什么有必要对数组进行切片以使函数起作用?
args.splice(0,1)是多余的吗?我把它删除了,没有任何改变。
似乎过滤功能可以完成大部分工作,但我看不出它是如何实际过滤数字的......
function destroyer(arr) {
var args = Array.prototype.slice.call(arguments);
args.splice(0, 1);
return arr.filter(function(element) {
return args.indexOf(element) === -1;
});
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
答案 0 :(得分:4)
让我们逐行完成:
var args = Array.prototype.slice.call(arguments);
JavaScript的arguments
变量类似于数组,但它不是数组。您可以自己尝试:arguments instanceof Array
会给出错误。因此,应用Array原型中的slice
方法只会将arguments
转换为实数数组。
args.splice(0, 1);
这是删除第一个参数,在你的情况下为arr
。
return arr.filter(function(element) {
return args.indexOf(element) === -1;
});
这将遍历arr
中的所有数字,并将检查它们中的每一个是否存在于参数中。当indexOf()
返回-1时,表示在数组中找不到该元素。
答案 1 :(得分:0)
切片不会改变。它返回原始数组中元素的浅表副本。原始数组的元素将复制到返回的数组中。
以此为例
var object = {
'0': 'zero',
'1': 'one',
'2': 'two',
'3': 'three',
'4': 'four',
length: 5
};
var sliced = Array.prototype.slice.call( object, 3 );
['three','four']; //output
答案 2 :(得分:0)
我已添加评论,请查看是否有助于您了解该功能。
function destroyer(arr) {
// arr just holds [1, 2, 3, 1, 2, 3]
var args = Array.prototype.slice.call(arguments);
// args contains nested array with all input params [[1, 2, 3, 1, 2, 3], 2, 3]
args.splice(0, 1);
//args is spliced and we have [2,3] in args
//Filter arr=[1, 2, 3, 1, 2, 3] elements, condition it must not be in args i.e [2,3]
return arr.filter(function(element) {
return args.indexOf(element) === -1;
});
}
destroyer([1, 2, 3, 1, 2, 3], 2, 3);
请参阅以下文档以阅读此函数中使用的参数对象:
https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/arguments
答案 3 :(得分:0)
答案 4 :(得分:0)
要了解正在发生的事情,我们需要了解Function.prototype.call
method。
在您传递给它的第一个参数上调用 Array.prototype.slice
方法,在这种情况下,它是神奇的JS arguments
object,并且然后传递任何参数。
因此Array.prototype.splice
是不必要的,你可以写:
function destroyer(arr) {
var rest = Array.prototype.slice.call(arguments, 1);
return arr.filter(function(element) {
return rest.indexOf(element) === -1;
});
}
事实上,这已经在ES2015 +中使用spread
operator实现,所以你可以这样写:
function destroyer(arr, ...rest) {
return arr.filter(function(element) {
return rest.indexOf(element) === -1;
});
}
答案 5 :(得分:0)
在arr
我们将[1,2,3,1,2,3]
和。{
在args
我们将[[1,2,3,1,2,3],2,3]
过滤器函数循环遍历arr
如果args.indexOf(element)
不在args中,则element
将返回-1。
因此,第一次在循环中元素值为1且内部循环
args.indexOf(1)返回-1,因为args中不存在1,因为在0索引处我们有数组,在第一个索引处我们有2,在第二个索引处我们有3.所以条件=== -1是为true并将1返回到将要打印到控制台的数组。
对于下一个元素,即arr中的2,语句args.indexOf(2)返回存在2的第一个索引,即args数组中的1。同样,整个循环将执行arr