Javascript 每日测试 - 第十期

作者:手气不错 发布时间:July 21, 2008 分类:Javascript

请问以下代码的弹出值?

function testFunction() {
    var args = Array.prototype.slice.call(arguments, 1, 2);
    alert(args);
}

testFunction(1,2,3);

本道题的目的是为了温习三个知识:

  1. arguments 是一个类数组,但不是一个数组
  2. 使用Array.prototype.slice 可以将 arguments 转换为一个数组
  3. 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,否则将得到一个空数组(详细)。

已有 6 条回复

  1. 桑拿院的小伙子 July 21st, 2008 at 09:43 pm #1
    桑拿院的小伙子

    call是什么方法啊?并且在哪些情况才想到要转化为数组呢?(列举一下嘛?我桑拿院的!)

  2. 桑拿院的小伙子 July 21st, 2008 at 09:46 pm #2
    桑拿院的小伙子

    呵呵 我又来了,ECMAScript有没有中文版的规范啊?每次看到你们在讨论js的效率问题的时候 我都好羡慕哦,!

  3. Lunatic Sun July 21st, 2008 at 10:39 pm #3
    Lunatic Sun

    @桑拿院的小伙子 - http://code.google.com/p/ecma-262/ 可以参考这里,最新到第十章,但是项目进展缓慢,导致之前的内容不能保证翻译的十分准确。

  4. comehope July 21st, 2008 at 10:53 pm #4
    comehope

    to 桑拿院的小伙子:



    这里有一部分译文可以参考:

    http://code.google.com/p/ecma-262/downloads/list



    另外,o'reilly的犀牛书<Javascript权威指南>也是必备的.

  5. 桑拿院的小伙子 July 22nd, 2008 at 01:01 am #5
    桑拿院的小伙子

    虽然我不是很喜欢这种一看就没有视欲的链接,但是我还是由衷的说声:谢谢啊!

  6. welefen October 11th, 2008 at 02:46 am #6
    welefen

    同样将arguments作为函数的apply的参数时,并不要先将其变成数组.可以直接fn.apply(null,arguments)

添加新回复

Yahoo 统计