数组索引是非负整数,直接按内存偏移访问元素,不查找;数值属性名若为有效非负整数字符串会被视为索引并影响length;sort会重排索引,原始顺序丢失。

数值属性本身不是数组的“索引”,但 JavaScript 中数组的索引本质就是非负整数(0, 1, 2, …),所以当你看到 [10, 20, 30][1] 返回 20,这个 1 就是标准的数值索引——它直接对应内存中元素的位置,不涉及查找、比较或语义匹配。
数值索引访问:直接定位,不查找
用方括号加数字(如 arr[2])是**访问**操作,不是“查找”。它不比对值,也不遍历,而是按地址偏移直接取值。即使该位置是空位(hole),也返回 undefined;如果越界(如 arr[100]),同样返回 undefined,不会报错。
-
[1, , 3][1]→undefined(中间是 hole,但索引 1 存在) -
[1, 2][5]→undefined(索引 5 不存在,但语法合法) -
Array(3)[1]→undefined(稀疏数组,索引存在但无赋值)
数值作为查找目标时的特殊行为
当你用 indexOf、lastIndexOf 或 includes 查找一个数值(比如 0、-0、NaN),它们的相等逻辑就显出特殊性:
-
0 === -0是true,所以[0, -0].indexOf(-0)返回0 -
NaN === NaN是false,但[NaN].indexOf(NaN)返回0(indexOf内部用的是 SameValueZero 算法) -
[NaN].includes(NaN)也返回true,行为一致 -
123 === 123.0是true,所以整数和浮点数形式相同值可互认
数值型属性名可能被自动转为索引
数组是对象,可以添加任意属性。但如果你给数组加一个纯数字字符串属性(如 arr["2"] = "x"),JavaScript 引擎会把它视为索引属性,并同步更新 length(前提是该数字在有效范围内且大于等于当前 length):
-
let a = [1,2]; a["5"] = "five"; console.log(a.length)→6 -
a[-1] = "neg"不影响length,因为负数不是有效索引 -
a["1.5"] = "half"也不会变成索引,会被当作普通对象属性
排序后数值索引与原始顺序脱钩
调用 .sort() 会重排元素,原索引彻底失效。例如:
let arr = [30, 10, 20]; arr.sort((a,b) => a - b); // [10, 20, 30]- 原来
30在索引0,排序后它在索引2—— 这个变化不是“识别”出来的,而是操作导致的必然结果 - 若需保留原始位置信息,得提前记录(如用
map((v,i) => ({value:v, originalIndex:i})))










