javascript - 关于JQ源码中toArray的实现,有个问题不明白
PHP中文网
PHP中文网 2017-04-11 11:52:54
[JavaScript讨论组]

明白JQ源码将原生数组的方法slice赋给了变量core_slice,然后在toArray方法里,直接return core_slice.call(this)。这里的this应该是JQ对象实例,而JQ对象实例本身又不是数组,是个类似数组的JSON,比如找到通过$找到一堆class元素,console打印出来这个$对象是样子的:

然后直接调用数组的slice方法怎么可能会有这样的结果

slice方法不是截取数组中的某一段元素的吗,而且,调用slice方法的是JQ这个对象实例,这个实例又不是数组,里面还有length等属性,怎么就被slice方法调用时直接忽略掉的?

PHP中文网
PHP中文网

认证高级PHP讲师

全部回复(2)
黄舟
  1. 这里的slice方法就是为了把你的c变成真正的数组

  2. 现在c不是真正的数组,所以为了引用slice方法,所以只能找个真正的数组,[]就是起这个作用的。

  3. 至于引用slice的到底是类原型还是实例其实没多大区别,因为你后面都要call来改变上下文的。
    如果你觉得[]不太好理解,那么这里改成Array.prototype.slice.call()是不是就清楚了?

  4. jq源码中用arr = []的原因有两个,一个是用变量代替之后,压缩代码的时候就能直接替换变量名字了,这样就能节省更多的空间,还有一个是避免操作中无意修改了Array原型的情况,操作起来更安全。

  5. 关于slice方法的原理,这种问题去翻规范,里面写的很清楚。

  6. 简单提一下,slice虽然是截取没错,但实际上是在过程中创建了一个新的数组,然后将旧数组中把被截取的部分浅复制一份,再把复制出来的元素放到新的数组中并返回。

  7. 关键就在于,当输入的(start, end)两个参数都是缺省的时候,将会自动变为start = 0; end = this.length;

  8. 所以,这里的[].slice(c),实际上就是把c这个类似数组但并不是数组的东西转变成真正的数组。唔……这么说也不太准确,准确的来说,c本身并没有变化,只是返回了一个新的数组,里面的元素和c数组中下标从0c.length - 1内的元素相等,其余别的属性并没有复制。

阿神

怎么感觉你的问题就是答案啊。
类数组没有slice方法,所以才去用call方法借用原生数组的slice方法啊

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号