ES6个人小手册

一,新的变量声明方式 let/const

与var不同,新的变量声明方式带来了一些不一样的特性,其中最重要的两个特性就是提供了块级作用域与不再具备变量提升。 通过1个简单的例子来说明这两点。

{let a = 20;console.log(a); //其结果为 20
}console.log(a);  //其结果为a is not defined
复制代码

说明了用let定义的变量只作用在其作用域中,比如说{}中,而在{}外面访问a只会报错,说明let也不具有变量提升。

当然,你的代码编译成为了ES5之后,仍然会存在变量提升,因此这一点只需要我们记住即可。在实际使用中,也需要尽量避免使用变量提升的特性带来的负面影响。只有在面试题中,才会对变量提升不停的滥用。

使用ES6,我们需要全面使用let/const替换var,那么什么时候用let,什么时候用const就成为了一个大家要熟练区分的一个知识点。 我们常常使用let来声明一个值会被改变的变量,而使用const来声明一个值不会被改变的变量,也可以称之为常量。

比如下面这个代码:

const a = 110;
a = 99;
console.log(a); // Assignment to constant variable.
复制代码

说明 const 定义的变量是常量,当我们试图改变const声明的变量时,则会报错。

因此,只要记住这两个变量声明方式的特性,那在以后的运用中就会显得游刃有余。

二,箭头函数的使用

在ES6中有一个新的函数编写方式颠覆了以往的js编码习惯,那就是箭头函数。

首先我们举两个例子对比一下:

// 以往的写法
var f = function(a, b) {return a + b;
}// es6 箭头函数写法
var f = (a, b) => {return a + b;
}
//其中当函数直接被return时,可以省略函数体的括号
var f = (a,b) => a + b;
复制代码

可见箭头函数的书写方式更简洁明了一些。

其次,还有一点比较重要,就是箭头函数中没有this,如果你在箭头函数中使用了this,那么该this一定就是外层的this。

所以既然箭头函数中没有this,因此我们也就无从谈起用call/apply/bind来改变this指向。记住这个特性,能让你在react组件之间传值时少走无数弯路。

