鍍金池/ 問(wèn)答/HTML5  HTML/ 為什么js的數(shù)組會(huì)根據(jù)下標(biāo)字段的類型進(jìn)行排序?

為什么js的數(shù)組會(huì)根據(jù)下標(biāo)字段的類型進(jìn)行排序?

<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>

結(jié)果為
3--5*
5--4*
a--1*
c--2*
b--3*
x--xasd*
--dd*
這里js把數(shù)字類型下標(biāo)的放在了前面,字符類型的放在了后面,而且把數(shù)字類型下標(biāo)小的放在了前面,比如a[3]盡管出現(xiàn)得比a[5]晚,但是遍歷輸出的時(shí)候放在了前面。而字符類型的下標(biāo)就沒(méi)有這樣的排序,是按照賦值的順序出現(xiàn)的。

回答
編輯回答
瘋子范

for in 不保證遍歷順序
另外所謂的“字符類型下標(biāo)”和數(shù)字下標(biāo)不是一回事,只是添加在數(shù)組對(duì)象上的屬性。

2017年4月19日 02:04
編輯回答
巫婆

數(shù)字下標(biāo)和字符串作為屬性名其實(shí)完全不是一回事
雖然你前面用new Array(3)來(lái)初始化的a,其實(shí)這時(shí)的a僅僅是初始化為[undefined,undefined,undefined],但后面a["a"]=1之類其實(shí)已經(jīng)不是給數(shù)組元素賦值了,而是給a對(duì)象的屬性設(shè)置屬性值了,注意這些值不會(huì)導(dǎo)致數(shù)組對(duì)象的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>")

如果按上面的代碼,你可以看到更多細(xì)節(jié)

2018年6月17日 10:23
編輯回答
檸檬藍(lán)

樓上說(shuō)得對(duì)。
這是一種叫字典(dictionary)的數(shù)據(jù)結(jié)構(gòu)。
我來(lái)說(shuō)下,為何按這樣順序排列吧。
它會(huì)通過(guò)下標(biāo)比較來(lái)進(jìn)行排序。那就會(huì)用到關(guān)系操作符 <,>。例如 x > y,如果為 true,則 y 在前面。
比較規(guī)則:

  1. 兩個(gè)為數(shù)字,正常比較。
  2. 兩個(gè)為字符串,則比較他們的字符編碼值。 // '23' < '3' 是true
  3. 如果只有一個(gè)數(shù)字,另一個(gè)要轉(zhuǎn)為數(shù)字,在進(jìn)行比較。 // '24' < 3 是 false
  4. 如果是對(duì)象,先valueOftoString ,再進(jìn)行比較。
  5. 如果時(shí)布爾值, true 轉(zhuǎn)為 1false 轉(zhuǎn)為 0 ,再比較。
  6. NaN 比較,都是 false 。
2018年2月8日 13:36