我从codeblocq.com获取此代码(从未听说过该网站):
alert(array.slice(-1)[0]);
它以某种方式返回array
中最后一个元素的值。代码正常工作,但我不知道如何。有谁能帮我理解这个巫术?
答案 0 :(得分:7)
将表达式分解为其部分。通过了解每一小块,您将了解整体。
这是您的原始陈述:alert(array.slice(-1)[0]);
alert(...)
是函数调用。在它可以执行(并在屏幕上打印某些内容)之前,必须首先评估其参数。它有一个参数:array.slice(-1)[0]
,我们接下来会检查它。
array.slice(-1)
是另一个函数调用。 [0]
是一个数组索引。首先评估哪个?要回答这个问题,我们转向Operator Precedence。函数调用和成员访问都是19级,具有从左到右的关联性,这意味着我们首先评估函数调用,然后是数组索引。
为此,让我们转向documentation on array.slice
,其中说:
arr.slice(开始)
可以使用负指数,表示距序列末尾的偏移量。 slice(-2)提取序列中的最后两个元素。
返回值
包含提取元素的新数组。
因此,array.slice(-1)
为您提供了一个包含原始数组中最后一个元素的数组。
从左到右移动,我们现在有一个单项的数组,后跟一个数组索引[0]
。这将为切片数组提供第一个(也是唯一的)项目,然后将其传递给alert(...)
。
答案 1 :(得分:1)
当您致电array.slice()
时,会返回您阵列的切片(作为另一个阵列)。
var array = ['zero', 'one', 'two', 'three'];
// Grab the elements from `array`
// beginning at 1 and up to (not including) 3.
var sliced = array.slice(1, 3);
console.log(array); // ['zero', 'one', 'two', 'three']
console.log(sliced); // ['one', 'two']
console.log(sliced[0]) // 'one'
在您的代码中,您正在执行array.slice(-1)
。文档说“可以使用[a]负索引,表示从序列末尾的偏移量。切片(-2)提取序列中的最后两个元素。”因此,您的array.slice(-1)
将返回一个填充了原始文件array
的最后一个元素的新数组。
var array = ['zero', 'one', 'two', 'three'];
var sliced = array.slice(-1);
console.log(array); // ['zero', 'one', 'two', 'three']
console.log(sliced); // ['three']
console.log(sliced[0]); // 'three'
// All together, it looks like this.
// I'm using `alert()` instead of `console.log()`
// to mirror your code.
alert(array.slice(-1)[0]); // 'three'
答案 2 :(得分:0)
实际上PetSerAl方法的第一个参数是浅拷贝的开始索引,如果这个索引为负,它将根据指定的索引从该数组中提取最后一个值(它表示偏离序列结束)。
所以基本上-1
将返回数组的最后array.slice(-1)
元素。
如果您查看e.Cancel = true;
MDN参考的Array.prototype.slice(),请说:
可以使用负指数,表示距序列末尾的偏移量。 slice(-2)提取序列中的最后两个元素。
这解释了为什么在e.Cancel = true;
Wizard.CurrentPage = PageNo
中使用{{1}}作为参数时获得最后一个值。