几个ES6新特性
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关键字所在的代码块内有效。
- {
- var a = 10;
- let b = 10;
- }
- console.log(a); //
- console.log(b); //error: b is not defined
- var c = 10;
- {
- var c = 20;
- }
- console.log(c); //
- var d = 10;
- {
- let d = 20;
- }
- console.log(d); //
- var i=0;
- for(var i=0; i<10; i++) {
- }
- console.log(i); //
- var j=0;
- for(let j=0; j<10; j++) {
- }
- console.log(j); //
(3)不存在变量提升:let声明的变量一定要在声明后使用,否则会报错
- console.log(a); //undefined
- console.log(b); //error: b is not defined
- var a = 10;
- let b = 10;
2. const关键字
(1)基本用法:声明一个只读的常量。一旦声明,常量的值就不能改变。
- console.log(a); //undefined
- console.log(b); //error: b is not defined
- var a = 10;
- let b = 10;
(2)其他特性与var关键字一致
3. 字符串拼接方法
(1)基本用法:用反引号进行拼接
- /*ES5中字符串处理方法*/
- var name = "Jack";
- var str1 = 'my name is ' + name;
- console.log(str1); //my name is Jack
- /*ES6中字符串处理方法*/
- var str2 = `my name is ${name}`;
- console.log(str2); //my name is Jack
4. function函数
(1)基本用法:默认参数
- /*ES5中函数默认参数处理方法*/
- function fn1(height) {
- var height = height || 100;
- console.log(height);
- }
- fn1(); //
- /*ES6中直接在形参赋值进行设置默认参数*/
- function fn2(height = 100) {
- console.log(height);
- }
- fn2(); //
(2)箭头函数
- /*ES5中定义一个函数变量*/
- var fn1 = function(height) {
- console.log(height);
- }
- fn1(100); //
- /*ES6中用箭头函数定义函数变量*/
- var fn2 = (height) => {
- console.log(height);
- }
- fn2(100); //
- /*箭头函数特性:箭头函数的this指针保持和外层指针一致*/
- var ele = document.getElementById('ele'); //获取某个元素,绑定点击事件
- ele.onclick = function() {
- setTimeout(function() {
- console.log(this); //点击后,打印出window对象
- }, 10)
- }
- ele.onclick = function() {
- setTimeout(() ()=> {
- console.log(this); //点击后,打印出ele元素对象
- }, 10)
- }
- /*箭头函数特性:箭头函数的argumets对象和外层一致*/
- function fn1(height) {
- setTimeout(function() {
- console.log(arguments);
- }, 10)
- }
- function fn2(height) {
- setTimeout(() => {
- console.log(arguments);
- }, 10)
- }
- fn1(100); //[]
- fn2(100); //[100]
5. 变量的结构赋值
(1)基本用法
- /*ES5初始化变量*/
- var a = 10;
- var b = 20;
- /*ES6解构赋初值*/
- var [a, b] = [10, 20];
- /*ES5获取对象的key值*/
- var obj1 = {
- username1: 'jack',
- password1: 123
- }
- var username1 = obj1.username1;
- var password1 = obj1.password1;
- console.log(username1, password1);
- /*ES6通过解构拆包获取对象的key值*/
- var obj2 = {
- username2: 'jack',
- password2: 123
- }
- var {username2, password2} = obj2;
- console.log(username2, password2);
- /*字符串的解构赋值*/
- var [a, b, c, d, e] = 'hello';
- console.log(a, b, c, d, e); //h e l l o
- /*数组的解构赋值*/
- var [a, b, c] = ['hello', 'world'];
- console.log(a, b, c); //hello world
6. …拓展操作符
(1)基本用法
- //合并数组
- var arry = ['a', 'b'];
- var arry1 = arry.concat(['c']); //ES5数组拼接
- var arry2 = [...arry, 'c']; //ES6...操作符拼接数组
- console.log(arry1); //['a', 'b', 'c']
- console.log(arry2); //['a', 'b', 'c']
- //合并对象
- var obj = {a: 1, b: 2};
- var obj1 = {...obj, c: 3};
- var obj2 = {...obj, a: 3};
- console.log(obj1) ; // {a: 1, b: 2, c: 3}
- console.log(obj2) ; // {a: 99, b: 2}
- /*拆分字符串*/
- console.log([...'hello']); // [ "h", "e", "l", "l", "o" ]
- /*合并成数组*/
- function mergeArr(...Arrys) {
- console.log(arguments);
- }
- mergeArr('a', 'b', 'c'); //['a', 'b', 'c'];
- /*拆分数组*/
- console.log(...['a', 'b', 'c']); //a b c
- function fn1() {
- var arry = Array.prototype.sort.call(arguments, function(a, b) {
- return a - b;
- })
- console.log(arry);
- }
- fn1(3,1,5,3,8,6); //1 3 3 5 6 8
- /*...操作符将类数组转换为数组*/
- function fn2() {
- var arry = [...arguments].sort(function(a, b) {
- return a - b;
- })
- console.log(arry);
- }
- fn2(3,1,5,3,8,6); //1 3 3 5 6 8
7. 对象的一些实用方法
(1)Object.is():判断两个值是否相等,ES5比较两个值是否相等,只有两个运算符:相等运算符(==)和严格相等运算符(===)。它们都有缺点,前者会自动转换数据类型,后者的NaN不等于自身,以及+0等于-0。
- console.log(+0 === -0) //true,错误结果
- console.log(NaN === NaN) //false,错误结果
- console.log(Object.is(+0, -0)) // false,正确结果
- console.log(Object.is(NaN, NaN)) // true,正确结果
- /*普通值的比较*/
- console.log(Object.is('foo', 'foo')) //true
- console.log(Object.is({}, {})) //false
(1)Object.assign():合并对象的方法,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
- /*使用方法*/
- var target = {a: 1, b: 1 };
- var source = {c: 1};
- console.log(Object.assign(target, source)); //{a: 1, b: 1, c: 1}
- /*如果目标对象与源对象有同名属性,或多个源对象有同名属性,则后面的属性会覆盖前面的属性*/
- var target = {a: 1, b: 1 };
- var source = {a: 20, c: 1};
- console.log(Object.assign(target, source)); //{a: 20, b: 1, c: 1}
- /*运用:克隆对象*/
- function clone(origin) {
- return Object.assign({}, origin);
- }
- var obj1 = {
- a: 2
- }
- var obj2 = clone(obj1);
- console.log(obj2); //{a: 2}
- /*注意:Object.assign方法实行的是浅拷贝,而不是深拷贝。也就是说,如果源对象某个属性的值是对象,那么目标对象拷贝得到的是这个对象的引用。*/
- var obj1 = {a: {b: 1}, c: 1};
- var obj2 = Object.assign({}, obj1);
- obj2.a.b = 100;
- obj2.c = 200;
- console.log(obj1); //{a: {b: 100}, c: 1}
- /*运用:合并对象*/
- var merge = (...sources) => Object.assign({}, ...sources);
- 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)通常形式。
- var promise = new Promise((reslove, reject) => {
- if(条件成立) {
- /*Pending->Resoloved(成功*/
- reslove();
- }else {
- /*Pending->Rejected(失败)*/
- reject();
- }
- })
- /*运用:隔1s打印‘hello’,隔2s打印‘world’*/
- /*ES5实现方法*/
- setTimeout(function(){
- console.log('hello')
- setTimeout(function(){
- console.log('world')
- }, 1000)
- }, 1000)
- /*Promise实现方法*/
- var wait1000 = (str) => {
- return new Promise((resolve, reject) => {
- setTimeout(() => {
- resolve(str);
- }, 1000)
- })
- }
- wait1000('hello').then((data) => {
- console.log(data);
- return wait1000('world');
- }, () => {
- console.log('err');
- }).then((data) => {
- console.log(data);
- })
几个ES6新特性的更多相关文章
- ES6新特性概览
本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代号harmony( ...
- ES6新特性之模板字符串
ES6新特性概览 http://www.cnblogs.com/Wayou/p/es6_new_features.html 深入浅出ES6(四):模板字符串 http://www.infoq.c ...
- Atitit js版本es5 es6新特性
Atitit js版本es5 es6新特性 Es5( es5 其实就是adobe action script的标准化)1 es6新特性1 Es5( es5 其实就是adobe action scrip ...
- ES6新特性:Proxy代理器
ES6新特性:Proxy: 要使用的话, 直接在浏览器中执行即可, node和babel目前还没有Proxy的polyfill;,要使用的话,直接在浏览器中运行就好了, 浏览器的兼容性为:chrome ...
- ES6新特性(函数默认参数,箭头函数)
ES6新特性之 函数参数的默认值写法 和 箭头函数. 1.函数参数的默认值 ES5中不能直接为函数的参数指定默认值,只能通过以下的变通方式: 从上面的代码可以看出存在一个问题,当传入的参数为0或者 ...
- ES6新特性简介
ES6新特性简介 环境安装 npm install -g babel npm install -g babel-node //提供基于node的REPL环境 //创建 .babelrc 文件 {&qu ...
- 轻松学会ES6新特性之生成器
生成器虽然是ES6最具魔性的新特性,但也是最难懂得的一节,笔者写了大量的实例来具体化这种抽象的概念,能够让人一看就懂,目的是希望别人不要重复或者减少笔者学习生成器的痛苦经历. 在说具体的ES6生成器之 ...
- 必须掌握的ES6新特性
ES6(ECMAScript2015)的出现,让前端开发者收到一份惊喜,它简洁的新语法.强大的新特性,带给我们更便捷和顺畅的编码体验,赞! 以下是ES6排名前十的最佳特性列表(排名不分先后): 1.D ...
- 你不知道的JavaScript--Item24 ES6新特性概览
ES6新特性概览 本文基于lukehoban/es6features ,同时参考了大量博客资料,具体见文末引用. ES6(ECMAScript 6)是即将到来的新版本JavaScript语言的标准,代 ...
- javascript ES6 新特性之 扩展运算符 三个点 ...
对于 ES6 新特性中的 ... 可以简单的理解为下面一句话就可以了: 对象中的扩展运算符(...)用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中. 作用类似于 Object.assign() ...
随机推荐
- Redis安装配置
Redis有服务端和客户端 服务端: 服务端下载地址: https://github.com/dmajkic/redis/downloads 解压后: 然后进入CMD命令: 不要关闭此命令窗(关闭服务 ...
- [ASP.NET Core] Middleware
前言 本篇文章介绍ASP.NET Core里,用来处理HTTP封包的Middleware,为自己留个纪录也希望能帮助到有需要的开发人员. ASP.NET Core官网 结构 在ASP.NET Core ...
- DevExpress使用的过期版本解决方法
Windows控件确实有点丑,一般刚学习VS编程或者临时创建测试程序时才会使用:第三方控件,增强了一些功能,美化了控件,现在比较流行:再高级一点,就是使用WPF,看效果还不错,估计以后会成为C/S的主 ...
- Android 学习心得 页面跳转,不显示新页面信息
原因: 1.新页面的Activity中,public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt ...
- iOS 直播-实现后台录音并推流
iOS 直播-实现后台录音并推流 从一个月前开始开始接收公司的直播类app.到今天为止测试都已接近尾声,但是产品哥哥加了一个要求,就是在app进入后台后也实时保证录音并且推流. 刚听到这个的时候我也是 ...
- 从tabBarController的一个item上的控制器跳转到另一个item上的控制器
先从习惯性的tabBarController开始,很多应用的外框都是用这个开始的,而从tabBarController的一个item上的控制器跳转到另一个上的,往往都是直接通过点击tabBar上的不同 ...
- 学习Coding-iOS开源项目日志(五)
继续,接着前面第四篇<学习Coding-iOS开源项目日志(四)>讲解Coding-iOS开源项目. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的项目 ...
- C# 6.0新特性
因为在博客中给出的代码大多数都使用了C#6.0的新特性,如果各位对C#6.0还不了解,可以简单的看一下这篇随笔.o( ̄▽ ̄)d 先来看一个Point类 public class Point { pub ...
- python-list tuple dict set
1:删除一个列表末尾的元素 pop方法 >>> a [1, 'Jack', 2, 3, 2] >>> a.pop() >>> a [1, 'Jac ...
- 拯救你的文档 – 【DevOps敏捷开发动手实验】开源文档发布
今天上海的天气真是不错,风和日丽.再次来到微软上海紫竹研发中心,心情很是愉快,喜欢这里的大草坪,喜欢这里的工程气氛,更喜欢今天来陪我的小伙伴们. 这次动手实验培训与以往最大的不同就是采用了开源文档的方 ...