重新实现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));
};