在JavaScript中使用Array.at(index)而不是Array[index]

11

我有一个关于Array.at()方法的问题,这个方法在 Array.prototype.at() - MDN中介绍。它似乎比使用方括号标记arr[i]更加实用,因为它提供了指定从数组末尾开始的索引的选项,例如:arr.at(-1)将返回arr数组中的最后一个成员。此外,它似乎更适合于方法链式调用。切换到这种方法是否有任何缺点呢?


1
我很好奇它如何“更适合方法链”,我没有看到 foo[n].someFn()foo.at(n).someFn() 之间有任何实质性的区别(除了额外的字符)。真正的优势只在于 at(-1),而据我所知,它也可以折叠成方括号语义。 - Dave Newton
proposal-relative-indexing-method repo readme中,Possible issues只包含一个条目——_也可能由于尚未知的原因与Web不兼容_。如果您想深入了解问题,可以通过链接获取更多信息。 - Nikita Skrebets
并不是最有用的方法。我能看到的唯一优点就是你的代码会更短,也许更清晰。所以,你只需要写arr.at(-2)而不是arr[length-2] - Reza Saadati
5个回答

9

这种方法有一些缺点:

  • 它是一种非常新的方法。如果您使用它,旧版浏览器将无法理解您的代码,除非您包含一个polyfill - 所以请确保您包含一个polyfill。
  • 完全不同的是,由于它是一种如此新的方法,我不会感到惊讶,如果有相当数量的开发人员没有听说过它-使用.at可能会使一些人感到困惑(并导致他们不得不查找)。这并不意味着您不应该使用它,但这是要牢记的一点。

7
第二点实际上是一个积极的方面。 - jsejcksn
对于阅读代码的开发人员来说,如果他们足够聪明去查找相关信息,这可能对该开发人员有好处,但对于代码库来说可能不是一件好事(至少在接下来的几个月内,因人而异),因为它可能会稍微模糊那些还没有听说过.at的人的意思 - 而且问题似乎是从代码库的角度出发的。例如,很多人在2015年对箭头函数感到困惑。 - CertainPerformance
1
如果在语法简单易懂和更加复杂的语法之间做出选择,而50%的读者可能需要先查阅才能理解后者,那么我会更喜欢简单版本,除非更复杂的版本对于当前情况没有提供任何额外有用的功能。 - CertainPerformance
1
许多人在2015年对箭头函数感到困惑,例如。许多Stack Overflow的问题证明了许多人在2021年仍然对箭头函数感到困惑(毫无疑问,在2022年仍然如此)! - Robin Zigmond
不支持Internet Explorer,Opera Android和Safari on iOS。 - Reza Saadati
不知道是否与问题相关,但您不能使用它来更新数组值。 - cmgchess

0

另一个缺点是代码可以重新定义此函数。这可能会带来安全隐患。

Array.prototype.at = () => console.log(""); 

2
那我们就不应该使用JavaScript了吗?你用JavaScript做的一切都是可重新定义的。禁止所有Web API! - Antoni Silvestrovič
@AntoniSilvestrovič 首先,上面的文本并没有暗示你所说的内容。其次,并不是 JavaScript 中的所有东西都被重新定义了。 - maksimr
并非每个Web API都是可重新定义的,但“你使用JavaScript所做的一切都是可重新定义的”。您可以对JavaScript中存在于您编写的所有内容中的许多函数做出相同的陈述,此时我们回到使用服务器端语言。不要忘记,可以重新定义Array.prototype.at的代码也可以重新定义您的代码。安全问题不在于恶意代码修改.at,而在于它首次如何进入您的浏览器。有人如何能够修改您的原型? - Antoni Silvestrovič

0

我不会将它列为一个缺点,但是新的开发人员可能不明白Array.prototype.at()仅用于检索。它不能用于赋值,而array[array.length-1]可以。


-1

我想只有改进。类似于 Python 代码,JS 现在可以使用索引 -1 来查看数组的最后一个元素。

a = [1,2,3]
a[a.length-1] # 3

或者

a.at(-1) #3

-1

目前,Array.at()方法正在进行实验,随着全球开发人员的测试和漏洞创建,它可能会发生变化。

虽然如此,您可以使用polyfill,这样任何未来对实验的更改都不会影响您的代码,也不会导致其崩溃。

此外,该方法可能适用于()和[],这是一件相当令人困惑的事情。在Mozilla官方文档中提到:这并不意味着使用方括号表示法有任何问题。

因此,现在不建议使用array.at。

enter image description here


1
"目前正在进行实验中"。嗯?你从哪里得来的这个? - charlietfl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接