参考链接:http://es6.ruanyifeng.com/

const

声明一个只读的常量。

改变常量的值会报错。只声明不赋值也会报错。只在声明所在的块级作用域内有效。声明的常量不会提升,只能在声明的位置后面使用,否则会报错。重复声明会报错。

let

声明变量。用法类似于var,但所声明的变量只在let命令所在的代码块里有效。

var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
}
}
a[6](); //
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
}
}
a[6](); //

上面代码中,用var声明的变量i,在全局范围内有效,全局只有一个变量i,循环内被赋给数组a的函数内部的i指向的是全局变量i。所以数组所有成员里的i都指的同一个i,最后输出的是最后一轮的i的值,也就是10。

使用let声明的变量i,当前i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量。所以最后输出的是6。

块级作用域

ES6中的{}内是一个块级作用域。

块级作用域的出现,使立即执行函数表达式不再必要了。

//立即执行函数的写法
(function () {
var tmp = 123;
//一段代码
}) //块级作用域的写法
{
let tmp = 123;
//一段代码
}

函数的扩展

箭头函数

ES6允许使用箭头定义函数。

var f = v => v;

//等同于
var f = function (v) {
return v;
}

如果箭头函数不需要参数或需要多个参数,使用圆括号代表参数部分。

var f = () => 5;
//等同于
var f = function () {
return 5;
} var sum = (num1, num2) => num1 + num2;
//等同于
var sum = function (num1, num2) {
return num1 + num2;
}

如果箭头函数的代码块部分多余一条语句,就使用大括号把它们括起来,并且使用return语句返回。

var sum = (num1, num2) => {
return num1 + num2
};

由于大括号被解释为代码块,所以如果箭头函数直接返回一个对象,必须在对象外面加上括号,否则会报错。

var getObject = () => {a:1, b:2};    //报错

var getObject = () => ({a: 1, b: 2});    //不报错

箭头函数函数体内的this指向函数定义时所在的对象,而不是调用时所在的对象

var Factory = function () {
this.a = 'a';
this.b = 'b';
this.c = {
a: 'c.a',
b: function () {
return this.a;
}
}
}
console.log(new Factory().c.b()); //'c.a' var Factory = function () {
this.a = 'a';
this.b = 'b';
this.c = {
a: 'c.a',
b: () => this.a
}
}
console.log(new Factory().c.b()); //'a'

函数参数的默认值

ES6之前不能直接为函数的参数指定默认值,只能采用变通的方法。

{
//ES5/ES3的写法
function f(x, y) {
y = y || 7;
return x + y;
} console.log(f(1)); //
console.log(f(1, 3)); //
} {
//ES6写法
function f(x, y = 7) {
return x + y;
} console.log(f(1)); //
console.log(f(1, 3)); //
}

利用参数默认值,可以指定某一个参数不得省略,如果省略就抛出一个错误

{
function check() {
throw new Error('x参数不能为空');
} function f(x = check(), y = 7) {
return x + y;
} f(); //报错,x参数不能为空
}

rest参数(扩展运算符)

ES6引入rest参数,形式为...变量名。用于获取函数多余参数,这样就不需要使用arguments对象了。rest参数搭配的变量是一个数组,该变量将多余的参数放入数组中。

