为什么js的数组会根据下标字段的类型进行排序?

<script>
  var a=new Array(3)
  a["a"]=1
  a["c"]=2
  a["b"]=3
  a[5]=4
  a["x"]="xasd"
  a[""]="dd"
  a[3]=5
  for (b in a)
     document.write(b,"--",a[b],"*<br>")
 </script>

结果为
3--5*
5--4*
a--1*
c--2*
b--3*
x--xasd*
--dd*
这里js把数字类型下标的放在了前面,字符类型的放在了后面,而且把数字类型下标小的放在了前面,比如a[3]尽管出现得比a[5]晚,但是遍历输出的时候放在了前面。而字符类型的下标就没有这样的排序,是按照赋值的顺序出现的。

阅读 3.2k
3 个回答

数字下标和字符串作为属性名其实完全不是一回事
虽然你前面用new Array(3)来初始化的a,其实这时的a仅仅是初始化为[undefined,undefined,undefined],但后面a["a"]=1之类其实已经不是给数组元素赋值了,而是给a对象的属性设置属性值了,注意这些值不会导致数组对象的length属性值改变的。

console.log(a);
console.log(a.length);
console.log(a[2]);
  a["a"]=1
  a["c"]=2
  a["b"]=3
  console.log(a.length);
  a[5]=4
  console.log(a.length);
  a["x"]="xasd"
  a[""]="dd"
  a[3]=5
  console.log(a);
  console.log(a.length);
  for (b in a)
     document.write(b,"--",a[b],"*<br>")

如果按上面的代码,你可以看到更多细节

for in 不保证遍历顺序
另外所谓的“字符类型下标”和数字下标不是一回事,只是添加在数组对象上的属性。

楼上说得对。
这是一种叫字典(dictionary)的数据结构。
我来说下,为何按这样顺序排列吧。
它会通过下标比较来进行排序。那就会用到关系操作符 <,>。例如 x > y,如果为 true,则 y 在前面。
比较规则:

  1. 两个为数字,正常比较。
  2. 两个为字符串,则比较他们的字符编码值。 // '23' < '3' 是true
  3. 如果只有一个数字,另一个要转为数字,在进行比较。 // '24' < 3 是 false
  4. 如果是对象,先valueOftoString ,再进行比较。
  5. 如果时布尔值, true 转为 1false 转为 0 ,再比较。
  6. NaN 比较,都是 false
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题