导语
温故而知新,可以为师矣。及时地复习和总结我们学过的知识,不仅有利于知识的体系化,还有利于知识的深入理解。笔者也是一个前端技术迷,并且之前也系统的学习ES6一段时间,并对此有一些心得感悟。以下,我将深入浅出地与大家谈谈ES6,希望各位不吝点评。
1.let/const
- let
js中作用域分为:全局作用域、局部作用域、块级作用域 es6中的六种变量声明方法:var function let const import class.其声明的变量不会被提升;let不能重复声明;
console.log(a);//not define
console.log(b); //undefine
let a=110 ;//不能重复声明,不然会报错
var b=220;
复制代码
let声明的变量的作用域都是块级的,通常以{}来化分块级作用域;
if(true){
let =10;
}
console.log(a);//not define
复制代码
- const
const声明的变量的作用域是块级的,声明的变量需赋初始值,且不可改变,也不能提升。
if(ture){
console.log(PI);//not define
const PI=3.14;
PI=888;
console.log(PI);
}
console.log(PI);
复制代码
2.箭头函数
- 普通的函数
function f(x,y){
returen x*y;
}
console.log(f(2,3));//6
复制代码
- 箭头函数
var f=(x,y)=>{
return x*y;
}
console.log(f(2,3));//6
复制代码
如果箭头函数中只有一个形参,那么()可省略;如果函数体中只有一条语句(非return语句),{}也可省略;如果有return,而且只有一条语句,return和{}可省略。如下:
- 满足条件后,最简形式下的箭头函数
var f=x=> x*x;
console.log(f(3));//9
复制代码
3.js中形参可以拥有默认值
function f(x,y=10){
console.log(x,y); //1 10
return x+y
}
console.log(f(1));//11
复制代码
function f(x=10,y){
console.log(x,y);//1 undefine
return x*y;
}
console.log(f(1);//NaN
复制代码
4.变量的结构赋值
结构:从数组或对象中提取值,对变量进行赋值.如果左右结构不一样,具体对应细节看如下代码中所阐述的。
let [a,b,c,,d,e,f=12,g,[h]]=[1,2,3,4,5,6,[7],[8]]
console.log(a);//1
console.log(b);//2
console.log(c);//3
console.log(d);//5
console.log(e);//undefine
console.log(f);//6
console.log(g);//[7]
console.log(h);//8
复制代码
let [a,b,c,,d,e,f=12]=[]
console.log(a);//undefine
console.log(b);//undefine
console.log(c);//undefine
console.log(d);//undefine
console.log(e);//undefine
console.log(f);//undefine
console.log(g);//12
复制代码
5.数组扩展
- Array.from()可以将伪数组转化为真正的数组:类似数组和可遍历的对(包括ES6新增的数据结构Set和Map),是该构造器的静态方法。 Array.from(类数组对象) or Array.from(类数组对象,function(item,index){return})
var lis=document.getElementsByTagName("li");
var rs=Array.from(lis);
console.log(Array.isArray(rs));//true;
复制代码
- Array.of()将一组值转换为数组,弥补构造器 Array()的不足
var arr1=Array.of(3);
var arr2=Array.of("3");
console.log(arr1,arr2);//[3] ['3']
复制代码
- Array.find():用于找出第一个符合条件的数组元素,找不到则是undefined。格式:Array.find(function(item,index){return 条件;})
let arr=[{name:"zs1",score:90},
{name:"zs2",score:80},
{name:"zs3",score:100}
];
let rs1=arr.find(item=>item.name=="zs1");
let rs2=arr.find(item=>item.name=="zs4");
let rs3=arr.findIndex(item=>item.name=="zs3");
let rs4=arr.findIndex(item=>item.name=="zs4");
console.log(rs1,rs2);//{name:"zs1",score:90} undefined
console.log(rs3,rs4);//2 -1
复制代码
- Array.findIndex()第一个符合条件的数组元素的索引。找不到则是-1
- Array.includes()判断元素是否在数组中存在,返回值是 true|false
let a=[1,2,3];
a.includes(1);//true
a.includes("a");//false
复制代码
- Array.fill()给数组填充指定值. Array.fill(值) ;Arr.fill(值,起点,终点),填充时不包含终点。
let arr=new Array(5);
arr.fill("*");
let arr1=[1,2,4,5,7]
arr1.fill("hello",0,4)
console.log(arr);//['*','*','*','*','*']
console.log(arr1);//["hello", "hello", "hello", "hello", 7]
复制代码
- 数组的扩展运算符
var arr=[1,2,3];
var str="hello";
var arr2=[...str]
var arr1=[...arr]
console.log(arr1);//[1,2,3]
console.log(arr2);//["h", "e", "l", "l", "o"]
复制代码
6.字符串扩展
-
- 模版字符串
var age=10;
var name="Rose";
console.log(`${name} is my friend ,she is ${age} years old.`)//Rose is my friend ,she is 10 years old.
复制代码
-
- trim() 左右空格都是去掉 ;trimLeft 左空格去掉;trimRight 右空格去掉
-
- repeat(次数)重复字符串
-
- includes()是否包含某个元素,返回值为true or false
-
- startWith() 、endWith()分别为以哪些开始和结束,返回值为true or false
var str=" I am a student. ";
console.log(str.trim());//I am a student.
console.log(str.trimLeft());//I am a student.
console.log(str.trimRight());//I am a student.
console.log(str.repeat(5));// I am a student. I am a student. I am a student. I am a student. I am a student.
console.log(str.includes("am"));//true
console.log(str.startsWith(""),str.endsWith(""));//true true
console.log(str.padStart(20,2),str.padEnd(20,2));//222 I am a student. I am a student. 222
复制代码
7.set和map的数据结构
- set
- set类似于对象的数组,但是成员的值都是唯一的,没有重复的值;
- set构造方法可以接收数组为参数,也可以转化为数组,可用于去除数组中重复值;
- 用foreach遍历set数组,for of也可对其遍历。
- 删除数组中的元素用Set.delete()。
var s1=new Set([1,2,3,"true"]);
console.log(s1);// {1, 2, 3, "true"}
s1.add(5);
console.log(s1);//{1, 2, 3, "true", 5}
s1.add(3);
console.log(s1);//{1, 2, 3, "true", 5}
s1.forEach(item=>console.log(item));//1 2 3 true 5
for(var p of s1){
console.log(p);
}1 2 3 true 5
console.log(Array.isArray(s1));//false
console.log(Array.isArray(Array.from(s1)));//true
s1.delete("true");
console.log(s1);//{1, 2, 3, 5}
//数组去重
var arr1=[1,1,2,4,5,6,6,8];
arr2=[...(new Set(arr))];
console.log(arr2);//[1, 2, 4, 5, 6, 8]
复制代码
- map
- Map类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。
- 可以使用set方法添加元素。
- 通过get(键)获取键值,然而当键时引用数据类型时,要比较栈区中的地址
- 重复的键会覆盖
//创建Map
var m=new Map([
["a","hello"],
[1,123],
[[1,2,3],123]
]
);
//添加元素
m.set("false",false);
m.set("know",{true:"true"});
console.log(m);//{"a" => "hello", 1 => 123, Array(3) => 123, "false" => false, "know" => {…}}
//get()获取键值 然而当键时引用数据类型时
console.log(m.get("know"),m.get([1,2,3]));//{true: "true"} undefined
let a=[1,2,3];
m.set(a,{name:"wangcai"});
console.log(m.get(a));//{name: "wangcai"}
当键名重复时,会覆盖。
m.set("a",000);
console.log(m);//{"a" => 0, 1 => 123, Array(3) => 123, "false" => false, "know" => {…}, …}
复制代码
8.Class类
- 格式:class 类名{constructor(参数){ this.属性=参数;} method(){//对象中方法的简写,省略了function.} }
- 书写注意事项:class 是关键字,后面紧跟类名,类名首字母大写,采取的是大驼峰命名法则:类名之后是{};在{}中,不能直接写语句,只能写方法,方法不需要使用关键字,方法和方法之间没有逗号。不是键值对。
- 直接通过类名来访问的方法就是静态方法。如:Math.abs();这里的 abs()是静态方法。Array.isArray();isArray()是静态方法. 在方法名前加 static
class people{
constructor(name,age,height){
this.name=name;
this.age=age;
this.height=height;
}
static jump(){
console.log("我能跳100米");
}
say(){
console.log(`我是${this.name},年龄${this.age}岁,身高为${this.height}cm`);
}
}
var person=new people("Jack",40,180);
people.jump();//我能跳100米 【类的静态方法】
console.log(person.say());
复制代码
10.严格模式
-
- 严格模式的目的:规则,提高编译效率。
-
- 严格模式和非严格模式区别
-
- 在严格模式下不能使用没有var的变量
-
- 在严格模式下不能8进制的数字
-
- 在严格模式下不能把函数定义在if语句中
-
- 在严格模式下函数不能有重名的形参
-
- 在严格模式下不能arguments不再跟踪形参的变化
-
- 在严格模式下function中的this不指window,调用函数为undefined
-
- 在整个代码段中启动严格模式,还可以在一个函数中启动严格模式:
"use strict"
function f(a,b){
console.log(a,b);//66 666
console.log(arguments[0],arguments[1]);//66 666
arguments[0]=1111;
arguments[1]=2222;
console.log(a,b);//66 666
console.log( arguments[0],arguments[1]);//1111 2222
}
f(66,666);
复制代码