请你编写一段代码实现一个数组方法,使任何数组都可以调用 array.last() 方法,这个方法将返回数组最后一个元素。如果数组中没有元素,则返回 -1 。
示例 1 :
示例 2 :
根据问题陈述,需要增强所有数组,使其具有返回数组最后一个元素的方法 .last()。如果数组中没有元素,则应返回-1。
为此,可以向数组原型添加一个新方法。这个新方法可以通过访问这个 this[this.length-1] 简单地返回数组的最后一个元素。
添加到数组原型的方法中的 this
关键字引用调用该方法的数组。
注意:扩展原生原型是 JavaScript 的一个强大功能,但应该谨慎使用。如果其他代码(或更高版本的 JavaScript)添加了同名的方法,则可能会导致冲突。在扩展本机原型时始终保持谨慎。
this[this.length - 1]
。Array.prototype.last = function() {
if (this.length === 0) {
return -1;
}
return this[this.length - 1];
}
Array.prototype.last = function() {
return this.length === 0 ? -1 : this[this.length - 1];
}
Array.prototype.last = function() {
return this[this.length - 1] ?? -1;
}
这种实现方式,使用空合并运算符(??)。如果不为 null 或 undefined,则返回左侧操作数,否则返回右侧操作数。
请注意,此实现假定数组只包含数字。如果数组的最后一个元素为空或未定义,则此方法将返回-1,这可能会掩盖最后一个元素的实际值。它可能不适合包含其他数据类型的数组,在这些数组中,null 或 undefined 是有效且不同的值。始终确保使用适合数组中包含的数据类型的方法。
Array.prototype.last = function() {
let val = this.pop();
return val !== undefined ? val : -1;
}
这种实现方式,使用数组 pop() 方法,该方法从数组中移除最后一个元素并返回它。如果数组为空,则 pop() 返回 undefined,我们检查它并将其替换为 -1。需要注意的是,该操作会改变原始数组,这可能并不理想,具体取决于您的用例。
Array.prototype.last = function() {
return this.at(-1) ?? -1;
}
这种实现方式,使用 ES6 中的 Array.prototype.at() 方法。此方法接受一个整数值,并返回该索引处的元素,允许使用正整数和负整数。负整数从数组末尾开始计数。如果数组为空,则 at(-1) 将是未定义的,因此提供 -1 作为备用。
Array.prototype.last = function() {
return this.length ? this.slice(-1)[0] : -1;
}
这种实现方式,使用 Array.prototype.slice() 方法。此方法提取数组的一部分并返回新数组。通过提供 -1 作为参数来请求最后一个元素。如果数组为空,则 slice(-1)[0] 将为 undefined,因此我们提供 -1 作为备用。需要注意的是,该方法不会改变原始数组,这与前面提到的 pop() 方法不同。
Array.prototype.last = function() {
const [lastElement = -1] = this.slice(-1);
return lastElement;
}
它本质上与 slice(-1)[0] 版本相同,但具有不同的语法。
如果在非 ECMAScript 2022 版本中,可以创建polyfill(模拟旧版本中没有的新方法)。
if (!Array.prototype.findLast) {
Array.prototype.findLast = function(predicate) {
for (let i = this.length - 1; i >= 0; i--) {
if (predicate(this[i], i, this)) {
return this[i];
}
}
return undefined;
};
}
实现:
Array.prototype.last = function() {
return this.findLast(() => true) ?? -1;
}
在 JavaScript 中,getter 是获取特定属性的值的方法。在这里,我们将为最后一个属性创建一个 getter。
Object.defineProperty(Array.prototype, 'last', {
get: function() {
return () => this.length ? this[this.length - 1] : -1;
}
})
定义一个 getter 时,实际上是把 last 当作一个属性而不是一个函数。因此,它是通过 array.last 而不是 array.last() 访问的。如果将数组的最后一个元素视为该数组的属性,而不是函数的结果,则这种观点在语义上会更清晰。