常用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. ...
随机推荐
- NFA和DFA的区别
NFA DFA 初始状态 不唯一 唯一 弧上的标记 字(单字符字/ε) 字符(串) 转换关系 非确定 确定 对于每个NFA M都存在一个DFA M' 使得 L(M) = L(M')
- Hession矩阵(整理)
二阶偏导数矩阵也就所谓的赫氏矩阵(Hessian matrix). 一元函数就是二阶导,多元函数就是二阶偏导组成的矩阵. 求向量函数最小值时用的,矩阵正定是最小值存在的充分条件. 经济学中常常遇到求最 ...
- Golang的sync.WaitGroup 实现逻辑和源码解析
在Golang中,WaitGroup主要用来做go Routine的等待,当启动多个go程序,通过waitgroup可以等待所有go程序结束后再执行后面的代码逻辑,比如: func Main() { ...
- vue学习(一)项目搭建
首先需要配置node和npm,如果没有安装的话,百度一下安装教程. 如果感觉npm下载速度慢,可以使用淘宝镜像cnpm,链接地址: http://npm.taobao.org/ 安装cnpm npm ...
- OSPF RFC2740
2.5. Use of link-local addresses IPv6 link-local addresses are for use on a single link, for purpose ...
- 修改定时清理 /tmp 目录下的文件
初衷 默认系统是超过 30 天不访问的文件自动清除的,但是有时候硬盘用得紧可以考虑修改周期 设置方法 编辑配置文件:vim /etc/cron.daily/tmpwatch #! /bin/sh fl ...
- [Linux]curl 获取本服务器公网IP
curl ifconfig.me curl icanhazip.com curl curlmyip.com curl ip.appspot.com curl ipinfo.io/ip curl ipe ...
- TFT液晶显示屏之绘图板应用
应用范例: 使用 TOPWAY Smart LCD (HMT043FC-1C) 绘图板应用 第一步建立工程 ① 开TOPWAY TML Graphic Editor 2017 V1.04软件, 点击菜 ...
- 少量代码设计一个登录界面 - .NET CORE(C#) WPF开发
微信公众号:Dotnet9,网站:Dotnet9,问题或建议:请网站留言, 如果对您有所帮助:欢迎赞赏. 少量代码设计一个登录界面 - .NET CORE(C#) WPF开发 阅读导航 本文背景 代码 ...
- Spring有哪些配置方式
1.XML 配置文件. Bean 所需的依赖项和服务在 XML 格式的配置文件中指定.这些配置文件通常包含许多 bean 定义和特定于应用程序的配置选项.它们通常以 bean 标签开头.例如: < ...