【问题标题】:Use ["sort"](0) to call a function sort?使用 ["sort"](0) 调用函数排序?
【发布时间】:2015-10-16 19:02:40
【问题描述】:

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

[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); 

【问题讨论】:

  • ['sort'].sort 相同

标签: javascript


【解决方案1】:

你要找的可能是

[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);

虽然 reverse 方法不接受任何参数,但与所有 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,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

    所以我们知道Arrays、Array.sortis a functionsort 属性。写[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 方法采用optional comparison function。由于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"]();
    

    相当于:

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

    【讨论】:

      【解决方案3】:

      它的数组内置在原型中。您不必传递任何参数。

      检查论文文件。 Reverse prototype , Sort prototype

      【讨论】:

        【解决方案4】:

        作为一项规则,JavaScript 将允许您处理对象的任何属性(在 JS 中是一个类,如果您使用 ES5 语义,那么它又是一个特殊情况的函数,您很可能是这样)使用点表示法 (classname.funcname()) 或使用括号表示法/JSON 键 (classname['funcname']())。

        这与 ES6 之前的 JS 如何结构化对象有关,关于高阶函数、lambda 和闭包如何发挥作用,可以进行冗长而有趣的讨论,但这是题外话。

        【讨论】:

          【解决方案5】:

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

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

          最简洁的方法(您可能已经知道)是简单地写myList.sort().reverse()

          【讨论】:

            【解决方案6】:

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

            你将 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

            【讨论】:

              猜你喜欢
              • 2021-11-13
              • 1970-01-01
              • 1970-01-01
              • 2012-11-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-04-16
              • 2014-08-09
              相关资源
              最近更新 更多