ES6是JavaScript语言的下一代标准,已经在2015年6月正式发布了,因为ES6的第一个版本是在2015年发布的,所以又称ECMAScript 2015(简称ES2015)。本文主要讲述的是ES6相对于ES5的几个实用新特性,如有其它见解,欢迎指正和交流。

在线babel转换地址:http://babeljs.io/repl/#?babili=false&evaluate=true&lineWrap=false&presets=es2015%2Creact%2Cstage-2&code=

1. let关键字

(1)基本用法:let关键字用来声明变量,它的用法类似于var,都是用来声明变量。

(2)块级作用域:let声明的变量,只在let关键字所在的代码块内有效。

  1. {
  2. var a = 10;
  3. let b = 10;
  4. }
  5. console.log(a); //
  6. console.log(b); //error: b is not defined
  7.  
  8. var c = 10;
  9. {
  10. var c = 20;
  11. }
  12. console.log(c); //
  13.  
  14. var d = 10;
  15. {
  16. let d = 20;
  17. }
  18. console.log(d); //
  19.  
  20. var i=0;
  21. for(var i=0; i<10; i++) {
  22. }
  23. console.log(i); //
  24.  
  25. var j=0;
  26. for(let j=0; j<10; j++) {
  27. }
  28. console.log(j); //

(3)不存在变量提升:let声明的变量一定要在声明后使用,否则会报错

  1. console.log(a); //undefined
  2. console.log(b); //error: b is not defined
  3.  
  4. var a = 10;
  5. let b = 10;

2. const关键字

(1)基本用法:声明一个只读的常量。一旦声明,常量的值就不能改变。

  1. console.log(a); //undefined
  2. console.log(b); //error: b is not defined
  3. var a = 10;
  4. let b = 10;

(2)其他特性与var关键字一致

 3. 字符串拼接方法

(1)基本用法:用反引号进行拼接

  1. /*ES5中字符串处理方法*/
  2. var name = "Jack";
  3. var str1 = 'my name is ' + name;
  4. console.log(str1); //my name is Jack
  5.  
  6. /*ES6中字符串处理方法*/
  7. var str2 = `my name is ${name}`;
  8. console.log(str2); //my name is Jack

4. function函数

(1)基本用法:默认参数

  1. /*ES5中函数默认参数处理方法*/
  2. function fn1(height) {
  3. var height = height || 100;
  4. console.log(height);
  5. }
  6. fn1(); //
  7.  
  8. /*ES6中直接在形参赋值进行设置默认参数*/
  9. function fn2(height = 100) {
  10. console.log(height);
  11. }
  12. fn2(); //

(2)箭头函数

  1. /*ES5中定义一个函数变量*/
  2. var fn1 = function(height) {
  3. console.log(height);
  4. }
  5. fn1(100); //
  6.  
  7. /*ES6中用箭头函数定义函数变量*/
  8. var fn2 = (height) => {
  9. console.log(height);
  10. }
  11. fn2(100); //
  1. /*箭头函数特性:箭头函数的this指针保持和外层指针一致*/
  2. var ele = document.getElementById('ele'); //获取某个元素,绑定点击事件
  3. ele.onclick = function() {
  4. setTimeout(function() {
  5. console.log(this); //点击后,打印出window对象
  6. }, 10)
  7. }
  8. ele.onclick = function() {
  9. setTimeout(() ()=> {
  10. console.log(this); //点击后,打印出ele元素对象
  11. }, 10)
  12. }
  1. /*箭头函数特性:箭头函数的argumets对象和外层一致*/
  2. function fn1(height) {
  3. setTimeout(function() {
  4. console.log(arguments);
  5. }, 10)
  6. }
  7. function fn2(height) {
  8. setTimeout(() => {
  9. console.log(arguments);
  10. }, 10)
  11. }
  12. fn1(100); //[]
  13. fn2(100); //[100]

5. 变量的结构赋值

(1)基本用法

  1. /*ES5初始化变量*/
  2. var a = 10;
  3. var b = 20;
  4.  
  5. /*ES6解构赋初值*/
  6. var [a, b] = [10, 20];
  1. /*ES5获取对象的key值*/
  2. var obj1 = {
  3. username1: 'jack',
  4. password1: 123
  5. }
  6. var username1 = obj1.username1;
  7. var password1 = obj1.password1;
  8. console.log(username1, password1);
  9.  
  10. /*ES6通过解构拆包获取对象的key值*/
  11. var obj2 = {
  12. username2: 'jack',
  13. password2: 123
  14. }
  15. var {username2, password2} = obj2;
  16. console.log(username2, password2);
  1. /*字符串的解构赋值*/
  2. var [a, b, c, d, e] = 'hello';
  3. console.log(a, b, c, d, e); //h e l l o
  1. /*数组的解构赋值*/
  2. var [a, b, c] = ['hello', 'world'];
  3. console.log(a, b, c); //hello world

