for in && for of 的用法
for prop in
prop是 键; 用于可枚举(enumerable)对象中
var obj = {a:1, b:2, c:3};
for (var prop in obj) {
console.log("obj." + prop + " = " + obj[prop]);
}
// 输出:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"
// 另一个用法
'test' in {'kill': 'wj', "test": true} // true
var myDream = ['one', 'day', 'i', 'can', 'do', 'myself']
2 in myDream // true
20 in myDream // false
for prop of
prop 是 value
//====object [codeA]
let ht ={'ppia': 'lab', 'ai': 'intrest', 'farmer': '是'}
for (let value of ht) {
console.log(value);// 炸了
}
原理
能够被for...of正常遍历的,都需要实现一个遍历器Iterator。而数组、字符串、Set、Map结构,早就内置好了Iterator(迭代器),它们的原型中都有一个Symbol.iterator方法,而Object对象并没有实现这个接口,使得它无法被for...of遍历。
//自己造个土轮子
Object.prototype[Symbol.iterator] = function() {
let _this = this
let index = 0
let keys = Object.keys(_this)
let length =keys.length
return {
next:() => {
let value = _this[keys[index]]
let done = (index >= length)
index++
return {value,done}
}
}
}
//重新运行 [codeA]
lab
intrest
是
// 用现成的吧
for (let [key, value] of Object.entries(ht)) {
console.log(value);// 结果一样
}
//===array
let iterable = [10, 20, 30];
for (let value of iterable) {
console.log(value);
}
// 10
// 20
// 30
let iterable = "boo";
for (let value of iterable) {
console.log(value);
}
// "b"
// "o"
// "o"
//======map
let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);
for (let [key, value] of iterable) {
console.log(value);
}
// 1
// 2
// 3
for (let entry of iterable) {
console.log(entry);
}
// [a, 1]
// [b, 2]
// [c, 3]
//====set
let iterable = new Set([1, 1, 2, 2, 3, 3]);
for (let value of iterable) {
console.log(value);
}
// 1
// 2
// 3
Map
[何时使用 Map 来代替普通的 JS 对象]★ (juejin.cn/post/684490…)
Object
- 如果对象的键不是 string 或 symbol,JS 将隐式地将其转换为字符串
- map 中使用任何键类型:数字、布尔值、字符串和 symbol。
//★ ★ https://juejin.cn/post/6844903837707272199
//map 常用操作
let map = new Map();
let o = {n: 1};
map.set(o, "A"); //add
map.set("2", 9);
console.log(map.has("2")); //check if key exists | true
console.log(map.get(o)); //retrieve value associated with key | A
console.log(...map); // [ { n: 1 }, 'A' ] [ '2', 9 ]
console.log(map);// Map { { n: 1 } => 'A', '2' => 9 }
map.delete("2"); //delete key and associated value
map.clear(); //delete everything
//create a map from iterable object
let map_1 = new Map([[1, 2], [4, 5]]);
console.log(map_1.size); //number of keys 2
const map=new Map([['foo',1]])
console.log(map.has('foo'));//output true
console.log(map.has('bar'));//output false
weakmap
与集合类型(Set)一样,映射类型也有一个Weak版本的WeakMap。WeakMap和WeakSet很相似,只不过WeakMap的键会检查变量的引用,只要其中任意一个引用被释放,该键值对就会被删除。以下三点是Map和WeakMap的主要区别:
- Map对象的键可以是任何类型,但WeakMap对象中的键只能是对象引用
- WeakMap不能包含无引用的对象,否则会被自动清除出集合(垃圾回收机制),weakmMap中的对象是一种弱引用,也就是这个引用不算做对象的引用计数里面, 随时可能会被gc 掉。
- WeakSet对象是不可枚举的,无法获取大小。