2016年7月18日 星期一

集合、Iterator (JavaScript 6)

※集合

和java的Map和Set差不多,但方法名不同
Map的key不重覆,後者會蓋前者; Set塞相同的資料,長度不會變長
沒有List,可能已經有Array了吧!

// map
var map = new Map();
map.set("a", "1");
map.set("b", "2");
map.set("c", "3");
console.log(map.size); // 3
console.log(map.get("fox")); // undefined
console.log(map.get("b")); // 2
console.log(map.has("b")); // true
map.delete("b");
console.log(map.has("b")); // false
    
for(let m of map) console.log(m); // ["a", "1"] ["c", "3"]
map.set("a", 10);
map.forEach(function(e, i, a){
    console.log(e); // 10 3
});
    
    
// set
var set = new Set();
set.add(1);
set.add("a");
set.add("b");
    
console.log(set.size); // 3
console.log(set.has(1)); // true
set.delete(1);
console.log(set.has(1)); // false
    
for (let s of set) console.log(s); // a b
console.log(set.size); // 2
set.add("a");
console.log(set.size); // 2
    
set.forEach(function(e, i, a){
    console.log(e); // a b
});

※除了Map 和 Set 外,還有 WeakMap 和 WeakSet
WeakMap 的 key 只能塞物件,Map 無限制
WeakSet 只能放物件,Set 無限制



※ Iterator


※Symbol.iterator

var xxx = {}; // []也可以
xxx[Symbol.iterator] = function* () {
    yield 1;
    yield 2;
    yield 3;
};
console.log([...xxx]); // [1, 2, 3]

※「*」一定要,可以不和function連在一起

※ Symbol.iterator是內鍵的,一個字都不能改,有這個才能用「...變數」

※yield就類似return,但它可以一直接起來

※沒辦法用lambda的寫法


※function*的yield、yield*和next()

function* gen() {
    yield* ["a", "b", "c"];
}
    
const g = gen();
console.log(g.next()); // { value:"a", done:false }
console.log(g.next()); // { value:"b", done:false }
console.log(g.next()); // { value:"c", done:false }
console.log(g.next()); // { value:undefined, done:true }
    
// 一次宣告多個變數和值
var [a, b, c] = new Set(["aa", "bb", "cc"]);
console.log(a); // "aa"
console.log(b); // "bb"

※回傳的done是內鍵的,表示完成了沒

※如果yield不加「*」,那結果是{value: Array[3], done: false},會將整個陣列裝起來,後面如果再呼叫next(),結果都是{value: undefined, done: true}

※最後的宣告改成Array,如var [a, b, c] = new Array(["aa", "bb", "cc"]);,
結果a會變成["aa", "bb", "cc"],後面的b和c都會變成undefined


※function的return

function* gen() { 
    yield 1;
    yield 2;
    yield 3;
}
    
var g = gen();
console.log(g.next());        // { value: 1, done: false }
console.log(g.next());        // { value: 2, done: false }
console.log(g.return("xxx")); // { value: "xxx", done: true }
console.log(g.next());        // { value: undefined, done: true }

※只要一return,後面的value就沒有了,done也變成true了,也就是說一return就算完成了

沒有留言:

張貼留言