以下内容,是一些常用的ES6语法,并不是全部的喔~ 推荐网址(https://www.babeljs.cn/)将ES6语法兼容旧浏览器的写法
概述
ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准,已经在 2015 年 6 月正式发布了。
它的目标,是使得 JavaScript 语言可以用来编写复杂的大型应用程序,成为企业级开发语言。
ES6 既是一个历史名词,也是一个泛指,含义是 5.1 版以后的 JavaScript 的下一代标准,涵盖了 ES2015、ES2016、ES2017 等等,而 ES2015 则是正式名称,特指该年发布的正式版本的语言标准。
提到 ES6 的地方,一般是指 ES2015 标准,但有时也是泛指“下一代 JavaScript 语言”。
let
let特点:
1、没有变量提升
例如:
console
.log(age
);
let age
=38;
-----------------------------------------------------------------------------------------
2、有块级作用域
例如:
for(let i
=0;i
<10;i
++){
}
console
.log(i
)
ES6 允许块级作用域的任意嵌套,例如:
{{{{
let insane
= 'Hello World';
{let insane
= 'Hello World'}
}}}};
-----------------------------------------------------------------------------------------
3、不能重复声明
let num
=10;
let num
=20;
console
.log(num
)
----------------------------------------------------------------------------------------=
4、可以重新赋值
let num
=10;
num
=20;
console
.log(num
)
-----------------------------------------------------------------------------------------
5、暂时性死区
只要块级作用域内存在
let命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var tmp
= 123;
if (true) {
tmp
= 'abc';
let tmp
;
}
上面代码中,存在全局变量tmp,但是块级作用域内
let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在
let声明变量前,对tmp赋值会报错。
ES6 明确规定,如果区块中存在
let和
const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
总之,在代码块内,使用
let命令声明变量之前,该变量都是不可用的。
这在语法上,称为“暂时性死区”(temporal dead zone,简称
TDZ)。
=========================================================================================
var特点:
1、有变量提升
2、没有块级作用域,是函数作用域
3、可以重复声明
4、可以重新赋值
const
const 关键字声明的常量(一旦声明就无法更改)
1、没有变量提升
2、有块级作用域
3、不能重复声明
4、不能重新赋值(声明必须要有初始值)
5、同样存在暂时性死区
const foo
= {};
foo
.prop
= 123;
foo
.prop
foo
= {};
上面代码中,常量foo储存的是一个地址,这个地址指向一个对象。
不可变的只是这个地址,即不能把foo指向另一个地址,但对象本身是可变的,所以依然可以为其添加新属性。
对象解构赋值
ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。
对象可以不按顺序赋值,只要找到对应的属性便可以
1、
ES6写法
let obj
={
name
:"jine",
age
:22,
mvp
:"hha"
}
let {name
:name1
,age
:age1
}=obj
-----------------------------------------------------------------------------------------
变量名可与对象属性名一致
let {name
:name
,age
:age
}=obj
-----------------------------------------------------------------------------------------
如果声明的变量名和对象属性名一致,可以简写,例如:
let{name
,age
}=obj
-----------------------------------------------------------------------------------------
若出现变量名没有和对象属性名一致,只会声明一个空变量,例如:
let{name
,age
,other
}=obj
console
.log(name
,age
,other
)
-----------------------------------------------------------------------------------------
若出现变量名和对象属性名有的相同,有的不同,可以一下写法,例如:
let{name
,age
,mvp
:other
}=obj
console
.log(name
,age
,other
)
-----------------------------------------------------------------------------------------
若对象属性值已有,在声明相同的变量来进行赋值并不会覆盖(如下age)
若声明的变量没有对应的对象属性,可以给这个变量初始化值,便不会出现undefined(如下height),例如:
let{name
,age
=18,other
,height
=175}=obj
console
.log(name
,age
,height
)
=========================================================================================
2、
ES5写法
var obj
={
name
:"jine",
age
:22
}
var name1
=obj
.name
var age1
=obj
.age
数组解构赋值
数组顺序进行依次赋值
1、
ES6写法
let arr
=[10,20,30]
let [num1
,num2
,num3
]=arr
console
.log(num1
,num2
,num3
)
let [num1
,num2
,num3
,num4
]=arr
console
.log(num1
,num2
,num3
,num4
)
let [num1
,num2
,num3
,num4
=40]=arr
console
.log(num1
,num2
,num3
,num4
)
let [num1
=100,num2
,num3
,num4
=40]=arr
console
.log(num1
,num2
,num3
,num4
)
=========================================================================================
2、
ES5写法
var arr
=[1,2,3]
var a
=arr
[0]
var b
=arr
[1]
var c
=arr
[2]
解构赋值结合函数声明
function test1({name
,age
}){
console
.log(name
,age
)
}
test1({
name
:"jine",
age
:20,
})
箭头函数
匿名函数的简写,但是这样写法的
this指向和以前写法的
this指向不一样
简写规则
:
a
.function改成
=> => 可以读成goesto
b
.如果只有一个形参,那就可以省略形参小括号
.
C.如果不是一个形参
,0个或者多个形参,那就不能省略这个形参小括号了
d
.如果函数体只有一句话, 那就可以省略函数体的大括号
e
.如果函数体只有一句话
,并且这一句话是
return返回值
,那
return也要省略
f
.如果函数体不是一句话,那就不能省略这个大括号
.
-----------------------------------------------------------------------------------------
由规则b,d,例如:
let fun=function(name
){
console
.log("name:"+name
)
}
let fun=name
=>console
.log("name:"+name
)
fun("jine")
-----------------------------------------------------------------------------------------
由规则c
,d,例如:
let fun=function(name
,age
){
console
.log(name
,age
)
}
let fun=(name
,age
)=>console
.log(name
,age
)
fun("jine",22)
-----------------------------------------------------------------------------------------
由规则a
,d
,e,例如
:
let fun=function(name
){return name
}
let fun=name
=>name
console
.log(fun("jine"))
-----------------------------------------------------------------------------------------
由规则c,f,例如:
let fun=function(name
,age
){
console
.log(name
)
console
.log(age
)
}
let fun=(name
,age
)=>{
console
.log(name
)
console
.log(age
)
}
fun("jine",22)
-----------------------------------------------------------------------------------------
"需要注意的是:
let fun=name
=>
console
.log(name
)
"这样也是可以的,虽然换行了,但是因为有箭头,所以不是结束,所以还会输出name"
对象成员的简写
let name
="jine"
let age
=20
let obj
={
name
,
age
,
printf(){
console
.loe(name
,age
)
}
}
obj
.printf()
-----------------------------------------------------------------------------------------
以下写法会报错,例如:
let obj
={
name
,
age
,
score
,
printf(){
console
.log(name
,age
,score
)
}
}
obj
.printf()
-----------------------------------------------------------------------------------------
let obj
={
name
:1,
age
,
score
:age
+58,
printf(){
console
.log(this.name
,age
,this.score
)
}
}
obj
.printf()
展开运算符
对象展开
let Person
={
name
:"jine",
age
:22,
printf(){
console
.log(this.name
,this.age
)
}
}
let Fun
={
song
:"歌唱",
jump
:"跳跳"
}
let Jine
={
...Person
,
...Fun
,
jump
:"不跳了"
}
console
.log(Jine
)
数组展开
可以做数组拼接
也可求max值等
let arr1
=[1,2,3]
let arr2
=[4,5,6]
let arr3
=[...arr1
,...arr2
]
console
.log(arr3
)
let max1
=Math
.max(arr3
)
console
.log(max1
)
let max2
=Math
.max(...arr3
)
console
.log(max2
)
数据类型 Set
作用:和数组类似,和数组不同的是不能存放重复的元素
应用场景:数组去重
Set测试,例如:
let set1
=new Set([10,20,30,10,20,40])
console
.log(set1
)
-----------------------------------------------------------------------------------------
数组去重,例如:
let arr
=[1,2,3,1,2,4,5]
let set2
=new Set(arr
)
console
.log(set2
)
let newArr
=[...set2
]
console
.log(newArr
)
模板字符串
语法:
``(使用反引号标识)
作用:类似于python的多行字符串(
ES5是没有多行字符串)
特点:
1、可以在模板字符串中调用变量或函数。
2、模板字符串中的所有的空格和缩进也都会保留。
可以在模板字符串中调用变量,例如:
let author
="----jine"
let strs
=
`
我要开始输入啦,
这是第二段的字符串输入,
这便是多行字符串的输入. Noproblem~
${author}
`
console
.log(strs
)
-----------------------------------------------------------------------------------------
也可以在模板字符串中写调用函数,例如
let fun=()=>"我是一个小函数~"
console
.log(`我也可以调用函数哟:${fun()}`)
数组的方法
forEach() 可以替换以前用的
for循环
作用:循环遍历,把遍历出来的每一项交给回调函数,无返回值
例如:
let arr
=[1,2,3]
let ret
=arr
.forEach(function(item
,index
){
console
.log(index
,item
)
return "返回值"
})
console
.log(ret
)
-----------------------------------------------------------------------------------------
map() 循环遍历,与forEach()类似,唯一不同的是map()有返回值
let arr
=[1,2,3]
let ret
=arr
.map(function(item
,index
){
console
.log(index
,item
)
return item
*item
})
console
.log(ret
)
返回属性的值,例如:
let arr
=[{name
:"jine",age
:18},{name
:"ren",age
:22},{other
:"其他",age
:23}]
let ret
=arr
.map((item
,index
)=>item
.name
)
console
.log(ret
)
-----------------------------------------------------------------------------------------
filter() 过滤器
作用:返回一个新的数组,新的数组中的元素是通过检查后符合条件的元素
过滤偶数,例如:
let arr
=[1,2,3,4,5,6]
let ret
=arr
.filter((item
,index
)=>item
%2==0)
console
.log(ret
)
过滤指定元素,例如:
let arr
=[{name
:"jine",age
:18},{name
:"ren",age
:22},{other
:"其他",age
:23}]
let ret
=arr
.filter((item
,index
)=>item
.name
)
console
.log(ret
)
数组去重
1、排序后判断法
let arr
=[10,20,30,30,20,40,50,10,20]
let arrNew
=[]
arr
.sort((a
,b
)=>{
return a
-b
})
console
.log(arr
)
arr
.forEach((item
,index
)=>{
if(item
!=arr
[index
+1]){
arrNew
.push(item
)
}
})
console
.log(arrNew
)
=========================================================================================
2、使用对象法,数组去重
let arr
=[10,20,30,30,20,40,50,10,20]
let arrNew
=[]
let obj
={}
arr
.forEach(item
=>{
if(obj
[item
]==undefined
){
arrNew
.push(item
)
obj
[item
]='value'
}
})
console
.log(arrNew
)
数组升维
let arr
=[
{type
:'电子产品',name
:'iPhone',price
: 8888},
{type
:'家具',name
:'桌子',price
: 100},
{type
:'食品',name
:'瓜子',price
: 10},
{type
:'家具',name
:'椅子',price
: 380},
{type
:'电子产品',name
:'小米手机',price
: 1380},
{type
:'食品',name
:'辣条',price
: 5},
{type
: '食品',name
:'咖啡',price
: 50}
];
let obj
=[]
let arrNew
=[]
arr
.forEach(v
=>{
if(obj
[v
.type
]==undefined
){
obj
[v
.type
]='value'
arrNew
.push({
type
:v
.type
,
data
:[v
]
})
}
else{
arrNew
.forEach((v2
,j
)=>{
if(v
.type
==v2
.type
){
arrNew
[j
].data
.push(v
)
}
})
}
})
console
.log(arrNew
)
数据类型 Set
作用:和数组类似,和数组不同的是不能存放重复的元素
应用场景:数组去重
Set测试,例如:
let set1
=new Set([10,20,30,10,20,40])
console
.log(set1
)
-----------------------------------------------------------------------------------------
数组去重,例如:
let arr
=[1,2,3,1,2,4,5]
let set2
=new Set(arr
)
console
.log(set2
)
let newArr
=[...set2
]
console
.log(newArr
)