重新实现Array.prototype.slice的JavaScript谜题未按预期工作
JavaScript puzzle to reimplement Array.prototype.slice not working as expected
这不是面试用的,别担心:)
我很好奇为什么这两个函数的返回方式不同:
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
和undefined
?
在redundantSlice1
中,.join( )
默认情况下会将参数转换为以,
为分隔符的字符串。因此,对于您的样品,声明
Array.prototype.slice.call( arguments ).slice( 1 ).join( )
实际上"1,2"
不是你所期望的[ 1, 2 ]
。
除此之外,您只向.slice( )
传递了一个参数。为了匹配redundantSlice2
的行为,必须使用.apply( )
。
var redundantSlice1 = function() {
var firstArg = arguments[ 0 ];
return Array.prototype.slice.apply(
firstArg,
Array.prototype.slice.call( arguments, 1 )
);
};
如果你想这样做,你可以传递一个数组或类似数组的对象,并获得相同的结果
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));
};
相关文章:
- 在表单提交将DOM的一部分替换为分部之后,我应该将ajax成功绑定到什么来使我的javascript工作
- 我可以'不要让Javascript工作不正常
- 如何让我的html5功能不兼容警告使用javascript工作
- Excel Web Services 电子邮件 JavaScript 工作表
- 用于Google Fusion Table层的Javascript工作,但试图整理代码
- Bootstrap:如何附加一个类,并且仍然有BS Javascript工作
- JavaScript 工作队列
- JavaScript工作,直到我添加这个&&陈述
- 为什么不'在CasperJS中没有简单的JavaScript工作
- 如何"递归AJAX回调”;在JavaScript工作中
- 基本验证javascript工作不正常
- 需要帮助让这个字符串的Javascript工作
- HTML和JavaScript工作不正常
- 下拉菜单无法从CSS或Javascript工作
- 需要从erb生成一个非常特定的html来让javascript工作
- 如果javascript代码段未使用,它将阻止其他javascript工作
- 将内联事件处理程序移动到chrome扩展的javascript工作表
- 阻止其他Javascript工作的Javascript
- iframe阻止javascript工作
- 无法获取切换函数(JavaScript工作)