Mardanjan / Blog

学习笔记(在issues里),一些小demo的源码在这里,demo在线地址会持续更新
1 stars 0 forks source link

ES6新特性 #45

Open Mardanjan opened 4 years ago

Mardanjan commented 4 years ago

解构赋值

从es6开始,JavaScript引入了解构赋值,可以同时对一组变量进行赋值。 现在,在es6中,可以使用解构赋值,直接对多个变量同时赋值:

var x,y,z
var [x, y, z] = ['hello', 'javascript', 'ES6']

对数组元素进行解构赋值的时候,多个变量要用[...]括起来
如果数组本身还有嵌套,可以通过下面的形式进行解构赋值,注意嵌套层次和位置要保持一致:

let [x, [y, z]] = [1, [2, 3]]

如果需要从一个对象中取出若干属性,也可以使用解构赋值,便于快速获取对象的制定属性:

var person = {
  name: 'name',
  age: 20,
  gender: 'male'
}
var {name, age, gender} = person

对一个对象进行解构赋值时,同样可以直接对嵌套的对象属性进行赋值,只要保证对应的层次是一致的。
使用解构赋值对对象属性进行赋值时,如果对应的对象属性不存在,变量将赋值为undefined,这和引用一个不存在的属性获取undefined是一致的,可以用以下方法获取:

var person = {
  name: 'name',
  age: 20,
  gender: 'male'
  passport: 'G123123',
  school: 'harward'
}
// 把passport属性赋值给变量id
let {name, passport:id} = person

解构赋值还可以使用默认值
解构赋值在很多时候可以大大简化代码,例如交换两个变量的值,可以不用临时变量就可以交换 [x,y] = [y, x]
参考:https://www.liaoxuefeng.com/wiki/1022910821149312/1023021187855808

Mardanjan commented 4 years ago

Set集合与Map集合

解决的一些问题

  1. 如果程序简单可以用对象来模仿set集合与map集合,但如果触碰到对象属性的某些限制,那么这个方法就会变得更加复杂,例如:所有的对象的属性名必须是字符串类型,必须确保每个键名都是字符串类型且在对象中是唯一的
  2. map[5] === map['5'],属性的键名会自动转换,由于对象的键名必须是字符串,当用{}空对象来做键名的时候,这些都会被转换成字符串,map[{}] 和 map[{}]引用的是同一个对象
  3. 对于map集合来说,如果它的属性值是假值,则在需要使用布尔值的情况下,会被自动转换成false,强制转换本身没有问题,如果考虑这个值的使用场景,就可能会导致一些错误
    var map = Object.create(null)
    map.count =1
    if (map.count) {
    //要执行的代码
    }

    这个实例中有一些模糊的地方,比如我们应该怎么使用map.count?在if语句中,我们检查的是map.count存在?还是map.count会否为真值,在大型软件应用中,一旦发生此类问题,将会难以定位以及调试,从而促使es6在语言中加入set集合与map结合这两种特性。

    set集合

    es6中新增的set类型时一种有序列表,其中包含有一些相互独立的非重复值,通过set集合可以快速访问其中的数据,更有效的跟踪各种离散值。

    • 一些api 创建set集合
      添加元素
      移除元素