使用[“sort”](0)调用函数排序?

时间:2015-07-26 15:35:29

标签: javascript

有人可以向我解释为什么这段代码有用吗?

[1,4,5,6,7,2,3]["sort"](0); //[1, 2, 3, 4, 5, 6, 7]

我不太了解这里的语法。同时,为什么我不能像这样选择排序或反向执行?无论索引是什么,看起来总是会做反向。

[1,4,5,6,7,2,3]["sort","reverse"](0); 

6 个答案:

答案 0 :(得分:6)

让我们一步一步地细分你的代码。

[1,4,5,6,7,2,3]

这是一个数组文字。也就是说,写[1,4,5,6,7,2,3]有点像说new Array(1,4,5,6,7,2,3)。简单地说,数组文字计算到具有所描述内容的新数组。

[1,4,5,6,7,2,3]["sort"]

现在这一点很有意思,因为知道[]创建数组文字让我们认为["sort"]也是一个数组文字。不完全 - 这是Javascript 括号表示法的示例,我们使用语法someObject["propertyName"]访问前一个对象的属性,相当于someObject.propertyName。查看this SO answer for more info on bracket notation

因此,我们知道sort s ArrayArray.sortis a function[1,4,5,6,7,2,3]["sort"]属性。写([1,4,5,6,7,2,3]).sort就像说[1,4,5,6,7,2,3]["sort"](); 。要调用函数,我们使用括号和我们想要的参数:

([1,4,5,6,7,2,3]).sort();

这就像说0

现在,在您的代码中,您传递了Array.sort作为0的参数。但是,这个sort实际上对排序结果没有影响!那是因为数组的0方法需要optional comparison function。由于Array.sort不是函数,[1,4,5,6,7,2,3]["sort"](0);将忽略它。实际上,在Firefox控制台中,运行TypeError: invalid Array.prototype.sort argument会为我们提供[1,4,5,6,7,2,3]["sort"]()["reverse"]();

总而言之,我们可以通过以下方式改变我们的结果:

([1,4,5,6,7,2,3]).sort().reverse();

相当于:

rs2 = stmt.executeQuery(query);

答案 1 :(得分:2)

您正在寻找的可能是

[1,4,5,6,7,2,3]["sort"]();

[1,4,5,6,7,2,3]["sort"]()["reverse"]();

(本回答结尾处的另一种选择)

当你真正这样做时

[1,4,5,6,7,2,3]["sort","reverse"](0);

首先评估"sort","reverse"(参见https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/Comma_Operator)并返回“反向”。你有效地

[1,4,5,6,7,2,3]["reverse"](0);

[1,4,5,6,7,2,3].reverse(0);

虽然反向方法不接受任何参数,但像所有Javascript函数一样,如果你传入额外的参数(它忽略了它),它并不介意。所以这是有效的

[1,4,5,6,7,2,3].reverse();

返回[3,2,7,6,5,4,1]

你可能想要的是

[1,4,5,6,7,2,3][["sort","reverse"][0]]();
[1,4,5,6,7,2,3][["sort","reverse"][1]]();

分别调用sort和reverse

答案 2 :(得分:1)

可以使用方括号中的名称访问JavaScript中对象的任何成员。您以这种方式访问​​函数“sort”,然后调用它。 JavaScript也不关心你是否为函数提供了一个未使用的参数。它只会忽略这个论点。

如果您尝试提供字符串列表以访问成员,JavaScript可能会做一些奇怪的事情,只是为了能够做出决定并恢复。不要在上面使用列表。只需调用第一个返回数组的函数,然后调用第二个函数。

最干净的方式(您可能已经知道)就是简单地写myList.sort().reverse()

答案 3 :(得分:1)

通常,JavaScript会让你解决一个对象的任何属性(在JS中是一个类,如果你正在使用ES5语义,你很可能是一个特殊情况函数,你最有可能)使用点表示法(classname.funcname())或使用括号表示法/ JSON键(classname['funcname']())。

这与在ES6之前JS结构对象的方式有关,关于高阶函数和lambdas和闭包如何发挥作用的冗长而有趣的讨论,但这是一个题外话。

答案 4 :(得分:0)

将数组视为包含属性排序的对象。

将0传递给函数,但函数不使用此数字

[1,4,5,6,7,2,3]["sort"](0); //[1, 2, 3, 4, 5, 6, 7]

这与

相同
var a=[1,4,5,6,7,2,3];
a.sort();

[1,4,5,6,7,2,3]["sort","reverse"](0); 

相同
var a=[1,4,5,6,7,2,3];
a.reverse();

将数组视为包含属性排序的对象。 你拿t

答案 5 :(得分:-1)

它的数组内置原型。你不必传递任何论据。

检查文件。 Reverse prototypeSort prototype