slice.call()在get()jquery函数中做什么

时间:2015-06-22 17:53:47

标签: javascript jquery

我是jquery的新手,基本上,我只是在查看jquery中get()函数的来源,它看起来像下面的那样(Jquery 11.1.3):

get: function( num ) {
    return num != null ?

        // Return just the one element from the set
        ( num < 0 ? this[ num + this.length ] : this[ num ] ) :

        // Return all the elements in a clean array
        slice.call( this );
},

现在我理解了这个函数的大部分内容,我已经使用了对js的基本理解来理解这个函数正在做什么,并且我认为是什么,return语句是一个三元运算符,它将检查{{1} }是一个负数或正数(即num <0),并将结束给定条件,

如果num为负数,则返回num,如果不是

this[ num + this.length ]

将被退回,好的,公平的,现在是什么部分:

this[ num ]

在这个功能中做什么?

我假设它正在将一个对象转换为一个数组,只要你传递一个对象而不是一个纯数组,我做了以下函数来证明我自己的观点:

slice.call( this );

正如您所看到的,function get(elem) { return Array.prototype.slice.call( elem ); } obj = { 'name' : 'putin', 'sname' : 'valdimar' } var str = get(obj); console.log(str); // returns empty array. 是一个空数组,而不是一个转换为纯数组的对象。所以我想我错过了一些非常微不足道的东西,但是现在有人可以详细说明并理解jquery中str方法中slice.call(this)做的是什么吗?

2 个答案:

答案 0 :(得分:4)

您的评估是正确的。 jQuery对象是一个类似于数组的对象,get正在将jQuery对象转换为真正的数组。这在文档中有概述。

对于slice处理数组以外的对象,该对象必须具有整数的属性键。它还必须具有length属性:

Array.prototype.slice.call({ 0: 'foo', 1: 'bar', length: 2 })
// yields ['foo', 'bar']

或者更有趣的是:

Array.prototype.slice.call({ 45: 'foo', 47: 'bar', length: 48 })
// [undefined × 45, "foo", undefined × 1, "bar"]

答案 1 :(得分:2)

slice.call( this );只是强制输出为数组,而不是类似数组的对象。

如果您查看整个来源,slice就是这样:

var slice = Array.prototype.slice;

如果你回想一下,每个jQuery对象本身都是一个类似于数组的对象&#34;,以及NodeLists等。在get中,他们希望确保输出实际上是Array

例如,如果您有NodeList,jQuery对象或普通对象,并执行Array.prototype.slice.call(whateverObject),则会强制它成为实际的Array对象,并且您可以访问Array.prototype的方法,例如forEach