请问以下代码的弹出值? function testFunction() { var args = Array.prototype.slice.call(arguments, 1, 2); alert(args); } testFunction(1,2,3);
本道题的目的是为了温习三个知识:
- arguments 是一个类数组,但不是一个数组
- 使用Array.prototype.slice 可以将 arguments 转换为一个数组
- slice 方法接受两个参数 start 和 end
使用 Array.prototype.slice 将 arguments 转换为数组可看作是个 hack。我们可以去追根溯源,了解些前因后果。
ECMAScript 规范 94 页对 Array.prototype.slice 有一个备注
The slice function is intentionally generic; it
does not require that its this value be an Array
object.
Therefore it can be transferred to other kinds of
objects for use as a method. Whether the slice
function can be applied successfully to a host object
is implementation-dependent.
Generic 可以理解为 Java 里的泛型 。对数组来说,就是在 JavaScript, 只要一个对象有 length 属性且可用下标的方式取得所包含的元素,那么它就是 Generic 。
所以使用 Array.prototype.slice.call(arguments) 可以得到一个数组, 除 slice 外, 根据测试使用数组的 splice 方法也可以实现类似的效果
Array.prototype.splice.call(arguments, 0, arguments.length)
同时,使用 Array.prototype.slice 时要注意, 第一个参数是 start,第二个参数是 end。 第二个参数可以不指定,那么表示取出全部。但不能为 null 或 undefined,否则将得到一个空数组( 详细 )。
call是什么方法啊?并且在哪些情况才想到要转化为数组呢?(列举一下嘛?我桑拿院的!)
呵呵 我又来了,ECMAScript有没有中文版的规范啊?每次看到你们在讨论js的效率问题的时候 我都好羡慕哦,!
@桑拿院的小伙子 - http://code.google.com/p/ecma-262/ 可以参考这里,最新到第十章,但是项目进展缓慢,导致之前的内容不能保证翻译的十分准确。
to 桑拿院的小伙子:
这里有一部分译文可以参考:
http://code.google.com/p/ecma-262/downloads/list
另外,o'reilly的犀牛书<Javascript权威指南>也是必备的.
虽然我不是很喜欢这种一看就没有视欲的链接,但是我还是由衷的说声:谢谢啊!
同样将arguments作为函数的apply的参数时,并不要先将其变成数组.可以直接fn.apply(null,arguments)