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']}
完毕!