var f = {name: 'tom',say: function() {return this.name;    //这个this指的是f}
}//当用箭头函数编写时
var f = {name: 'tom',say: () => this.name  //此时this为undefined
}
复制代码

三,模板字符串

模板字符串是为了解决使用+号拼接字符串的不便利而出现的。它的功能非常强大,但是我们大多数时候使用它则非常简单。看一个例子大家就明白怎么使用了。

// es6
const a = 20;
const b = 30;
const string = `${a}+${b}=${a+b}`;// es5
var a = 20;
var b = 30;
var string = a + "+" + b + "=" + (a + b);//两者的string结果是一样的
复制代码

使用 `` 将整个字符串包裹起来,而在其中使用 ${} 来包裹一个变量或者一个表达式。

四,数组的解析结构

1,数组的解构赋值

我们先来看一段代码:

let arr = [1,2,3]
let a = arr[0]
let b = arr[1]
let c = arr[2]
复制代码

这是以前的写法,我们用ES6改进一下:

let arr = [1,2,3]
let [a,b,c] = [1,2,3]
console.log(a,b,c) // a=1 b=2 c=3
复制代码

可以看出ES6的写法要方便很多

2,注意一些细节

当左右结构不一样时

let [a,b,c] = [1,2,3,4]
console.log(a) // 1
console.log(b) // 2
console.log(c) // 3let [a,b,c,d] = [1,2,3]
console.log(a) // 1
console.log(b) // 2
console.log(c) // 3
console.log(d) // undefined
复制代码

跳过部分

let [a,,c] = [1,2,3]
console.log(a) // 1
console.log(c) // 3
复制代码

默认值

let [a,b,c,d=666] = [1,2,3]
console.log(a) // 1
console.log(b) // 2
console.log(c) // 3
console.log(d) // 666let [a=1,b,c=3,d=666] = []
console.log(a) // 1
console.log(b) // undefined
console.log(c) // 3
console.log(d) // 666
复制代码

嵌套

let [a,b,c] = [1,2,[3]]
console.log(a) // 1
console.log(b) // 2
console.log(c) // [3]let [a,b,[c]] = [1,2,[3]]
console.log(a) // 1
console.log(b) // 2
console.log(c) // 3
复制代码

五, 函数默认参数

在ES6中,JS的形参可以有默认值,比如下面的代码:

function f(x,y=100){return x+y;
}
console.log(f(1))  // 101
复制代码

并且默认值最好放后面,比如下面这种情况:

function f(x=100,y){console.log(x,y)   //1,undefinedreturn x+y;
}
console.log(f(1))   //NaN
复制代码

在以前的写法中,比如当我传入一个x值为false,这个时候任然会取到默认值,就不是我们的本意了。 然后在ES6中,就可以解决这个问题。

六,展开运算符

在ES6中用"..."来表示展开运算符,它可以将数组方法或者对象进行展开。先来看一个例子它是如何使用的。

const arr1 = [1, 2, 3];
const arr2 = [...arr1, 10, 20, 30];
// 这样,arr2 就变成了[1, 2, 3, 10, 20, 30];
复制代码

当然,展开对象数据也是可以得到类似的结果

const obj1 = {a: 1,b: 2, c: 3
}const obj2 = {...obj1,d: 4,e: 5,f: 6
}
// 结果为 const obj2 = {a:1,b:2,c:3,d:4,e:5,f:6}
复制代码

展开运算符的运用可以大大提高我们的代码效率,但是在刚开始使用的时候比较绕脑,掌握好了用起来还是非常爽的,记住这些使用场景,平时在用的时候可以刻意多运用就行了。

七,对象字面量 与 class

1,ES6针对对象字面量做了一些简化语法的处理:

当属性与值的变量同名时:

let name = 'wangcai';
let age = 20// es6
let person = {name,age
}// es5
var person = {name: name,age: age
};
复制代码

可见ES6写法相当便捷。

2,class:

ES6为我们创建对象提供了新的语法糖,这就是Class语法。如果你对ES5中面向对象的方式比较熟悉的话,Class掌握起来也是非常迅速的,因为除了写法的不同,它并不会增加新的难以理解的知识点。我们先利用一个简单的例子来看看写法的不同。

// 构造函数
function Person(name, age) {this.name = name;this.age = age;
}// 原型方法
Person.prototype.getName = function() {return this.name
}// ES6
class Person {constructor(name, age) {  // 构造函数this.name = name;this.age = age;}getName() {  // 原型方法return this.name}
}
复制代码

除此之外,我们还需要特别注意在实际使用中的几种写法方式的不同,在下面的例子注释中,我说明了他们分别对应的ES5中的含义。

class Person {constructor(name, age) {  // 构造函数this.name = name;this.age = age;}getName() {   // 这种写法表示将方法添加到原型中return this.name}static a = 20;  // 等同于 Person.a = 20c = 20;   // 表示在构造函数中添加属性 在构造函数中等同于 this.c = 20// 箭头函数的写法表示在构造函数中添加方法,在构造函数中等同于this.getAge = function() {}getAge = () => this.age   }
复制代码

箭头函数需要注意的仍然是this的指向问题,因为箭头函数this指向不能被改变的特性,因此在react组件中常常利用这个特性来在不同的组件进行传值会更加方便。

3,继承 extends

相比ES5,ES6的继承就要简单很多,我们直接来看一个例子。

class Person {constructor(name, age) {this.name = name;this.age = age;}getName() {return this.name}
}// Student类继承Person类
class Student extends Person {constructor(name, age, gender, classes) {super(name, age);this.gender = gender;this.classes = classes;}getGender() {return this.gender;}
}
复制代码

我们只需要一个extends关键字,就可以实现继承了,不用像ES5那样去担心构造函数继承和原型继承,除此之外,我们还需要关注一个叫做super的方法。

在继承的构造函数中,我们必须如上面的例子那么调用一次super方法,它表示构造函数的继承,与ES5中利用call/apply继承构造函数是一样的功能。

// 构造函数中
// es6
super(name, age);// es5
Person.call(this);
复制代码

七,ES6补充

1,关于数组的扩展

(1)Array.from()

这个方法是 Array 构造器的静态方法

作用:将把类数组对象转成真正的数组。

var lis = document.getElementsByTagName("li")
console.log(Array.isArray(lis))  // false//然后使用from:
var lis = document.getElementsByTagName("li")
var rs = Array.from(lis)
console.log(Array.isArray(rs))  // true
复制代码
(2)Array.of

作用:将一组值转换为数组。与 Array.from 功能相似,理解用来创建数组。 主要目的是弥补构造器 Array()的不足

var arr = []
var arr1 = new Array(3)
var arr2 = new Array("3")
console.log(arr,arr1,arr2) // [] [ <3 empty items> ] ["3"]
复制代码

使用Array.of来改造,如下:

var arr1 = Array.of(3)
var arr2 = Array.of("3")
console.log(arr1,arr2) // [3] ["3"]
复制代码
(3)find和findIndex

find:用于找出第一个符合条件的数组元素。找不到则是 undefined 。注意,它是不会返回多 个,只找一个,找到了就返回。如果你要把所有的满足条件的数组元素素都找出来,你应该用filter()

findIndex:返回第一个符合条件的数组元素的索引。找不到则是-1;

(4)includes

作用:判断元素是否在数组中存在。返回值是 true|false

let arr = [1,,2,3]
arr.includes(1)  // true
arr.includes("a")  //false
复制代码
(5)fill

作用:给数组填充指定值。fill 方法用于空数组的初始化非常方便。已有数据会被覆盖。 fill 方法还可以接受第二个和第三个参数,用于指定填充的起始位置和结束位置

let arr = new Array(5)
arr.fill("*")
console.log(arr)  //["*","*","*","*","*"]
复制代码

覆盖之前的元素:

let arr = [1,2,3]
arr.fill("*")
console.log(arr)  //["*","*","*"]
复制代码

还可以指定填充的位置,如下:

let arr = new Array(5)
arr.fill("*",0,2) //0和2表示下标,包括起点,不包括终点
console.log(arr)  //["*","*",<3 empty items>]
复制代码

2,新的两种数据结构(集合)

(1)set

set和数组差不多,也是一种集合,区别在于:它里面的值都是唯一的,没有重复的。 创建一个set如下:

var s = new Set([1,2,"hello"])
console.log(s)    //Set { 1, 2, 'hello' }
复制代码

放一个对象,用add()来添加,如下:

var s = new Set()
s.add(1)
s.add(2)
s.add(3)
console.log(s)   //Set { 1, 2, 3 }
console.log(typeof s)  //object
复制代码

现在要遍历上面的s1,怎么遍历,使用for in 不OK,使用foreach,是OK的。

var s = new Set()
s.add(1)
s.add(2)
s.add(3)
s.forEach(item=>console.log(item))   //1 2 3
复制代码

set不是数组,是一个像对象的数组,是一个伪数组:

var s = new Set()
s.add(1)
s.add(2)
s.add(3)
console.log(Array.isArray(s))  //false
console.log(Array.isArray(Array.from(s))) // true
复制代码
(2)map

它类似于对象,里面存放也是键值对,区别在于:对象中的键名只能是字符串,如果使用map,它里面的键可以是任意值。

创建Map,并放入一个对象,如下:

var m = new Map([["name","wangcai"], [1,"abc"],["age",20],["sex","男"]])
console.log(m)  //Map { 'name' => 'wangcai', 1 => 'abc', 'age' => 20, 'sex' => '男' }
复制代码

使用set进行添加,如下:

var m = new Map([[1,"abc"]])
m.set(false,"abc")
m.set([1,2,3],{name:"xiaoqiang"})
console.log(m)  //Map {1 => 'abc',false => 'abc',[ 1, 2, 3 ] => { name: 'xiaoqiang' } }
复制代码

转载于:https://juejin.im/post/5b6e6bcde51d45339e7f17b5

ES6个人小手册,走过路过不要错过。。。。。相关推荐

  1. [蘑菇街] 搜索、算法团队招募牛人啦-年底了走过路过不要错过 - V2EX

    [蘑菇街] 搜索.算法团队招募牛人啦-年底了走过路过不要错过 - V2EX [蘑菇街] 搜索.算法团队招募牛人啦-年底了走过路过不要错过

  2. 消防安全知识答题小程序,出炉啦~,走过路过不要错过,快来瞧一瞧

    1.答题小程序首页(消防知识竞答) 2.规则页(可以设置答题规则,例如:每人可答题几次.分数.时间以及获奖规则) 3.答题页(答题页面要用深色醒目的颜色来区分题目的类型,页面要做到清爽干净) 4.交卷 ...

  3. 我猜你还不知道这个轻松上热门的小技巧|走过路过千万不要错过......

    很多开始做短视频的朋友是不是都遇上了这样的问题:满心欢喜的发布视频,结果却只有几十几百的播放量,有时候甚至连一个赞都没有:撰写脚本.外出取景.精修剪辑,非常用心地做好一条视频,结果只有寥寥几个赞:跟着 ...

  4. 【旅游类APP源码】开发者案例开源,走过路过不可错过!

    小编语继上周分享仿饿了么APP源码后,得到了开发者们的强烈反响.热心的开发者(社区ID:小小昊)又翻箱倒柜地找出一个旅游类项目,大手一挥,慷慨奉献给各位AppCan的同学了!想要学习旅游类APP开发的 ...

  5. 走过路过不要错过,面了六轮才拿到阿里Android研发岗的Offer,确定不来看看?

    面试过程: 1轮同级 + 1轮Android用人部门leader + 1轮Android 组leader + 1轮项目CTO + 1轮HR + 1轮HRBP 1.项目经历 负责的模块,在工作中有什么总 ...

  6. 华为云薅羊毛攻略来袭,走过路过不要错过

    大家好,我是辣条. 什么是企业上云? 企业上云是指企业通过网络便捷地按需使用资源(包括计算资源.存储资源.应用软件.服务及网络等),且高度可扩展.灵活易管理的业务模式,具有大规模.虚拟化.高可靠及弹性 ...

  7. PMP---项目经理解决冲突的8种模式,走过路过不要错过

    在实际工作过程中,作为一个项目经理,在解决冲突的时候可以通过多种模式解决,项目经理在处理冲突中将担当非常重要的角色,如果冲突处理得恰当,冲突就会展现其有利的一面,从而使暴露出的问题得到及早的重视,激起 ...

  8. 瞧一瞧,看一看,走过路过不要错过。 关于5G

    文章目录 关于5G技术应用和挑战 世界通讯技术的发展史 5G技术指标! 5G的优势 5G的核心技术应用场景 超密集组网 大规模天线列阵 动态自组织网络 软件定义网络 网络功能虚拟化 SDN与NFV区别 ...

  9. 网红、大V、明星的隐私信息大量被泄露!走过路过不要错过,买不买没关系,到屋里瞧一瞧!

    还记得2017年Instagram 600万名人账号信息泄漏的事件吗? 2017年8月底,小天后赛琳娜(Selena Gomez)的IG帐号(Instagram)被黑客入侵,导致其前男友贾斯汀比伯的裸 ...

最新文章

  1. 10个数冒泡排序流程图_(立下flag)每日10道前端面试题01
  2. mysql 6.5安装_(整理)MySQL_REHL6.5 安装MySQL5.5
  3. 关于MySQL的慢日志分析工具
  4. 经典永不过时!重温设计模式
  5. 总结2:上传图片至指定服务器
  6. 让windows cmd也用上linux命令
  7. python 连接mysql_使用MySQL
  8. oracle增加网络服务,Oracle 配置监听和本地网络服务
  9. python qt gui与数据可视化编程 pdf_《Python Qt GUI与数据可视化编程》第13章
  10. VS和Codeblocks安装相关
  11. LInux终端中Ctrl+S卡死
  12. oracle sql 查询无数据_信运大讲堂丨ORACLE数据库SQL和索引
  13. DW集训营数据库Mysql梳理[五]
  14. OpenWrt network 启动过程
  15. python对excel指定数据提取并保存到另一excel表中(一)
  16. 如何重新发明短信息这个古老的轮子
  17. Jenkins版本升级指南
  18. uniapp 开发微信小程序图像识别
  19. 力扣股神之路动态规划
  20. android怎么监听当前应用被卸载

热门文章

  1. hdu 5148 cities 树形DP
  2. ffmpeg second day
  3. 其他——[转]从实现iPhone的OAuth封装看国内互联网和开放平台
  4. [转载]如何用C#语言构造蜘蛛程序
  5. C++_类和对象_对象特性_构造函数和析构函数---C++语言工作笔记040
  6. STM32工作笔记0042---认识三极管的集电极,发射极,基极
  7. 在多label 的代码里面添加augmentation功能遇到的问题
  8. matlab | 与 || 的区别
  9. 在ubuntu里烧win10安装盘
  10. linux下svn命令