为什么JavaScript没有最后一种方法?

Nik*_*arg 124 javascript

JavaScript Array类没有提供检索数组最后一个元素的最后一个方法,这有点奇怪.我知道解决方案很简单(Ar [Ar.length-1]),但是,这种情况经常被使用.

任何严重的原因,为什么没有纳入呢?

Álv*_*lez 264

你可以这样做:

[10, 20, 30, 40].slice(-1)[0]
Run Code Online (Sandbox Code Playgroud)

console.log([10, 20, 30, 40].slice(-1)[0])
Run Code Online (Sandbox Code Playgroud)

可以添加到语言的辅助方法的数量是无限的.我想他们只是没有考虑添加这个.

  • 这应该是答案. (35认同)
  • 试图为"接近无限"而投票 (11认同)
  • 为什么?你可以尽可能接近,没有限制:) (10认同)
  • @UpTheCreek,因为您不需要将数组存储到变量中. (7认同)
  • @ÁlvaroG.Vicario这适用于一系列参考文献,但在您的示例中,您正在处理数字.根据MDN doc:"slice将字符串和数字复制到新数组中.对一个数组中字符串或数字的更改不会影响另一个数组." 如果开发人员想要获取引用"array.last"以便对其原始数组中的最后一个元素的值执行某些操作,并且数组值恰好是字符串或数字文字,则此方法将不起作用. (5认同)

Anu*_*rag 82

你自己很容易定义一个.这就是JavaScript的强大功能.

if(!Array.prototype.last) {
    Array.prototype.last = function() {
        return this[this.length - 1];
    }
}

var arr = [1, 2, 5];
arr.last(); // 5
Run Code Online (Sandbox Code Playgroud)

但是,这可能会导致第三方代码出现问题,这些代码(错误地)使用for..in循环来迭代数组.

但是,如果您不受浏览器支持问题的约束,那么使用新的ES5语法来定义属性可以通过使函数不可枚举来解决该问题,如下所示:

Object.defineProperty(Array.prototype, 'last', {
    enumerable: false,
    configurable: true,
    get: function() {
        return this[this.length - 1];
    },
    set: undefined
});

var arr = [1, 2, 5];
arr.last; // 5
Run Code Online (Sandbox Code Playgroud)

  • 请注意,向Array的原型添加属性可能会破坏代码,其中for..in用于迭代数组.使用for..in来迭代一个数组是不好的做法,但它已经做得很好,改变Array的原型也是不好的做法.通常,如果脚本需要使用其他未知代码,则不应更改Object,Array,String,Number,Boolean和Date的原型. (11认同)
  • @no - 谢谢你的提示.我应该提到,将可枚举性设置为false的ES5语法添加的原因正是为了解决`for..in`问题.当然,我们还没有广泛实施ES5,但现在知道浏览器正在迅速赶上它,包括IE9,这已经足够了. (7认同)
  • 对于空列表,`this.length - 1`计算为`-1`,因为它是负数,它被视为数组属性,而不是元素索引. (4认同)

Tri*_*ych 38

因为Javascript变化非常慢.那是因为人们慢慢升级浏览器.

许多Javascript库实现了自己的last()功能.用一个!

  • 至少,您可能需要考虑建议一个提供实现的库.例如,Underscore.js是一个不错的选择.请参见http://documentcloud.github.com/underscore/#last (20认同)
  • @Sean - 我以为我不会在原始海报上推荐特定的Javascript库.谷歌在评估网络对使用哪个库的集体意见方面做得非常好.我为什么要建议一个特定的?确实,为什么你推荐使用underscore.js,这对我来说乍一看似乎非常有味道? (11认同)
  • 我实际上更喜欢下面在库外实现函数的答案.也就是说,作为通过谷歌偶然发现这个问题的人,我建议最佳答案帮助其他人继续寻找解决方案,而不是将其发送到后退按钮. (6认同)
  • 问题是"为什么这个功能不是内置于Javascript"而不是"如何实现此功能".没有理由认为原作者正在寻找如何实际编写自己的`last()`函数.问题是关于Javascript核心语言本身的开发性质. (5认同)
  • 但如果@Nikhil想要知道如何实现它 - 下划线有一个很好的注释源.last()的这个实现是非常强大的,这个作者可能需要更多,但对于库来说非常好.http://documentcloud.github.com/underscore/docs/underscore.html#section-36 (3认同)

Sil*_*ian 26

i = [].concat(loves).pop(); //corn

图标猫喜欢爆米花

  • 警告:这会创建整个列表的副本,只是为了弹出一个元素.在时间和空间上都可能非常浪费.不要这样做. (14认同)

Pab*_*iaz 13

另一种选择,特别是如果你已经在使用UnderscoreJS,将是:

_.last([1, 2, 3, 4]); // Will return 4
Run Code Online (Sandbox Code Playgroud)


med*_*iev 5

Array.prototype.last = Array.prototype.last || function() {
    var l = this.length;
    return this[l-1];
}

x = [1,2];
alert( x.last() )
Run Code Online (Sandbox Code Playgroud)

  • 刚刚返回`这个[L-1]`会给你`undefined`作为正常访问不存在的属性.个人而言,我宁愿JS抛出一个异常,而不是返回`undefined`,但JS喜欢的地毯下扫错误. (3认同)