为什么我可以使用数组索引运算符从jQuery Object访问HTMLElement?

时间:2016-07-27 08:50:55

标签: javascript jquery prototype

正如我测试的那样,In [221]: out[:,unqID.argsort()] Out[221]: array([[ 1. , 1. , 1. , 1. , 1. , 1. ], [ 0.5, 1. , 2.5, 4. , 2. , 3.5], [ 1. , 1.5, 3. , 4.5, 2.5, 4. ], [ 228. , 307. , 170.5, 452. , 351. , 396. ]]) $('foo')的实例,而不是jQuery的实例。和AFAIK,javascript没有运算符重载。

那么如果Array不是$('foo')[0]的实例,HTMLElement如何返回相应的$('foo')

我试着看看jQuery的源代码,但现在对我来说有点太多了。

感谢您的任何见解。

1 个答案:

答案 0 :(得分:7)

因为您可以在JavaScript中使用括号表示法与任何对象,而不仅仅是数组。实际上,JavaScript中的普通数组aren't really arrays at all,它们只是具有特定原型的对象,并且对一类属性名称(“数组索引”)和特殊length属性进行特殊处理。

括号表示法可用于通过其字符串名称访问任何对象属性 1 (无论信不信,[0]在访问数组时转换为["0"],理论)。

示例:

var obj = {foo: "bar", 0: "zero"};
console.log(obj[0]);     // zero
console.log(obj["0"]);   // zero
console.log(obj.foo);    // bar
console.log(obj["foo"]); // bar
var f = "f" + "o" + "o";
console.log(obj[f]);     // bar

上面的对象有两个属性。他们的名字是"0""foo";这两个名字都是字符串(即使我在初始化程序中将0写为数字文字;它会被强制转换为字符串)。

jQuery维护其“数组条目”属性,以确保您可以使用括号表示法来访问它们。它还保留length属性。

如果今天从头开始编写jQuery,它可能会扩展Array。但是当编写jQuery时,无法扩展Array。 (从ES2015(“ES6”)class功能开始,它才成为可能。)

1 没有字符串名称的属性外; ES2015引入了名称为Symbol而非字符串的属性概念。在此之前,所有对象属性名称都是字符串(甚至是数组索引)。