简介
ES全称ECMAScript,是脚本语言的规范,而JavaScript是ES的一种实现,所以ES的新特性也可以叫作JavaScript的新特性。
为啥要学习:
- 语法简洁,功能丰富。
- 利用框架开发应用,例如利用Vue进行前端开发,需要使用很多ES6的知识。
为什么要专门学习ES6:
- ES6是ES版本中变动内容最多的,具有里程碑式意义。
- ES6加入了许多新的语法特性,编程实现更简单、高效。
特性一:let关键字
let关键字是用于声明变量的,类似于var,但是他有些特殊的特性。
- 用let声明的变量不能重复声明:
结果:
结果:
结果:var声明的变量可以在该变量声明前使用,只是没有赋值undefined。 let效果: 结果:
const关键字
const关键字是用于声明常量的,也就是声明时就要赋值,并且之后再也不能更改。 结果: 不能改变: 这里的不能修改是指,如果是基本类型,那么就不能对其值进行修改,如上面的例子,如果是对象或者数组的换,就不能对对象或者数组的引用进行修改,但是可以对其元素进行修改。
结果: 可以对内部元素进行修改:
const一般用于声明对象,let用于声明基本数据类型。
解构赋值
ES6允许按照一定的模式从数组或者对象中提取值,对变量进行赋值,称为解构赋值。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>解构赋值</title>
</head>
<body>
<script>
const arr = [1,2,3,4];
let [one,two,three,four] = arr;
console.log(one);
console.log(two);
console.log(three);
console.log(four);
const obj = {
name:"yehaocong",
sex:"男",
age:25,
fun:function() {
console.log("哈哈哈");
}
};
let {name,sex,age,fun} = obj;
console.log(name);
console.log(sex);
console.log(age);
console.log(fun);
fun();
</script>
</body>
</html>
结果:
声明字符串的方式 ``
声明字符串的方式有双引号、单引号。 ES6添加了一个 ``, 特性是可以换行和拼接方式有点不同: 用双引号或者单引号进行字符串定义时,换行会报错。 结果: 使用新的方式不会报错:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>字符串声明</title>
</head>
<body>
<script>
let strNew = `
<ul>
<li></li>
<li></li>
<li></li>
</ul>
`;
console.log(strNew);
let strNew3 = "<div>" + strNew + "</div>";
let strNew4 = `<div>${strNew}<div>`;
console.log(strNew3);
console.log(strNew4);
</script>
</body>
</html>
对象属性定义的优化
ES在定义对象属性时,如果属性名和属性值对应的变量的字符串是一样时,可以省略属性值。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>对象属性定义的优化</title>
</head>
<body>
<script>
let name = "yehaocong";
let age = 18;
function fun() {
console.log("aaaa");
}
const obj = {
name,
age,
fun
};
console.log(obj);
</script>
</body>
</html>
箭头函数
ES新增了一种定义函数的语法,箭头函数。
其他特性都在这个代码里面:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>箭头函数</title>
</head>
<body>
<script>
let fun1 = ()=>{
console.log("fun1");
};
fun1();
let fun2 = param => param*2;
console.log(fun2(1));
console.log("分隔================");
console.log("当前作用于的this=",this);
console.log("先验证call和apply无法使其改变this================================");
let fun3 = function(){
console.log("普通函数this=",this);
}
let fun4 = ()=>{
console.log("箭头函数this=",this);
}
const obj = {
name:"yehaocong",
age:25
}
fun3.call(obj);
fun3.apply(obj);
fun4.call(obj);
fun4.apply(obj);
console.log("验证this的取值不同================================");
let obj2 = {
name:"yehaocong",
fun1:function(){
setTimeout(function() {
console.log("对象obj里面使用延时器时的回调函数使用的是普通函数的this的取值=",this);
}, 1000);
},
fun2:function(){
setTimeout(() => {
console.log("对象obj里面使用延时器时的回调函数使用的是箭头函数的this的取值=",this);
}, 1000);
}
};
obj2.fun1();
obj2.fun2();
</script>
</body>
</html>
结果:配合代码、注释细细品味会大有收获。
箭头函数不能用做构造函数: 结果:
箭头函数没有参数列表属性argument: 结果:
ES6允许给函数参数赋默认值
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>函数参数赋默认值</title>
</head>
<body>
<script>
let fun1 = function(a,b=10){
return a + b;
}
console.log(fun1(5,15));
console.log(fun1(5));
</script>
</body>
</html>
结果:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>函数参数赋默认值</title>
</head>
<body>
<script>
let fun2 = function(a,b=10,c){
console.log(a);
console.log(b);
console.log(c);
}
fun2(1,2);
</script>
</body>
</html>
结果:所以一般最后用在最后面。
如果需要多个参数都需要默认值,最好配合解构使用,把解构形参放最后:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>函数参数赋默认值</title>
</head>
<body>
<script>
let fun3 = function(a,{name="1234",age,sex="男"}){
console.log(a);
console.log(name);
console.log(age);
console.log(sex);
}
fun3(1,{
age:18,
sex:"女"
})
</script>
</body>
</html>
结果:
可变参数
ES6引入可变参数rest来代替arguments参数列表。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>可变参数rest</title>
</head>
<body>
<script>
let fun1 = function(a,b){
console.log(a);
console.log(b);
console.log(arguments);
}
fun1(1,2,3,4);
let fun2 = function(a,b,...param){
console.log(a);
console.log(b);
console.log(param);
}
fun2(1,2,3,4,5,6);
</script>
</body>
</html>
结果: arguments与rest的区别有:
- arguments是隐形注入的参数,rest是显性定义的参数。
- arguments是类数组,实际是个对象,rest是个数组。
- arguments的值涵盖所有形参,而rest不会涵盖前面定义的形参,如果图,arguments涵盖了a、b形参,而rest没有。
可变参数如果不是最后一个就会报错
扩展运算符 …
扩展运行符 … 能够将数组转化为逗号分割列表。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>扩展运算符...</title>
</head>
<body>
<script>
let arr = [1,2,3,4];
let fun1 = function(){
console.log(arguments);
}
fun1(...arr);
fun1(arr[0],arr[1],arr[2],arr[3]);
console.log("数组合并============================");
let arr1 = [1,2,3,4];
let arr2 = [5,6,7];
console.log(arr1.concat(arr2));
console.log([...arr1,...arr2]);
console.log("数组克隆============================");
let arr3 = arr1;
console.log(arr3)
console.log(arr3===arr1);
let arr4 = [...arr1];
console.log(arr4)
console.log(arr4===arr1);
console.log("将伪数组转化为真正的数组============================");
let fun2 = function(){
console.log(arguments);
console.log("arguments是数组吗:",Array.isArray(arguments));
let arr = [...arguments];
console.log(arr);
console.log("arr是数组吗:",Array.isArray(arr));
}
fun2(1,2,3);
</script>
</body>
</html>
结果:
Set构造函数
ES6新增了一个内置构造函数Set,代表着集合,类似数组,但是他的元素是唯一的,不允许出现重复元素。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Set集合</title>
</head>
<body>
<script>
let setObj = new Set([8,9,10,10]);
setObj.add(1);
setObj.add(8)
console.log(setObj);
setObj.delete(8);
console.log(setObj);
console.log(setObj.size);
console.log(setObj.has(9));
console.log(setObj.has(8));
console.log("数组去重===================================");
let arr = [8,9,10,10,2,2,4,4];
let set1 = new Set(arr);
let arrNoRepeat = [...set1];
console.log(arrNoRepeat);
console.log("取交集===================================");
let set2 = new Set([1,2,3]);
let set3 = new Set([2,3,4,5]);
let andSet = [...set2].filter(item => set3.has(item));
console.log(andSet);
console.log("取并集===================================");
let set4 = new Set([1,2,3]);
let set5 = new Set([2,3,4,5]);
let setOr = [...new Set([...set4,...set5])];
console.log(setOr);
console.log("取差集===================================");
let set6 = new Set([1,2,3]);
let set7 = new Set([2,3,4,5]);
let diffSet = [...set6].filter(item => !(set7.has(item)));
console.log(diffSet);
</script>
</body>
</html>
结果:
Map结构
ES6提供了Map结构,类似对象,是键值对的集合,但是键的范围不限于字符串,各种类型,甚至对象都可以当key。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Map</title>
</head>
<body>
<script>
let map = new Map();
map.set("name","yehaocong");
console.log(map);
console.log(map.get("name"));
console.log(map.size);
console.log(map.has("name"));
console.log(map.has("yehaocong"));
console.log(map.keys());
console.log(map.values());
console.log(map.entries());
for(item of map){
console.log(item);
}
map.clear();
console.log(map);
</script>
</body>
</html>
结果:
Number方法扩展
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Number方法扩展</title>
</head>
<body>
<script>
console.log(Number.EPSILON);
console.log(Number.isFinite(200));
console.log(Number.isNaN(Number.parseInt("sad")));
console.log(Number.isInteger(12.23));
console.log(Math.trunc(123.45));
</script>
</body>
</html>
|