{
//ES5可变参数
function f() {
var a = Array.prototype.slice.call(arguments);
var sum = 0;
a.forEach(function (item) {
sum += item;
});
return sum;
} console.log(f(1, 2, 3, 4)); //
}
{
//ES6
function f(...a) {
var sum = 0;
a.forEach(item=> {
sum += item;
});
return sum;
} console.log(f(1, 2, 3, 4)); // }

也可以这样应用

{
//ES5
var params = ['hello', true, 7];
var other = [1, 2].concat(params);
console.log(other); //[1, 2, "hello", true, 7]
}
{
//ES6
var params = ['hello', true, 7];
var other = [1, 2, ...params];
console.log(other); //[1, 2, "hello", true, 7]
}

Proxy(代理)

在目标对象之前架设一层拦截,外界对该对象的访问,都必须先通过这层拦截,因此提供了一种可以对外界的访问进行过滤和修改的机制。以创建一个sex私有属性为例:

 {
//ES3
function Person() {
var data = {
name: 'es3',
sex: 'male'
}
this.get = function (key) {
return data[key];
}
this.set = function (key, value) {
if (key !== 'sex') {
data[key] = value;
}
}
} var person = new Person();
console.table({name: person.get('name'), sex: person.get('sex')});
person.set('sex', 'female')
person.set('name', 'es3+')
console.table({name: person.get('name'), sex: person.get('sex')});
//name的值改变了,sex的值没有变化
}
{
//ES5
var Person = {
name: 'es5',
};
Object.defineProperty(Person, 'sex', {
writable: false,
value: 'male'
});
console.table({name: Person.name, sex: Person.sex});
Person.name = 'es5+';
Person.sex = 'female';
console.table({name: Person.name, sex: Person.sex});
//name的值改变了,sex的值没有变化
}
{
//ES6
let Person = {
name: 'es6',
sex: 'male'
};
let person = new Proxy(Person, {
get(target, key){
return target[key];
},
set(target, key, value){
"use strict";
if (key !== 'sex') {
target[key] = value;
}
}
});
console.table({name: person.name, sex: person.sex});
person.sex = 'female';
person.name = 'es6+'
console.table({name: person.name, sex: person.sex});
//name的值改变了,sex的值没有变化 }

常用ES6语法总结的更多相关文章

  1. React Native中常用ES6语法

    一:模块导入导出 //ES6 import React, { Component, PropTypes, } from 'react'; import { Image, Text } from 're ...

  2. 常用ES6语法

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  3. 把JavaScript代码改成ES6语法不完全指南

    目录 * 核心例子 * 修改成静态变量(const)或块级变量(let) * 开始修改 * 疑问解释(重复定义会发生什么) * 疑问解释(let的块级作用域是怎样的) * 疑问解释(const定义的变 ...

  4. 前端项目中常用es6知识总结 -- 箭头函数及this指向、尾调用优化

    项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...

  5. ES6语法知识

    let/const(常用) let,const用于声明变量,用来替代老语法的var关键字,与var不同的是,let/const会创建一个块级作用域(通俗讲就是一个花括号内是一个新的作用域) 这里外部的 ...

  6. es6语法快速上手(转载)

    一.相关背景介绍 我们现在大多数人用的语法javascript 其实版本是ecmscript5,也是就es5.这个版本己经很多年了,且完美被各大浏览器所支持.所以很多学js的朋友可以一直分不清楚es5 ...

  7. ES6语法的新特性

    ES6 就是ECMAScript 6是新版本JavaScript语言的标准.虽然目前已经更新到ES7,但是很多浏览器还不知处ES7语法,该标准仍在更新中,但目前部门网站都指出ES6的语法.目前ES6也 ...

  8. 前端项目中常用es6知识总结 -- Async、Await让异步美如画

    项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...

  9. 前端项目中常用es6知识总结 -- Promise逃脱回调地狱

    项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...

随机推荐

  1. Dockerfile的使用

    一 什么是Dockerfile Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像. 1.对于开发人员:可以为开发团队提供一个完全一致的开发环境: 2.对 ...

  2. 自定义属性的访问 - Customizing attribute access

    自定义属性的访问 - Customizing attribute access 在 python 中, 下列方法可以实现类实例属性 instance.attribute 的 使用,设置,删除. obj ...

  3. WLAN802.11

    IEEE 802.11,1997年,原始标准(2Mbit/s,播在2.4GHz).DSSS, FHSS.该协议的一大缺点是它提供了太多的选择使得互操作性很难实现.所以它不严密,更像是一个beta标准, ...

  4. Linux Shell 计算脚本执行过程用了多长时间

    #!/bin/bash starttime=`date +'%Y-%m-%d %H:%M:%S'` #执行程序 endtime=`date +'%Y-%m-%d %H:%M:%S'`start_sec ...

  5. 使用ASP.NET Core构建RESTful API的技术指南

    译者荐语:利用周末的时间,本人拜读了长沙.NET技术社区翻译的技术标准<微软RESTFul API指南>,打算按照步骤写一个完整的教程,后来无意中看到了这篇文章,与我要写的主题有不少相似之 ...

  6. Task.Run()方法总结

    一.从异步方法的声明说起 无返回值的类型异步方法 (1)public async Task MethodName() 带返回值类型的异步方法 (2)public async Task<TResu ...

  7. thinkPHP中Model的字段映射问题

    在model定义中不要自己定义相应的字段变量,因为一旦定义,之后的赋值会直接赋给自己定义的属性,但实际上model抽象类重写了__set()方法,将未定义的属性存入了$data里面,写入数据库是也会从 ...

  8. 前端 Docker 基本教程

    为什么要学习 Docker ? 每学一个东西,我们肯定是基于某个需求去学习的,众所周知,软件开发最麻烦的是环境配置,开发好好的,部署出问题就很难受,所以为了确保开发.测试.部署环境一致,且高效的部署所 ...

  9. java设计模式 - 单例模式(干货)

    深度讲解23种设计模式,力争每种设计模式都刨析到底.废话不多说,开始第一种设计模式 - 单例. 作者已知的单例模式有8种写法,而每一种写法,都有自身的优缺点. 1,使用频率最高的写法,废话不多说,直接 ...

  10. windows快捷键记录

    -1: 装完iis, run -> inetmgr 弹出iis管理器 0.按住Shift键右击鼠标打开命令行窗口 1.ODBC数据源管理器run->odbcad32 2.计算机管理(查看设 ...