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

Joh*_*hen 0 javascript

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

[1,4,5,6,7,2,3]["sort"](0); //[1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)

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

[1,4,5,6,7,2,3]["sort","reverse"](0); 
Run Code Online (Sandbox Code Playgroud)

hea*_*dge 6

让我们一步一步地分解您的代码.

[1,4,5,6,7,2,3]
Run Code Online (Sandbox Code Playgroud)

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

[1,4,5,6,7,2,3]["sort"]
Run Code Online (Sandbox Code Playgroud)

现在这一点很有趣,因为知道[]创建数组文字使我们认为["sort"]也是一个数组文字.不完全 - 这是Javascript 括号表示法的一个示例,我们使用语法访问前面对象的属性someObject["propertyName"],相当于someObject.propertyName.有关括号表示法的更多信息,请查看此SO答案.

所以我们知道s 的sort属性,是一个函数.写就像是在说.要调用函数,我们使用带有我们想要的参数的括号:ArrayArray.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"]();
Run Code Online (Sandbox Code Playgroud)

这就像说([1,4,5,6,7,2,3]).sort();.

现在在你的代码中,你已经传入了一个0作为参数Array.sort.但是,这0实际上对排序结果没有影响!那是因为sort数组的方法采用了可选的比较函数.由于0不是一个功能,Array.sort将简单地忽略它.事实上,在Firefox控制台中,运行[1,4,5,6,7,2,3]["sort"](0);给了我们一个TypeError: invalid Array.prototype.sort argument.

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

[1,4,5,6,7,2,3]["sort"]()["reverse"]();
Run Code Online (Sandbox Code Playgroud)

相当于:

([1,4,5,6,7,2,3]).sort().reverse();
Run Code Online (Sandbox Code Playgroud)