常用ES6语法总结
参考链接: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语法总结的更多相关文章
- React Native中常用ES6语法
一:模块导入导出 //ES6 import React, { Component, PropTypes, } from 'react'; import { Image, Text } from 're ...
- 常用ES6语法
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- 把JavaScript代码改成ES6语法不完全指南
目录 * 核心例子 * 修改成静态变量(const)或块级变量(let) * 开始修改 * 疑问解释(重复定义会发生什么) * 疑问解释(let的块级作用域是怎样的) * 疑问解释(const定义的变 ...
- 前端项目中常用es6知识总结 -- 箭头函数及this指向、尾调用优化
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...
- ES6语法知识
let/const(常用) let,const用于声明变量,用来替代老语法的var关键字,与var不同的是,let/const会创建一个块级作用域(通俗讲就是一个花括号内是一个新的作用域) 这里外部的 ...
- es6语法快速上手(转载)
一.相关背景介绍 我们现在大多数人用的语法javascript 其实版本是ecmscript5,也是就es5.这个版本己经很多年了,且完美被各大浏览器所支持.所以很多学js的朋友可以一直分不清楚es5 ...
- ES6语法的新特性
ES6 就是ECMAScript 6是新版本JavaScript语言的标准.虽然目前已经更新到ES7,但是很多浏览器还不知处ES7语法,该标准仍在更新中,但目前部门网站都指出ES6的语法.目前ES6也 ...
- 前端项目中常用es6知识总结 -- Async、Await让异步美如画
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...
- 前端项目中常用es6知识总结 -- Promise逃脱回调地狱
项目开发中一些常用的es6知识,主要是为以后分享小程序开发.node+koa项目开发以及vueSSR(vue服务端渲染)做个前置铺垫. 项目开发常用es6介绍 1.块级作用域 let const 2. ...
随机推荐
- Go语言实现:【剑指offer】数字在排序数组中出现的次数
该题目来源于牛客网<剑指offer>专题. 统计一个数字在排序数组中出现的次数. 看到排序数组,要想到用二分查找. 先找到最前面的数字k,再找到最后面的数字k,通过下标求出次数. Go语言 ...
- 一起了解 .Net Foundation 项目 No.1
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Akka.NET Akka ...
- 使用newtonsoft完美序列化WebApi返回的ValueTuple
由于开发功能的需要,又懒得新建太多的class,所以ValueTuple是个比较好的偷懒方法,但是,由于WebApi需要返回序列化后的json,默认的序列化只能将ValueTuple定义的各个属性序列 ...
- Python3(三) 变量与运算符
一.什么是变量 变量 = [1,2] 二.变量的命名规则 字母,数字,下划线,首字母不能是数字 系统关键字 不能用在变量名中 保留关键字 区别大小写 a=1, a='1', a=(1,2), ...
- javascript 完全正确的数据库indexedDB
//indexedDB var dbName = 'whx', version = '1', dbTableName = 'bbg', request, db, conCls, updateKey, ...
- RFC笔记—IP Version 6 Addressing Architecture
IP Version 6 Addressing Architecture,RFC4291 It includes the basic formats for the various types of ...
- 一键安装apache-2.4.38脚本
[root@lamp scripts]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [root@lamp scripts ...
- chromedriver和firefox driver的安装过程
环境:ubuntu14.04, python2.7 selenium2.0 文章参考出处:http://blog.csdn.net/heybob/article/details/52922645 ch ...
- HDU 5234 背包。
J - 10 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Statu ...
- Sublime text3的安装以及python开发环境的搭建
作者:struct_mooc 博客地址:https://www.cnblogs.com/structmooc/p/12376601.html 一. Sublime text3的安装 1.sublime ...