ES6学习笔记一
块级作用域:在ES5中只有全局作用域与函数作用域,ES6中新增的块级作用域避免变量的覆盖与泄露。考虑到代码运行环境,在块级作用域中应避免声明函数,最好用函数表达式的方式声明。
let与const:let命令声明在作用域内有效的变量,必须严格的先声明,不能变量提升。const命令声明一个只读的常量,一旦声明则不能改变。两者在相同作用域中不能重复声明。在ES5中var声明的是一个全局的变量,并且可以变量提升。
顶层对象:在浏览器环境是指window对象。在node环境中指global对象。ES5中两者完全相等。这会导致在编译的时候不能报出变量未声明的错误,只有在运行阶段才会报错;在代码编写过程中很容易在不知不觉中创造出全局变量;顶层对象到处可以进行读写的,不利于模块化编程。另一方面。window对象有实体含义,指的是浏览器窗口对象,顶层对象是一个含有实际意义的对象也不合适。ES6为了改变这一点,一方面规定,为了保持兼容性,var
命令和function
命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let
命令、const
命令、class
命令声明的全局变量,不属于顶层对象的属性。也就是说,从ES6开始,全局变量将逐步与顶层对象的属性脱钩。
global对象:浏览器里顶层对象是window,但是node与web worker没有window对象;浏览器和web worker中self指向顶层对象,但是node里面没有self;在node中顶层对象是global,其他的环境都不支持。
兼容顶层对象的方法:
// 方法一
(typeof window !== 'undefined'
? window
: (typeof process === 'object' &&
typeof require === 'function' &&
typeof global === 'object')
? global
: this);
// 方法二
var getGlobal = function () {
if (typeof self !== 'undefined') { return self; }
if (typeof window !== 'undefined') { return window; }
if (typeof global !== 'undefined') { return global; }
throw new Error('unable to locate global object');
};
变量的解构赋值:ES6允许按照一定的模式,在数组与对象中提取值,对变量赋值,这被称作变量的解构赋值。
之前变量声明的方式var a = 1,b = 2,c = 3;
ES6允许 let [a,b,c] = [1,2,3] //a=1;b=2;c=3
let [first, ...other] = [1,2,3,4] //first=1;other = [2,3,4]
let [x,y] = [1,2,3,4] //x=1;y=2 这种方式是不完全解构,但是可以成功
本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。如果解构不成功,变量的值就等于undefined
;对于Set结构,也可以使用数组的解构赋值;解构赋值允许指定默认值。
解构不仅可以解构数组,还可以解构对象:let {name:aa} = {name:rancheer,age:23} //aa = rancheer
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
如果变量名与属性名不一致:
let obj = {first:rancheer,second:allen}
let {first:f,second:s} = obj
f //rancheer
s//allen
对象嵌套解构:
let obj = {
p:[
'hello',
{w: 'world'}
]
}
let {p:[h, {w}]} = obj
h //hello
w//world
对一个已经声明的变量解构要注意在解构赋值语句外面添加()避免被JavaScript引擎认为是代码块
let x;
({x} = {x:1})
字符串的解构赋值:把字符串转化成一个类数组的方式进行解构
const [a,b,c,d,e] = 'hello'
a//h
b//e
c//l
d//l
e//o
类似数组的对象都有一个length
属性,因此还可以对这个属性解构赋值。let {length:len} = 'hello' //len = 5
函数参数的解构赋值:
function add([a, b]){
return a+b
}
add([2,3]) //5
let obj = [[1,2],[3,4]]
obj.map(([a,b])=>a+b); //[3,7]
undefined会触发属性的默认值 [1,undefined,3].map((x = 'yes')=>x) //[1,yes,3]
变量的解构赋值用途:
交换变量:let obj = [x,y]; [y,x] = obj
[x,y] = [y,x]
可以从函数中返回多个值:数组与对象
数组:
function getData(){
return [1,2,3];
}
var [a,b,c] = getData();
对象:
function getData(){
return {
name:rancheer,
age:23
}
}
var {name,age} = getData();
提取json数据:
var jsonData = {
name:rancheer,
age:23,
data:[a,b,c,d,e]
}
let {name,age,data:datas} = jsonData;
console.log(name,age,datas) //rancheer,23,[a,b,c,d,e]
函数参数的默认值:
jQuery.ajax = function(url,{async = false,cache = false,},{...})
变量map解构:
var map = new Map();
map.set('name','rancheer');
map.set('age',23);
for(let [key,value] of map){console.log('key: '+ key +' value: '+ value)}
//key:name value:rancheer;
//key:age value:23;
ES6学习笔记一的更多相关文章
- es6学习笔记-class之一概念
前段时间复习了面向对象这一部分,其中提到在es6之前,Javasript是没有类的概念的,只从es6之后出现了类的概念和继承.于是乎,花时间学习一下class. 简介 JavaScript 语言中,生 ...
- ES6学习笔记<五> Module的操作——import、export、as
import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...
- ES6学习笔记<四> default、rest、Multi-line Strings
default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
- ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring
接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...
- ES6学习笔记<一> let const class extends super
学习参考地址1 学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...
- ES6学习笔记之块级作用域
ES6学习笔记:块级作用域 作用域分类 全局作用域 局部作用域 块级作用域 全局作用域示例 var i=2; for (var i = 0; i < 10; i++) { } console.l ...
- ES6学习笔记之变量的解构赋值
变量的解构赋值 ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构. 数组的解构赋值 以前,为变量赋值,只能直接指定值: 1 2 3 var a = 1; var b = 2; ...
- ES6学习笔记(三):教你用js面向对象思维来实现 tab栏增删改查功能
前两篇文章主要介绍了类和对象.类的继承,如果想了解更多理论请查阅<ES6学习笔记(一):轻松搞懂面向对象编程.类和对象>.<ES6学习笔记(二):教你玩转类的继承和类的对象>, ...
- JS&ES6学习笔记(持续更新)
ES6学习笔记(2019.7.29) 目录 ES6学习笔记(2019.7.29) let和const let let 基本用法 let 不存在变量提升 暂时性死区 不允许重复声明 块级作用域 级作用域 ...
随机推荐
- [LeetCode] Word Search II 词语搜索之二
Given a 2D board and a list of words from the dictionary, find all words in the board. Each word mus ...
- NPOI操作EXCEL(四)——反射机制批量导出excel文件
前面我们已经实现了反射机制进行excel表格数据的解析,既然有上传就得有下载,我们再来写一个通用的导出方法,利用反射机制实现对系统所有数据列表的筛选结果导出excel功能. 我们来构想一下这样一个画面 ...
- Android SharedPreferences公共类sharedhelper
SimpAndroidFarme是近期脑子突然发热想做的android快速开发的框架,目标是模块化 常用的控件,方便新手学习和使用.也欢迎老鸟来一起充实项目:项目地址 sharedpreference ...
- SpringBoot揭秘:快速构建微服务体系
chapter 2: 饮水思源:回顾与探索Spring框架本质 IoC其实有两种方式,一种是DI(dependency Injection),一种是DL(dependency Lookup 依赖查找, ...
- blog (后续更新)
设计Model(设计数据库) from django.db import models # Create your models here. class BlogsPost(models.Model) ...
- 使用ARP欺骗, 截取局域网中任意一台机器的网页请求,破解用户名密码等信息
ARP欺骗的作用 当你在网吧玩,发现有人玩LOL大吵大闹, 用ARP欺骗把他踢下线吧 当你在咖啡厅看上某一个看书的妹纸,又不好意思开口要微信号, 用arp欺骗,不知不觉获取到她的微信号和聊天记录,吓一 ...
- 【USACO 3.2】Sweet Butter(最短路)
题意 一个联通图里给定若干个点,求他们到某点距离之和的最小值. 题解 枚举到的某点,然后优先队列优化的dijkstra求最短路,把给定的点到其的最短路加起来,更新最小值.复杂度是\(O(NElogE) ...
- Gc.Db之循序渐进
距离上次写Gc.Db框架已经有一段时间了,最近默默对框架代码已经做了不少优化和功能,且已经提交至nuget,大家如果想使用此框架,可以通过nuget搜索:Gc.Db进行下载和安装包. 本篇文章主要是介 ...
- jquery中ajax用return来返回值无效
jquery中,ajax返回值,有三种写法,只有其中一种是成功的 /** * async:false,同步调用 * 返回1:2 * 失败 * 分析:ajax内部是一个或多个定义的函数,ajax中ret ...
- WebForm业务系列-会员功能
用了这么久的webform,还记得刚开始根本不知道程序要写成什么样,只知道功能实现了就行,有很多现实的问题都没考虑到.所以程序改了又改,最后连自己做的什么都不知道了.所以,现在来总结一下. 会员功能 ...