6. …拓展操作符

(1)基本用法

  1. //合并数组
  2. var arry = ['a', 'b'];
  3. var arry1 = arry.concat(['c']); //ES5数组拼接
  4. var arry2 = [...arry, 'c']; //ES6...操作符拼接数组
  5. console.log(arry1); //['a', 'b', 'c']
  6. console.log(arry2); //['a', 'b', 'c']
  7.  
  8. //合并对象
  9. var obj = {a: 1, b: 2};
  10. var obj1 = {...obj, c: 3};
  11. var obj2 = {...obj, a: 3};
  12. console.log(obj1) ; // {a: 1, b: 2, c: 3}
  13. console.log(obj2) ; // {a: 99, b: 2}
  1. /*拆分字符串*/
  2. console.log([...'hello']); // [ "h", "e", "l", "l", "o" ]
  1. /*合并成数组*/
  2. function mergeArr(...Arrys) {
  3. console.log(arguments);
  4. }
  5. mergeArr('a', 'b', 'c'); //['a', 'b', 'c'];
  6.  
  7. /*拆分数组*/
  8. console.log(...['a', 'b', 'c']); //a b c
  1. function fn1() {
  2. var arry = Array.prototype.sort.call(arguments, function(a, b) {
  3. return a - b;
  4. })
  5. console.log(arry);
  6. }
  7. fn1(3,1,5,3,8,6); //1 3 3 5 6 8
  8.  
  9. /*...操作符将类数组转换为数组*/
  10. function fn2() {
  11. var arry = [...arguments].sort(function(a, b) {
  12. return a - b;
  13. })
  14. console.log(arry);
  15. }
  16. fn2(3,1,5,3,8,6); //1 3 3 5 6 8

7. 对象的一些实用方法

(1)Object.is():判断两个值是否相等,ES5比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0。

  1. console.log(+0 === -0) //true,错误结果
  2. console.log(NaN === NaN) //false,错误结果
  3. console.log(Object.is(+0, -0)) // false,正确结果
  4. console.log(Object.is(NaN, NaN)) // true,正确结果
  1. /*普通值的比较*/
  2. console.log(Object.is('foo', 'foo')) //true
  3. console.log(Object.is({}, {})) //false

(1)Object.assign():合并对象的方法,将源对象(source)的所有可枚举属性,复制到目标对象(target)。

  1. /*使用方法*/
  2. var target = {a: 1, b: 1 };
  3. var source = {c: 1};
  4. console.log(Object.assign(target, source)); //{a: 1, b: 1, c: 1}
  1. /*如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性*/
  2. var target = {a: 1, b: 1 };
  3. var source = {a: 20, c: 1};
  4. console.log(Object.assign(target, source)); //{a: 20, b: 1, c: 1}
  1. /*运用:克隆对象*/
  2. function clone(origin) {
  3. return Object.assign({}, origin);
  4. }
  5. var obj1 = {
  6. a: 2
  7. }
  8. var obj2 = clone(obj1);
  9. console.log(obj2); //{a: 2}
  10.  
  11. /*注意:Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。*/
  12. var obj1 = {a: {b: 1}, c: 1};
  13. var obj2 = Object.assign({}, obj1);
  14. obj2.a.b = 100;
  15. obj2.c = 200;
  16. console.log(obj1); //{a: {b: 100}, c: 1}
  1. /*运用:合并对象*/
  2. var merge = (...sources) => Object.assign({}, ...sources);
  3. console.log(merge({a: 1}, {b: 2}, {a: 3, c :3})); //{a: 3, b: 2, c: 3}

8. promise对象

(1)定义:一种异步函数的解决方案,避免了异步函数层层嵌套,将原来异步函数转换 为便于理解和阅读的链式步骤关系

(2)三种状态:Pending(进行中)、Resoloved(已完成)、Rejected(已失败)。

(3)两种结果:Pending->Resoloved(成功); Pending->Rejected(失败)。

(4)then方法:第一个参数是成功时调用的函数,第二个参数是失败时调用的函数。

(5)通常形式。

  1. var promise = new Promise((reslove, reject) => {
  2. if(条件成立)
  3. /*Pending->Resoloved(成功*/
  4. reslove();
  5. }else {
  6. /*Pending->Rejected(失败)*/
  7. reject();
  8. }
  9. })
  1. /*运用:隔1s打印‘hello’,隔2s打印‘world’*/
  2.  
  3. /*ES5实现方法*/
  4. setTimeout(function(){
  5. console.log('hello')
  6. setTimeout(function(){
  7. console.log('world')
  8. }, 1000)
  9. }, 1000)
  10.  
  11. /*Promise实现方法*/
  12. var wait1000 = (str) => {
  13. return new Promise((resolve, reject) => {
  14. setTimeout(() => {
  15. resolve(str);
  16. }, 1000)
  17. })
  18. }
  19.  
  20. wait1000('hello').then((data) => {
  21. console.log(data);
  22. return wait1000('world');
  23. }, () => {
  24. console.log('err');
  25. }).then((data) => {
  26. console.log(data);
  27. })

