下边就来实践一下:数组
var obj={'3':'ccc',name:'abc',age:23,school:'sdfds',class:'dfd',hobby:'dsfd'}; Object.keys(obj)
输出:["3", "name", "age", "school", "class", "hobby"];浏览器
换一下对象顺序,spa
var obj={name:'abc','3':'ccc',age:23,school:'sdfds',class:'dfd',hobby:'dsfd'}; Object.keys(obj)
输出:["3", "name", "age", "school", "class", "hobby"]code
因此,对象的遍历输出并非按照顺序来的,那么是按照什么规则来的呢,仔细深刻研究你会发现,这还跟浏览器有关系,Chrome跟IE是不同的,因此给出如下结论:对象
Chrome Opera 的 JavaScript 解析引擎遵循的是新版 ECMA-262 第五版规范。所以,使用 for-in 语句遍历对象属性时遍历书序并不是属性构建顺序。
而 IE6 IE7 IE8 Firefox Safari 的 JavaScript 解析引擎遵循的是较老的 ECMA-262 第三版规范,属性遍历顺序由属性构建的顺序决定。
blog
Chrome Opera 中使用 for-in 语句遍历对象属性时会遵循一个规律:
它们会先提取全部 key 的 parseFloat 值为非负整数的属性,而后根据数字顺序对属性排序首先遍历出来,而后按照对象定义的顺序遍历余下的全部属性。排序
那么,解决办法呢?ip
能够把对象经过Object.keys提取对象的key出来变成数组,而后经过数组的排序,而后遍历数组,经过key去取对象的属性值。io
你们都知道数组的遍历是按照顺序的,那么当一个数组中放了不少对象,想要按照对象的某个属性去排序数组须要怎么处理呢?console
var compare = function (prop) { return function (obj1, obj2) { var val1 = obj1[prop]; var val2 = obj2[prop];if (val1 < val2) { return -1; } else if (val1 > val2) { return 1; } else { return 0; } } }
var arr=[{ name:"wlz", age:25},{ name:"wlz", age:5},{ name:"wlz", age:15},{ name:"wlz", age:3},{ name:"zlw", age:24}]; console.log(arr.sort(compare('age')))
最后这个数组就根据属性来作排序了。