Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重新实现Array.prototype.slice的JavaScript难题未按预期工作_Javascript_Arrays - Fatal编程技术网

重新实现Array.prototype.slice的JavaScript难题未按预期工作

重新实现Array.prototype.slice的JavaScript难题未按预期工作,javascript,arrays,Javascript,Arrays,这不是求职面试,别担心:) 我很好奇为什么这两个函数返回的结果不同: var redundantSlice1 = function() { return arguments[0].slice(Array.prototype.slice.call(arguments).slice(1).join()) }; var redundantSlice2 = function() { return arguments[0].slice(1,2) }; redundantSlice1([

这不是求职面试,别担心:)

我很好奇为什么这两个函数返回的结果不同:

var redundantSlice1 = function() {
    return arguments[0].slice(Array.prototype.slice.call(arguments).slice(1).join())
};

var redundantSlice2 = function() {
    return arguments[0].slice(1,2)
};

redundantSlice1([1,2,3], 1, 2) // [1,2,3]

redundantSlice2([1,2,3], 1, 2) // [2]
redundantSlice2
返回我期望的结果,但是
1,2
是硬编码的,这是我试图避免的


为什么第一个函数有我所期望的
1,2
作为
未定义的

redundantSlice1
中,
。join()
将参数转换为字符串,默认情况下,
作为分隔符。因此,根据您的样本,声明

Array.prototype.slice.call( arguments ).slice( 1 ).join( )
实际上是
“1,2”
并不像您期望的那样
[1,2]

除此之外,您只需将一个参数传递给
.slice()
。为了匹配冗余切片2的行为,必须使用


如果要这样做,可以传递一个数组或类似数组的对象,并得到相同的结果

var redundantSlice1 = function(array, begin, end) {
    return Array.prototype.slice.call(array, begin, end)
};
这将适用于传入的1、2或3个参数,与Array.slice的工作方式完全相同

如果您坚持分割参数,并且没有函数的“形式参数”

var redundantSlice1 = function() {
    return Array.prototype.slice.apply(arguments[0], Array.prototype.slice.call(arguments, 1));
};

.join
返回一个字符串。因此,第一个示例相当于
arr.slice(“1,2”)
。这与
arr.slice(1,2)
非常不同。我不确定
.slice
是如何处理无效参数的(显然它将其视为
0
或未传递任何内容)。是的,这就是我发现的。我通过
null
undefined
得到了相同的结果。答案可能是:)您需要查看
函数。apply
-但是由于slice只接受0、1或2个参数,我会将包装函数定义为
函数(数组,开始,结束)
,然后简单地返回
[].slice.call(数组,开始,结束)
-这就像你所写的一样是一个重新实现。我不想泄露的问题还有更多的限制,但@FelixKling回答了我最初的问题。这是一个字符串。这可能也可以通过
参数[0]来完成。切片(参数[1],参数[2])
。如果
参数[0]
是“数组式”的呢?@FelixKling Yep,我只是与OP的方法保持一致。
var redundantSlice1 = function() {
    return Array.prototype.slice.apply(arguments[0], Array.prototype.slice.call(arguments, 1));
};