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中识别函数是有挑战性的,因为你可以使用各种方式来定义一个函数.匿名函数表达式的流行使用导致函数调试困难,在栈信息中难以找出函数名. ...
随机推荐
- JavaScript之更改闭包内的变量值
var f = function( ) { var x = 1 function fo() { console.log( x++ ) } return fo } var fn = f() fn() ...
- 解题报告 『[NOI2003]逃学的小孩(树上操作)』
原题地址 今天翻看集训队巨佬写的一篇有关于树形动规的论文时看到了这道题,但感觉并不需要用动规,求出树的直径再暴力枚举一下就搞出来了. 其实是因为我太弱了,看不懂大佬在写什么orz 代码实现如下: #i ...
- django 分页组件
一.仿django分页功能自己实现 urls.py 1 2 3 4 5 6 7 8 9 from django.conf.urls import url from django.contrib i ...
- vue的渐进式理解
链接:https://www.zhihu.com/question/51907207/answer/136559185 渐进式代表的含义是:主张最少. 每个框架都不可避免会有自己的一些特点,从而会对使 ...
- SSL Certificate Signed Using Weak Hashing Algorithm 和SSL Medium Strength Cipher Suites Supported的解决方案
这两天有个项目被扫描器报了几个中危,都是SSL证书的问题.记录一下解决方案吧. 第一个问题:SSL Certificate Signed Using Weak Hashing Algorithm 这里 ...
- mybatis 中javaType和OfType 的区别
JavaType和ofType都是用来指定对象类型的,但是JavaType是用来指定pojo中属性的类型,而ofType指定的是映射到list集合属性中pojo的类型.pojo类: publiccla ...
- JNI加载hal的dlopen()相关操作
1.函数集合 #include <dlfcn.h> void *dlopen(const char *filename, int flag); char *dlerror(void); v ...
- dic and set
一.dic 1.格式:key:value 2.key值必须不可变(可hash) 3.key不可重复(唯一性) 4.优点:查找.插入速度快 5.缺点:空间消耗大 6.实质是以空间换速度 7.常用参数 1 ...
- Centos7安装Docker CE
每次安装Docker都要去找文档,或者每次安装的都不一样,还是要好好管理自己的这些东西,下次用的时候可以省很多的时间 Docker的早期版本称为docker或docker-engine:现在的 ...
- Ansible 之动态Inventory文件(二)
上篇主要讲解了Ansible 的安装和配置,并且根据不同的业务场景将服务器的信息存放在Ansible的Inventory中,其实存放这样的数据每次更新都需要我们自动的添加和删除,这样对于我们维护起来很 ...