<head>
<meta http-equiv="Content-Type" content="text/htmlcharset=gbk"/>
<script type="text/javascript">
var smsTypeDesc = {"4":"回访短信","3":"邮件短信","aa":"测试短信"}
function EnumaKey(){
for(var key in smsTypeDesc){
alert(key)
}
}
function GetVal(){
var key = prompt("请输入要查询的key","4")
if("undefined"==typeof(smsTypeDesc)) return
if("undefined"==typeof(smsTypeDesc[key])){
alert("输入的key:"+key+", 在json对象中不存在!")
return
}
alert("您输入的key是:"+key + ",该key所对应的值是:"+smsTypeDesc[key])
}
function GetValByKey(){
alert(smsTypeDesc.aa)
}
</script>
</head>
<body>
Json对象:<br/>
<pre>
var smsTypeDesc = {"4":"回访短信","3":"邮件短信","aa":"测试短信"}
</pre>
<input type="button" onclick="EnumaKey()" value="遍历smsTypeDesc所有key"/>
<input type="button" onclick="GetVal()" value="获取smsTypeDesc动态指定key的值"/>
<input type="button" onclick="GetValByKey()" value="获取smsTypeDesc key aa 所对应的值"/>
</body>
</html>
ES6 一共有 5 种方法可以遍历对象的属性。
(1)for...in
for...in 循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。
(2)Object.keys(obj) ie9
Object.keys 返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。
(3)Object.getOwnPropertyNames(obj) ie9
Object.getOwnPropertyNames 返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。
(4)Object.getOwnPropertySymbols(obj)
Object.getOwnPropertySymbols 返回一个数组,包含对象自身的所有 Symbol 属性的键名。
(5)Reflect.ownKeys(obj)
Reflect.ownKeys 返回一个数组,包含对象自身的(不含继承的)所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。
以上的 5 种方法遍历对象的键名,都遵守同样的属性遍历的次序规则。
其中兼容性最好的是for... in来进行遍历,因为我们通常只需要遍历对象自身拥有的属性 所以使用 Object.prototype.hasOwnProperty() 兼容到ie5.5 方法来排除继承的属性
注意:即使属性的值是 null 或 undefined ,只要属性存在, hasOwnProperty 依旧会返回 true 。
如果不在意兼容性问题,用keys方法,搭配for... of来遍历也不错,、
for...of是es6引入的用于遍历可迭代对象的语法,相当于python里的for in。
js的for...in别扭的地方在于,遍历数组和对象都是返回的key值,遍历数组是下标值。for...of遍历数组会返回每一个值,跟foreach类似的效果,但是对于对象,只支持实现了迭代器的对象。