Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么';你没有最后一个方法吗?_Javascript - Fatal编程技术网

Javascript 为什么';你没有最后一个方法吗?

Javascript 为什么';你没有最后一个方法吗?,javascript,Javascript,JavaScript数组类不提供最后一个方法来检索数组的最后一个元素,这有点奇怪。我知道这个解决方案很简单(Ar[Ar.length-1]),但是,这个方法使用得太频繁了 有没有什么重要的原因可以解释为什么还没有合并 自己定义一个很容易。这就是JavaScript的强大功能 if(!Array.prototype.last) { Array.prototype.last = function() { return this[this.length - 1]; }

JavaScript数组类不提供最后一个方法来检索数组的最后一个元素,这有点奇怪。我知道这个解决方案很简单(Ar[Ar.length-1]),但是,这个方法使用得太频繁了


有没有什么重要的原因可以解释为什么还没有合并

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

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

var arr = [1, 2, 5];
arr.last(); // 5
但是,这可能会导致第三方代码出现问题,这些代码(错误地)使用
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

因为Javascript变化非常缓慢。这是因为人们升级浏览器的速度很慢


许多Javascript库实现自己的
last()
函数。用一个

您可以这样做:

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

x = [1,2];
alert( x.last() )
[10, 20, 30, 40].slice(-1)[0]

console.log([10,20,30,40].slice(-1)[0])
亲自来这里寻找这个问题的答案。切片答案可能是最好的,但我继续创建了一个“last”函数,只是为了练习扩展原型,所以我想我会继续并分享它。与其他一些方法相比,它还有一个额外的好处,那就是允许您有选择地在数组中倒数,并提取(比如)倒数第二项或倒数第三项。如果不指定计数,它将默认为1并提取最后一项

Array.prototype.last = Array.prototype.last || function(count) {
    count = count || 1;
    var length = this.length;
    if (count <= length) {
        return this[length - count];
    } else {
        return null;
    }
};

var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.last(); // returns 9
arr.last(4); // returns 6
arr.last(9); // returns 1
arr.last(10); // returns null
Array.prototype.last=Array.prototype.last | |函数(计数){
计数=计数| | 1;
var length=这个.length;
if(count
i=[].concat(loves).pop();//玉米


图标猫喜欢爆米花

这里有另一种更简单的方法来切割最后的元素

 var tags = [1, 2, 3, "foo", "bar", "foobar", "barfoo"];
 var lastObj = tags.slice(-1);
lastObj
现在是
[“barfoo”]

Python也是这样做的,当我尝试使用JS时,我猜脚本语言中的字符串操作也是这样

类似地,如果希望数组中的最后两个对象

var lastTwoObj = tags.slice(-2)

将为您提供
[“foobar”,“barfoo”]
等等。

另一个选项,特别是如果您已经在使用下划线,将是:

_.last([1, 2, 3, 4]); // Will return 4
pop()
方法将弹出最后一个值。但问题是您将丢失数组中的最后一个值

是的,或者只是:

var arr = [1, 2, 5];
arr.reverse()[0]


如果您想要的是值,而不是新列表。

尝试对“接近无穷大”进行否决投票为什么?您可以随心所欲地接近,没有限制:)这个应该是答案。@UpTheCreek,因为您不需要将数组存储到变量中。@lvaroG.Vicario这对于引用数组来说很好,但在您的示例中,您使用的是数字。根据MDN文档:“切片将字符串和数字复制到新数组中。对一个数组中的字符串或数字的更改不会影响另一个数组。”“如果开发人员希望获得引用”array.last“为了处理原始数组中最后一个元素的值,而数组值恰好是字符串或数字文字,此方法将不起作用。对于[]。last()应该有什么合适的输出?”?
null
undefined
?可能未定义以保持其语言一致性。null我认为-因为您有一个定义良好的数组-只是其中没有有效的对象。undefined应该仅在调用的容器上未定义最后一个“属性”时使用。仅返回
此[l-1]
将为您提供
未定义的
,这对于访问不存在的属性来说是正常的。就个人而言,我宁愿JS抛出一个异常,而不是返回
未定义的
,但JS更喜欢将错误隐藏起来。对于您不介意将数组更改为副作用的情况(即数组只是暂时的),习惯用法是
item=array.pop();
。这里有许多提到的方法的性能基准:天哪,在查看perf页面后,似乎
array[array.length-1]
比其他方法快得多。@JondIm但如果在函数中创建数组,则需要为其创建本地名称(这会导致诸如arr2之类的名称),并且您有两行代码,而不是一行代码(Ar[Ar.length-1])
让我的性能提高了20倍。请注意,向数组的原型添加属性可能会破坏代码,其中for..in用于迭代数组。使用for..in迭代数组是一种不好的做法,但通常情况下,更改数组的原型也是一种不好的做法。通常情况下,对象、数组、字符串、数字和Bo的原型如果您的脚本需要使用其他未知代码,则不应更改olean和Date。@否-谢谢您的提示。我应该提到,添加枚举性设置为false的ES5语法的原因正是为了解决..in
问题。当然,我们还没有广泛实现ES5,但它很好GH现在知道浏览器是快的,包括IE9。对于空列表,<代码>长度1 -<代码>评估为<代码> -1 < /COD>,因为它是一个负数,被视为数组属性,而不是元素索引。至少,你可以考虑建议一个提供实现的库。很明显,下划线.js是一个不错的选择。请看@Sean-我想我不会在原始海报上推荐特定的Javascript库。谷歌在评估网络对使用哪个库的集体意见方面做得相当好。为什么我会推荐一个特定的库?事实上,你为什么推荐下划线.js乍一看,ch似乎是本月最受欢迎的一款产品。实际上,我更喜欢下面的答案,即在库之外实现该功能。也就是说,有人通过谷歌偶然发现了这个问题,我建议上面的答案可以帮助其他人继续搜索解决方案,而不是将他们发送到“后退”按钮“为什么这个特性没有内置到Javascript中”不是“Ho”