有人可以向我解释为什么这段代码有用吗?
[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);
答案 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 Array
,Array.sort
,is 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)
它的数组内置原型。你不必传递任何论据。