2025-04-01 ES6+

一、新增的基本数据类型

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时,要用 \color{green}{动态属性名写法},用方括号[ ]包裹。
(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是一种 \color{green}{key-value键值对} 结构的数据结构。
    (2)Map对象的 \color{green}{键}可以是任意数据类型,甚至是对象、函数。
    (3)Map对象会记住 \color{green}{键}的原始插入顺序,可以通过迭代器进行遍历。
    (4)Map对象的 \color{green}{size}属性可以获取键值对的数量。
    (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只会存储\color{green}{唯一不重复}的数据。
    (2)Set构造函数接收一个 \color{green}{可迭代对象},之后会把这些数据添加到Set中。
    (3)Set的 \color{green}{size}属性可以获取元素数量。

  • 常用方法
    (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
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容