zoukankan      html  css  js  c++  java
  • JavaScript 中 Array.prototype.slice.call(arr, 2) 这样的写法用意是什么?

    看了很多 JavaScript 的源代码,发现很多类似这样的写法

    Array.prototype.slice.call(arr, 2)

    比较不解的是,既然 arr 是数组,为什么不直接这样写呢

    arr.slice(2)

    为什么实例对象本身已经有这个方法,为什么不直接调用,而采用这样的写法?有什么特殊用意吗

    主要原因是为了防止有些对象没有slice方法

    举个例子:

    在javascript里有一种array-like的对象,就是和Array很像,比如拥有push,slice等方法,拥有length属性,而且你可以很容易的创建一个这样的对象:

    var foo = {0:'hello',1:'world',length:2,slice:Array.prototype.slice}

    转变成一个数组对象:

    console.log(Array.prototype.slice.call(foo,0));
        //["hello", "world"]
        console.log(foo.slice())
        //["hello", "world"]

    这里是因为这个像数组的对象拥有这个slice方法,如果没有呢?就不能直接使用,要使用原型的方法调用了。如下:

    console.log(Array.prototype.splice.call(foo,0));
        //["hello", "world"]
        console.log(foo.splice())
        //TypeError: Object #<Object> has no method 'splice'

    常用的arguments对象, document.links, document.forms等都是非常像数组(Array)的,可以使用Array.prototype.slice.call将其转换成数组操作。

    再结合参考这个例子:http://segmentfault.com/q/1010000000774633

  • 相关阅读:
    大数据处理系列之(二)系统过载保护
    大数据处理系列之(一)Java线程池使用
    js实现递归菜单无限层
    treeTable实现排序
    spring-dm 一个简单的实例
    Equinox OSGi服务器应用程序的配置步骤 (支持JSP页面)
    Spring DM 2.0 环境配置 解决Log4j问题
    Spring.DM web开发环境搭建
    STL容器的排序
    排序例子
  • 原文地址:https://www.cnblogs.com/allenda/p/4284738.html
Copyright © 2011-2022 走看看