es6的理解
目录:
let——和var的区别
const
特性:暂时性死区
解构赋值
[]
{}
属性简洁
函数简洁
属性表达式可以作为对象的属性名
字符串扩展
数组扩展
对象扩展
Object.getPrototypeOf(实例对象)
Object.setPrototype()
new Proxy(实例,处理器)——new Proxy(obj,{get(){}})
Reflect.ownKeys(obj)
函数扩展
默认值
剩余参数——fn(arr,...data){}
扩展运算符 ...arr
箭头函数
参数
函数体
返回值
特性:this,arguments,不能是构造函数
数据结构
set
map
内容:
1. let——和var的区别
特性:
1.不允许重复申明,否则会报错
2.暂存死区(先申明后使用),没有预解析机制,在申明之前就是死区
3.支持快级作用域,比如if,for,switch...
{
let a=1;
}
console.log(a)
{}和闭包的区别
{}:因为支持块级作用域,所以类似闭包
闭包:函数套函数,并且外部可以访问内部变量。作用:内部函数可以访问外部函数的变量数据;当内部作为外部函数返回值返回,并被外部数据引用,那么函数内容数据会长期驻留内容,不被垃圾回收。
主要原因:(下面的例子)
for(var i=0; i<10;i++){
setTimeout(()=>{
console.log(i)//10个10
},100)
}
for(let i=0; i<10;i++){
//let i=0,本质上是在这边申明
setTimeout(()=>{
console.log(i)//0-9的数字
},100)
}
从两方面来解释:作用域和异步处理。
用var,setTimeOut是异步处理,if处理完之后,setTimeOut会等时间到了再执行,因为setTimeOut里面没有i,会根据作用域查找规则作用域链找i值,找到外面的i值,现在i值是10,所有打印了10个10。
用let,setTimeOut是异步处理,if处理完之后,setTimeOut会等时间到了再执行,因为setTimeOut里面没有i,会根据作用域查找规则作用域链找i值,找到外面的i值,因为let可以支持块级作用域,所以在里面会申明一个let。根据作用域链找了这个let。
2. const
特性:
1.不允许重复申明,否则会报错
2.暂存死区(先申明后使用),没有预解析机制,在申明之前就是死区
3.支持快级作用域,比如if,for,switch...
4.初始化必须赋值,要不然报错
const a=1;
3. 解构赋值
[]——内部其实走了两步:第一步申明变量,第二步赋值
特征:数组的解构赋值,位置需要一一对应
var arr1=[1,2,6,1];
//第一种方法,原始方法
var a=arr1[0];
var b=arr1[1];
var c=arr1[2];
var d=arr1[3];
//第er种方法,es6方法
var [a, b, c, d] = arr1;
console.log(a, b, c, d)
{}——
特征:对非数组的对象进行结构赋值,那么左侧变量的位置不在是一一对应的关系,而是key值对应
var obj1={width:'100px',height:'10px'};
//第一种,原始方法
var {width,height}=obj1
console.log(width,height) //100px 10px
//第二种,当key在之前出现过,出现重名冲突,我们可以自己定一个名字
var {width:w,height:h}=obj1
console.log(w,h) //100px 10px
涉及的知识:
a.属性简洁表示法/对象简洁表示法
当key与值(变量)名称相同的时候,可以简写
对象简洁表示法
var w=10;
var obj={
w:w
}
//value是变量的情况下,且key和value一样的情况,可以省略成
var obj={
w
}
函数简洁表示法
obj={
abc(){
}
} obj={
abc:function () {
}
}
b.属性表达式可以作为对象的属性名——因为:[]表达式,函数解析
var a='miao'
var obj={
[a]:1
}
console.log(obj) //{miao: 1}
4. 字符串扩展
模板字符串
var str='ddddd';
console.log(`显示字符 ${str}`); //显示字符 ddddd
5. 数组扩展
6. 对象扩展
Object.getPrototypeOf(实例对象)
Object.setPrototype()
分析:
之前我们可以用,实例._proto_取原型,但是浏览器不建议这样写,因为考虑到会出现赋值覆盖,原先的就找不到了,还考虑到数据结构统一性。
现在可以通过Object.getPrototypeOf(实例对象)获取原型。
new Proxy(实例,处理器)——相当于产生一个助理
作用:一个构造函数,通过Proxy构造创建一个对象的代理对象
意义:生成一个构造器,就不用直接操作原对象,想传什么属性,就可以传什么属性出来。在外面也可以修改
var newObj = (function() {
var obj = {
x: 10,
y: 100,
z: 1000
}; return new Proxy(obj, {//生成一个构造器
get(obj, property) {
if (property != 'x') {
return obj[property];
}
}
});
})();
newObj.c=33
console.log( newObj.c );//
Reflect.ownKeys(obj)——返回值是[key]组成的数组
和Object.keys类似
var obj = {
x: 10,
y: 100,
z: 1000
};
var re1=Reflect.ownKeys(obj)
console.log(re1)//["x", "y", "z"]
7. 函数扩展
默认值:es6可以通过形参来设置默认值
注意:有默认值的参数最好写在参数列表的最后面
//原始方法
function fn(x, y) {
//通过下面的方式来处理一个函数参数的默认值
var x = x || 1;
var y = y || 1;
console.log(x * y);
}
fn(); //es6的方法
/!*
* es6可以通过形参来设置默认值
* 注意:有默认值的参数最好写在参数列表的最后面
* *!/
function fn2(x, y=1) {
console.log(x * y);
}
剩余参数——fn(arr,...data){}
解释:函数第一个传入的是arr数组,后面是不定个数的参数,可以把不定的参数存在data数组里面,函数内部就可以方便调用了。
function fn(arr,...data) {
return arr.concat(data)
}
console.log(fn([3,2,1],9,0,8))//[3, 2, 1, 9, 0, 8]
8. 扩展运算符 ...
作用:和剩余参数功能相反——把数组变成参数列表,就是打散数组数据成单独单元。
应用:取数组里面的最大值
var arr1=[3, 2, 1, 9]
console.log(...arr1)//3 2 1 9
console.log(Math.max(...arr1))//
console.log(Math.max.apply(null,arr1))// console.log(...{x:1,y:2})//报错
9. 箭头函数
形式——省了function
参数列表=>函数体
var fn=(a)=>{
console.log(a)
}
参数
没有参数(),必须要用括号
一个参数(a)或 a,可以省略括号
二个几以上参数(a,b),必须要用括号
函数体
一句代码,可以省略{}
var fn=(a)=>console.log(a)
返回值
一句代码:可以省略return,执行结果就是返回值
其他形式:如果没有return,返回值就是undefined
注意:
如果仅有的一条语句是一个字面量对象,而且需要返回一个值,那么就必须加return,因为js不知道 {}是函数体的大括号,还是字面量对象的{}。
特性:
this,取决于申明期。普通函数this取决于执行期
arguments,没有,解决:用剩余参数...data
不能是构造函数,不能被new
注意:事件函数不要用箭头函数,this指向就不一定指向调用该事件的对象
10. 数据结构set
作用:集合,是js中新增一种数据结构,类似数组,但是Set中每一个数据是唯一的,不重复的
特征:不重复的,不能获取
创建:new Set( | [])
属性:
size。类似length
方法:
add()添加集合
clear()清空集合
delete()删除集合指定值
has()是否包含
forEach()
keys()
values()
entries()
var set1=new Set([5,6,8,2]);
console.log(set1)//{} | {5, 6, 8, 2}
console.log(set1.size)//
set1.add('a')
console.log(set1)//{5, 6, 8, 2, "a"}
set1.add(['ee','e'])
console.log(set1)//{5, 6, 8, 2, "a", …}
set1.clear()
console.log(set1)//{}*!/
console.log(set1.has(0))//false
set1.forEach(function (key,value) {
console.log(key,value)//value5,6,8...
})
console.log( set1.keys())//{5, 6, 8, 2, "a", …}
console.log( set1.values())//{5, 6, 8, 2, "a", …}
console.log( set1.entries())//{5, 6, 8, 2, "a", …}
应用:数组去重
解释:利用set数据不能重复的特性,将重复的数据剔除,并用扩展符...将set数据打散,最后将打散的数据用【】括起来。
var arr2=[5,7,3,9,1,5,7]
var re2=[...new Set(arr2)]
console.log(re2)//[5, 7, 3, 9, 1]
11. 数据结构map({}|[],值)
对象的key只能是字符串
key可以是任何,可以是对象
属性:
size : 返回成员总数。
方法:
set(key, value) : 设置一个键值对。
get(key) : 读取一个键。
has(key) : 返回一个布尔值,表示某个键是否在Map结构中。
delete(key) : 删除某个键。
clear() : 清除所有成员。
https://www.jianshu.com/p/287e0bb867ae
https://www.cnblogs.com/Wayou/p/es6_new_features.html
es6的理解的更多相关文章
- ES6简单理解基本使用
let const 原来的var声明标识符:可以重复声明,编译不报错. let,const声明标识符:不能重复声明,再声明编译报错. var声明的标识符作用域是当前函数,let和const是当前{块} ...
- 再唠叨JS模块化加载之CommonJS、AMD、CMD、ES6
Javascript模块化编程,已经成为一个迫切的需求.理想情况下,开发者只需要实现核心的业务逻辑,其他都可以加载别人已经写好的模块. Javascript社区做了很多努力,在现有的运行环境中,实现” ...
- Es6的那些事
现在看招聘网站上的要求,作为前端er~都要熟悉甚至精通(滑稽脸)es6,项目中也经常用,啥let,const,尤其是用react的同学,肯定对解构赋值不会陌生,今天逛淘宝前端的博客,看到一篇名为Es6 ...
- ES6深入浅出-4 迭代器与生成器-3.生成器 & for...of
迭代器平时用的很少.但是如果你是写框架的,你会经常用到迭代器. 生成器是专门用来做迭代器的东西 发布器是要产生一个叫做next的对象,如果你要产生这种对象.就可以使用ES6新出的语法. ES6的新语法 ...
- 每天学一点ES6(一)开始
最近学习vue,发现很多用法都不会了,虽然照猫画虎可以跑起来,但是总感觉很朦胧,是是而非的感觉不太好. 听说这些都是ES6的用法,所以决定要学习一下ES6 ES6 全称:ECMASctipt 6 简称 ...
- JavaScript中的文档模式和严格模式
JavaScript中的文档模式和严格模式 语法模式有普通模式和严格模式两种 普通模式:正常的JavaScript语法拼写以及代码编写(相对于严格模式存在着语法上的不严谨),尽可能的识别错误以及不规范 ...
- html、css简述面试题
hTML, HTTP,web综合问题 1.前端需要注意哪些SEO 合理的title.description.keywords:搜索对着三项的权重逐个减小,title值强调重点即可,重要关键词出现不要超 ...
- js 模块化的一些理解和es6模块化学习
模块化 1 IIFE 2 commonjs 3 浏览器中js的模块化 4 简单理解模块加载器的原理 5 es6 之前在参加百度前端技术学院做的小题目的时候,自己写模块的时候 都是写成立即调用表达式( ...
- 《理解 ES6》阅读整理:函数(Functions)(五)Name Property
名字属性(The name Property) 在JavaScript中识别函数是有挑战性的,因为你可以使用各种方式来定义一个函数.匿名函数表达式的流行使用导致函数调试困难,在栈信息中难以找出函数名. ...
随机推荐
- H5视频直播扫盲
H5视频直播扫盲 2016-05-25 • 前端杂项 • 14 条评论 • lvming19901227 视频直播这么火,再不学就out了. 为了紧跟潮流,本文将向大家介绍一下视频直播中的基本流程和主 ...
- 【软件构造】-<笔记>-浅谈java中类的初始化过程
编写java程序时,每创建一个新的对象,都会对对象的内容进行初始化. 每一个类的方法中的局部变量都有严格的初始化要求,因此假如写出下面的程序: void f(){ int i; i++; } 编译时就 ...
- eclipse与visualVM与mat
GC与CPU与内存的查看与分析 本文主要讲visualVM,MAT的下载配置;以及如何运用visualVM生成hprof文件;如何用visualVM分析CPU消耗,程序瓶颈在哪里;怎么用MAT导入hp ...
- 使用dotenv 管理nodejs 应用的环境变量&&docker-compose 运行
说明dotenv 是一个很方便的符合12 factor 的环境变量管理工具,使用很方便,实际上里面的代码也不是很多 测试使用docker 进行环境部署,为了方便分发使用pkg 进行打包,使用alp ...
- 解决openstack实例主机名后缀问题
参考地址https://ask.openstack.org/en/question/26918/change-novalocal-suffix-in-hostname/ 问题现象 可以看到主机名的后缀 ...
- oracle 的 exp 和imp命令
数据导出: 1 将数据库TEST完全导出,用户名gdoa 密码123 导出到D:\TEST_BK.dmp中 exp gdoa/123@TEST file=d:\TEST_BK.dmp full=y ...
- springmvc的dispatchservlet初始化
初始化做的事情,处理下controller的映射关系 https://blog.csdn.net/qq_38410730/article/details/79426673
- fiddler 按条件过滤
使用fiddler抓包过程中最希望获取自己想要的数据,不重要的信息最希望的是过滤,如果重要和不重要的数据都展示对我们在寻找资源的时候产生了很大的干扰,所以我们需要按条件过滤: 1.启用fiddler ...
- Spring Cloud(Dalston.SR5)--Config 集群配置中心-加解密
实际应用中会涉及很多敏感的数据,这些数据会被加密保存到 SVN 仓库中,最常见的就是数据库密码.Spring Cloud Config 为这类敏感数据提供了加密和解密的功能,加密后的密文在传输给客户端 ...
- 写好的Java代码在命令窗口运行——总结
步骤: 1.快捷键 win+r,在窗口中输入cmd,enter键进入DOS窗口. 2.假设写好的代码的目录为:D:\ACM 在DOS中依次写入:cd d: cd ACM 利用cd切换到代码文件所在的目 ...