我是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)
做的是什么吗?
答案 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
等