5
和
"5"
是兩個不一樣的值。它相似於精確相等運算符(
===
),主要的區別是
NaN
等於自身,而精確相等運算符認爲
NaN
不等於自身。
add(value)
:添加某個值,返回Set結構自己。delete(value)
:刪除某個值,返回一個布爾值,表示刪除是否成功。has(value)
:返回一個布爾值,表示該值是否爲Set
的成員。clear()
:清除全部成員,沒有返回值。keys()
:返回鍵名的遍歷器values()
:返回鍵值的遍歷器entries()
:返回鍵值對的遍歷器forEach()
:使用回調函數遍歷每一個成員 須要特別指出的是,Set
的遍歷順序就是插入順序。這個特性有時很是有用,好比使用Set保存一個回調函數列表,調用時就能保證按照添加順序調用。javascript
function dedupe(array) { return Array.from(new Set(array)); } dedupe([1, 1, 2, 3]) // [1, 2, 3]
...
)內部使用
for...of
循環,因此也能夠用於Set結構。
替代數組的apply方法 // ES5的寫法 Math.max.apply(null, [14, 3, 77]) // ES6的寫法 Math.max(...[14, 3, 77]) // 等同於 Math.max(14, 3, 77);
push
函數,將一個數組添加到另外一個數組的尾部
// ES5的寫法 var arr1 = [0, 1, 2]; var arr2 = [3, 4, 5]; Array.prototype.push.apply(arr1, arr2); // ES6的寫法 var arr1 = [0, 1, 2]; var arr2 = [3, 4, 5]; arr1.push(...arr2);
下面是另一個例子。java
// ES5 new (Date.bind.apply(Date, [null, 2015, 1, 1])) // ES6 new Date(...[2015, 1, 1]);
9.運算符的擴展應用:json
Function
構造函數返回的函數實例,
name
屬性的值爲「anonymous」。
Array.from
方法。
1.Object結構提供了「字符串—值」的對應,Map結構提供了「值—值」的對應,是一種更完善的Hash結構實現。若是你須要「鍵值對」的數據結構,Map比Object更合適。數組
2.對map操做方法和便利方法的總結:數據結構
get set size has delete clearapp
keys() values() entries() forEach()函數
3.能夠是對象,數組 字符串true
和布爾值true
是兩個不一樣的鍵。 spa
undefined
var map = new Map(); map.set(['a'], 555); map.get(['a']) // undefined 上面代碼的set和get方法,表面是針對同一個鍵,但實際上這是兩個值,內存地址是不同的,所以get方法沒法讀取該鍵,返回undefined。
4.在ES6中,有三類數據結構原生具有Iterator接口:數組、某些相似數組的對象、Set和Map結構。
Symbol.iterator構造函數 let arr = ['a', 'b', 'c']; let iter = arr[Symbol.iterator](); iter.next() // { value: 'a', done: false } iter.next() // { value: 'b', done: false } iter.next() // { value: 'c', done: false } iter.next() // { value: undefined, done: true }
//這裏有點相似match方法,下一個下一個知道比那裏不到爲止
5.for ....of prototype
一個數據結構只要部署了Symbol.iterator屬性,就被視爲具備iterator接口,就能夠用for...of循環遍歷它的成員。也就是說,for...of循環內部調用的是數據結構的Symbol.iterator方法。設計
const arr = ['red', 'green', 'blue']; let iterator = arr[Symbol.iterator](); for(let v of arr) { console.log(v); // red green blue } for(let v of iterator) { console.log(v); // red green blue }
JavaScript原有的for...in循環,只能得到對象的鍵名,不能直接獲取鍵值。ES6提供for...of循環,容許遍歷得到鍵值。
能夠代替forEach循環 var arr = ['a', 'b', 'c', 'd']; for (let a in arr) { console.log(a); // 0 1 2 3 } for (let a of arr) { console.log(a); // a b c d }
6.map 的forEach方法
map.forEach(function(value, key, map) { console.log("Key: %s, Value: %s", key, value); });
7.map和其餘各個數據類型的轉化
(1)Map轉爲數組
let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']); [...myMap] // [ [ true, 7 ], [ { foo: 3 }, [ 'abc' ] ] ]
(2)數組轉爲Map
new Map([[true, 7], [{foo: 3}, ['abc']]]) // Map {true => 7, Object {foo: 3} => ['abc']}
(3)Map轉爲對象
若是全部Map的鍵都是字符串,它能夠轉爲對象。
function strMapToObj(strMap) { let obj = Object.create(null); for (let [k,v] of strMap) { obj[k] = v; } return obj; } let myMap = new Map().set('yes', true).set('no', false); strMapToObj(myMap) // { yes: true, no: false }
(4)對象轉爲Map
function objToStrMap(obj) { let strMap = new Map(); for (let k of Object.keys(obj)) { strMap.set(k, obj[k]); } return strMap; } objToStrMap({yes: true, no: false}) // [ [ 'yes', true ], [ 'no', false ] ]
(5)Map轉爲JSON
Map轉爲JSON要區分兩種狀況。一種狀況是,Map的鍵名都是字符串,這時能夠選擇轉爲對象JSON。
function strMapToJson(strMap) { return JSON.stringify(strMapToObj(strMap)); } let myMap = new Map().set('yes', true).set('no', false); strMapToJson(myMap) // '{"yes":true,"no":false}'
另外一種狀況是,Map的鍵名有非字符串,這時能夠選擇轉爲數組JSON。
function mapToArrayJson(map) { return JSON.stringify([...map]); } let myMap = new Map().set(true, 7).set({foo: 3}, ['abc']); mapToArrayJson(myMap) // '[[true,7],[{"foo":3},["abc"]]]'
(6)JSON轉爲Map
JSON轉爲Map,正常狀況下,全部鍵名都是字符串。
function jsonToStrMap(jsonStr) { return objToStrMap(JSON.parse(jsonStr)); } jsonToStrMap('{"yes":true,"no":false}') // Map {'yes' => true, 'no' => false}
可是,有一種特殊狀況,整個JSON就是一個數組,且每一個數組成員自己,又是一個有兩個成員的數組。這時,它能夠一一對應地轉爲Map。這每每是數組轉爲JSON的逆操做。
function jsonToMap(jsonStr) { return new Map(JSON.parse(jsonStr)); } jsonToMap('[[true,7],[{"foo":3},["abc"]]]') // Map {true => 7, Object {foo: 3} => ['abc']}
完畢!