几个ES6新特性的更多相关文章

  1. ES6新特性概览

    本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...

  2. ES6新特性之模板字符串

    ES6新特性概览  http://www.cnblogs.com/Wayou/p/es6_new_features.html 深入浅出ES6(四):模板字符串   http://www.infoq.c ...

  3. Atitit js版本es5 es6新特性

    Atitit js版本es5 es6新特性 Es5( es5 其实就是adobe action script的标准化)1 es6新特性1 Es5( es5 其实就是adobe action scrip ...

  4. ES6新特性:Proxy代理器

    ES6新特性:Proxy: 要使用的话, 直接在浏览器中执行即可, node和babel目前还没有Proxy的polyfill;,要使用的话,直接在浏览器中运行就好了, 浏览器的兼容性为:chrome ...

  5. ES6新特性(函数默认参数,箭头函数)

    ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式:   从上面的代码可以看出存在一个问题,当传入的参数为0或者 ...

  6. ES6新特性简介

    ES6新特性简介 环境安装 npm install -g babel npm install -g babel-node //提供基于node的REPL环境 //创建 .babelrc 文件 {&qu ...

  7. 轻松学会ES6新特性之生成器

    生成器虽然是ES6最具魔性的新特性,但也是最难懂得的一节,笔者写了大量的实例来具体化这种抽象的概念,能够让人一看就懂,目的是希望别人不要重复或者减少笔者学习生成器的痛苦经历. 在说具体的ES6生成器之 ...

  8. 必须掌握的ES6新特性

    ES6(ECMAScript2015)的出现,让前端开发者收到一份惊喜,它简洁的新语法.强大的新特性,带给我们更便捷和顺畅的编码体验,赞! 以下是ES6排名前十的最佳特性列表(排名不分先后): 1.D ...

  9. 你不知道的JavaScript--Item24 ES6新特性概览

    ES6新特性概览 本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代 ...

  10. javascript ES6 新特性之 扩展运算符 三个点 ...

    对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中. 作用类似于 Object.assign() ...

随机推荐

  1. Redis安装配置

    Redis有服务端和客户端 服务端: 服务端下载地址: https://github.com/dmajkic/redis/downloads 解压后: 然后进入CMD命令: 不要关闭此命令窗(关闭服务 ...

  2. [ASP.NET Core] Middleware

    前言 本篇文章介绍ASP.NET Core里,用来处理HTTP封包的Middleware,为自己留个纪录也希望能帮助到有需要的开发人员. ASP.NET Core官网 结构 在ASP.NET Core ...

  3. DevExpress使用的过期版本解决方法

    Windows控件确实有点丑,一般刚学习VS编程或者临时创建测试程序时才会使用:第三方控件,增强了一些功能,美化了控件,现在比较流行:再高级一点,就是使用WPF,看效果还不错,估计以后会成为C/S的主 ...

  4. Android 学习心得 页面跳转,不显示新页面信息

    原因: 1.新页面的Activity中,public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt ...

  5. iOS 直播-实现后台录音并推流

    iOS 直播-实现后台录音并推流 从一个月前开始开始接收公司的直播类app.到今天为止测试都已接近尾声,但是产品哥哥加了一个要求,就是在app进入后台后也实时保证录音并且推流. 刚听到这个的时候我也是 ...

  6. 从tabBarController的一个item上的控制器跳转到另一个item上的控制器

    先从习惯性的tabBarController开始,很多应用的外框都是用这个开始的,而从tabBarController的一个item上的控制器跳转到另一个上的,往往都是直接通过点击tabBar上的不同 ...

  7. 学习Coding-iOS开源项目日志(五)

    继续,接着前面第四篇<学习Coding-iOS开源项目日志(四)>讲解Coding-iOS开源项目. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目 ...

  8. C# 6.0新特性

    因为在博客中给出的代码大多数都使用了C#6.0的新特性,如果各位对C#6.0还不了解,可以简单的看一下这篇随笔.o( ̄▽ ̄)d 先来看一个Point类 public class Point { pub ...

  9. python-list tuple dict set

    1:删除一个列表末尾的元素 pop方法 >>> a [1, 'Jack', 2, 3, 2] >>> a.pop() >>> a [1, 'Jac ...

  10. 拯救你的文档 – 【DevOps敏捷开发动手实验】开源文档发布

    今天上海的天气真是不错,风和日丽.再次来到微软上海紫竹研发中心,心情很是愉快,喜欢这里的大草坪,喜欢这里的工程气氛,更喜欢今天来陪我的小伙伴们. 这次动手实验培训与以往最大的不同就是采用了开源文档的方 ...