一、新增的基本数据类型
1.Symbol
什么是Symbol
(1)Symbol用于创建一个独一无二的标识符。
(2)主要用作对象属性的键,由于Symbol是独一无二的,所以可以防止属性名的命名冲突。使用
(1)每次调用 Symbol(description) 函数会生成一个新的Symbol值,即使接收的参数相同,生成的Symbol值也不同。
(2)Symbol(description)函数接收的参数,仅用作描述,不是访问Symbol本身。
const sym1 = Symbol("name")
const sym2 = Symbol("name")
console.log(sym1 === sym2);; // false
console.log(sym1.description);; // "name"
(3)对象的属性名可以用字符串,也可以用Symbol值,Symbol不与字符串画等号。
(4)对象的属性名使用Symbol时,要用 ,用方括号[ ]包裹。
(5)Object.keys()和getOwnPropertyNames()都无法获取到对象的Symbol属性名。用getOwnPeopertySymbols()。
const sym1 = Symbol("name")
const sym2 = Symbol("name")
const obj = {
[sym1]: "吴磊",
[sym2]: "马冬梅",
}
console.log(obj[sym1]); // "吴磊"
console.log(obj[sym2]); // "马冬梅"
console.log(Object.getOwnPropertySymbols(obj)); // [Symbol(name), Symbol(name)]
- 方法
(1)Symbol.for(description) 方法用于查询或创建一个Symbol。根据description如果能查到Symbol,则返回这个Symbol;否则创建一个与description关联的新Symbol。
const sym3 = Symbol.for("name") // 通过key找不到Symbol时,创建一个Symbol
const sym4 = Symbol.for("name") // 通过key找到Symbol时,返回该Symbol
console.log(sym3 === sym4); // true
(2)Symbol.keyFor(sym) 的参数是Symbol数据,用于从Symbol实例反向获取description描述。
const sym5 = Symbol.for("age")
console.log(Symbol.keyFor(sym5)); // "age"
2.BigInt
二、新增的引用数据类型
1.Map
什么是Map
(1)Map是一种结构的数据结构。
(2)Map对象的可以是任意数据类型,甚至是对象、函数。
(3)Map对象会记住的原始插入顺序,可以通过迭代器进行遍历。
(4)Map对象的属性可以获取键值对的数量。
(5)JSON不支持Map。常用方法
(1)set(key, value):向Map中添加key-value数据。返回值是Map对象。可使用链式调用。
(2)get(key):获取key对应的value。返回值是value,如不存在返回undefined。
(3)delete(key): 删除Map中的指定key-value数据。如果key存在,返回被删除元素,否则返回false。
(4)clear() :清空Map中全部key-value键值对。
(5)has(key):判断Map中是否包含某元素。如果key存在返回true,否则返回false。
let m = new Map([
["name", "吴磊"],
[25, "年龄"],
[undefined, "未定义"],
])
m.set("hobby", "打篮球")
m.delete(undefined)
const hobby = m.get("hobby") // "打篮球"
const hasHobby = m.has("hobby") // true
const num = m.size // 3
- 遍历
(1)forEach(callback[, thisArg]):循环Map中每个元素,按照插入顺序,可选thisArg设置回调函数中的this值。
(2)for...of...:for...of...方法可以遍历可迭代对象。可以直接遍历Map对象。下面的方法也可以获得可迭代对象:
(3)keys():返回可迭代对象,其值为插入顺序时的key。
(4)values(): 返回可迭代对象,其值为插入顺序时的value。
(5)entries(): 返回一个可迭代对象,结构为数组 [key, value],按照其插入顺序。
let m = new Map([
["name", "吴磊"],
["age", 25],
["hobby", "打篮球"],
])
m.forEach((key, value) => {
console.log(key, value);
})
for(let element of m) {
console.log(element); // ["name", "吴磊"] ["age", 25] ["hobby", "打篮球"]
}
for(let element of m.keys()) {
console.log(element); // "name" "age" "hobby"
}
for(let element of m.values()) {
console.log(element); // "吴磊" 25 "打篮球"
}
for(let element of m.entries()) 等效于for(let element of m)
2.Set
什么是Set
(1)Set像数组一样存储集合数据,但是Set只会存储的数据。
(2)Set构造函数接收一个,之后会把这些数据添加到Set中。
(3)Set的属性可以获取元素数量。
常用方法
(1)add(value):追加一个新的元素到Set中。返回Set对象,可以使用链式调用。
(2)delete(value):删除Set中的指定元素。
(3)clear():清空Set中的所有元素。
(4)has(value):判断Set中是否有该元素。返回true/false
let s = new Set([1,2,3,3]) // Set(3) { 1, 2, 3}
s.add(4) // Set(4) { 1, 2, 3, 4 }
s.delete(4) // Set(3) { 1, 2, 3 }
s.has(1) // true
s.size // 3
- 遍历
(1)forEach(callback [, thisArg]):像数组的forEach一样,并且每次调用会将this设置为thisArg。
(2)for...of...:for...of...方法可以遍历可迭代对象。可以直接遍历Set。下面的方法也可以获得可迭代对象:
(3)keys(): 返回一个可迭代对象。和values()方法一样。
(4)entries():返回一个新的可迭代对象。包含[value, value] 。
let s = new Set([1,2,3])
s.forEach((value) => {
console.log(value); // 1 2 3
})
for(let element of s) {
console.log(element); // 1 2 3
}
for(let element of s.keys()) {
console.log(element); // 1 2 3
}
三、 for in 和for of 的区别
(1)for in更适合遍历 对象,也可以遍历 数组,它能取到对象的 key值 或数组的 索引值。
(2)for in 会遍历所有可枚举属性,包括原型对象,可以用 hasOwnProperty() 方法进行判断。
const obj = {a:1, b:2, c:3}
for (let k in obj){
if(obj.hasOwnProperty(k)){ // 判断当前k被挂载到了obj上还是obj的原型对象上
console.log(k) // a 、b 、c
}
}
(1)for of 可以遍历具有迭代器对象的集合,比如数组、字符串、set、map数据等,但不能遍历对象。它能取到数组 元素值。
(2)for of 不会遍历原型对象。
const arr = [1,2,3]
for (let v of arr){
console.log(v) // 1、 2、 3
}