判断一个对象中是否含有属性 即是否含有某个key 可以用 in
但是toString 定义在object对象中,而对象最终都会在原型链上指向object,所以 toString存在于每个对象中 这时候可以使用
hasOwnProperty()方法。
var xiaoming = {
name: '小明'
};
console.log(xiaoming.hasOwnProperty('name')); // true
console.log(xiaoming.hasOwnProperty('toString')); // false
对象(字典)的迭代。
for(var key in xiaoming){
console.log(key);
console.log(xiaoming[key]);
}
js的字典有个小问题 那就是key必须是字符串 但实际上number也是可以的。
最新的es6规范引用了map
var dic = new Map([[1,2],[3,4]]);
console.log(dic.get(1));
对应输出2 1对应的值。
遍历Array
可以采用下标循环,遍历Map
和Set
就无法使用下标。为了统一集合类型,ES6标准引入了新的iterable
类型,Array
、Map
和Set
都属于iterable
类型。
具有iterable
类型的集合可以通过新的for ... of
循环来遍历。
for in 和 for of 区别
for ... in
循环由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array
数组实际上也是一个对象,它的每个元素的索引被视为一个属性。
当我们手动给Array
对象添加了额外的属性后,for ... in
循环将带来意想不到的意外效果:
var a = ['A', 'B', 'C'];
a.name = 'Hello';
for (var x in a) {
console.log(x); // '0', '1', '2', 'name'
}
console.log(a.length);
更好的方法是用iterable内置的forEach方法。
a.forEach(function(element,index,array){
console.log("元素",element);
console.log("索引",index);
console.log("数组",array);
})
map迭代。
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
console.log(value);
});
set的迭代
var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
console.log(element);
});