ES6基础总结(上)
1. let关键字
let关键字是ES6中新增的用来取代var声明变量的关键字
1.2 let声明的变量只在所处于的块级作用域(一对大括号产生的作用域)有效
if(true){
let a=10;
var b=20;
}
console.log(a);
console.log(b);
1.3 还可以防止循环变量变成全局变量
for(let i=0;i<2;i++){
}
console.log(i);
注意:使用let关键字声明的变量具有块级作用域,使用var关键字不具有该特点
1.4 不存在变量提升,必须先声明在使用
console.log(a);
let a=20;
1.5 暂时性死区
在块级作用域内使用let关键字声明的变量,会被整体绑定到这个块级区域内,不再受外部代码影响
2. 变量的解构赋值
ES6允许按照一定模式从数组和对象中提取值,对变量进行赋值。
2.1 数组的解构
const F4=['zz','xx','cc'];
let [z,x,c]=F4;
console.log(z);
console.log(x);
console.log(c);
2.2 对象的解构
const zhao={
name:'zz',
age:22,
xiaopin:function(){
console.log("111");
}
}
let {name,age,xiaopin}=zhao;
console.log(name);
console.log(age);
console.log(xiaopin);
xiaopin();
3. 模板字符串
ES6引入新的声明字符串的方式 ``
3.1 声明
let str=`新的字符串`;
console.log(str,typeof str);
3.2 内容可以直接出现换行符
let str=`<ul>
<li>11</li>
<li>22</li>
<li>33</li>
</ul>`;
3.3 变量拼接
let lovest='zz';
let out=`${lovest}11111`;
console.log(out);
4. 简化对象的写法
ES6允许在大括号里面,直接写入变量和函数,作为对象的属性和方法
let name='zz';
let change=function(){
console.log('111');
}
const school={
name,
change,
import(){
console.log("222");
}
}
console.log(school);
5. 箭头函数
ES6允许我们使用 箭头 (=>) 定义函数
let fn=(a,b)=>{
return a+b;
}
let result=fn(1,2);
console.log(result);
5.1 箭头函数的特性
5.1.1 this 是静态的,this 始终指向函数声明时所在作用域下的 this 的值
function getName(){
console.log(this.name);
}
let getName1=()=>{
console.log(this.name);
}
window.name='zz';
const school={
name:'xx';
}
getName();
getName1();
getName.call(school);
getName1.call(school);
总结: 因此,箭头函数的this指向永远都是在该函数所声明的作用域下,任何方法都不会改变,因为箭头函数的this是静态的。
5.1.2 不能作为构造函数去实例化对象
const Person=(name,age)=>{
this.name=name;
this.age=age;
}
let me=new Person('zz',22);
console.log(me);
5.1.3 不能使用 arguments 变量
我们通常会在函数内部使用 arguments 来保存实参
let fn=()=>{
console.log(arguments);
}
fn(1,2,3);
5.1.4 箭头函数的简写
let add=n=>{
return n+n;
}
let num=add(2);
console.log(num);
- 2)省略花括号:当代码体只有一条语句的时候,此时return必须省略,而且语句的执行结果就是函数的返回值
let pow=n=>n*n;
console.log(pow(3));
5.1.5 案例
<div id="ad"></div>
<script>
let ad=document.querySelector('#ad');
ad.addEventListener('click',function () {
setTimeout( () => {
this.style.background='pink';
},2000)
})
</script>
<div id="ad"></div>
<script>
const arr=[2,3,4,5,6,7,8];
const result=arr.filter(item=>item%2===0);
console.log(result);
</script>
箭头函数适用于与 this 无关的回调,定时器,数组的方法回调 箭头函数不适合与 this 有关的回调,事件回调,对象的方法
6. 函数参数的默认值设置
ES6允许给函数的参数赋予初始值,具体是指形参
6.1 形参的初始值,具有默认值的参数,一般位置靠后
function add(a,b,c=10){
return a+b+c;
}
let result=add(1,2);
console.log(result);
6.2默认值可以与解构赋值结合
function connect({host='127.0.0.1',username,password,port}){
console.log(host);
console.log(username);
console.log(password);
console.log(port);
}
connect({
username:'root',
password:'root',
port:3306
})
7. rest参数
ES6 引入 rest 参数,用于获取函数的实参,用来代替 arguments
7.1 ES5获取实参的方式,获取到的是一个对象不是一个数组
function fun(){
console.log(arguments);
}
fun(1,2,3);
7.2 ES6的 rest 参数
function data(...args) {
console.log(args);
}
data('1','2','3');
res 参数必须放到参数的最后,如果有多个参数就必须放到参数的最后
function fn(a,...args,b) {
console.log(a);
console.log(b);
console.log(args);
}
fn('1','2','3','4');
8. 扩展运算符
扩展运算符 … 该运算符能够将数组转换为逗号分割开的参数序列
const arr=['11','22','33','44'];
function fn(){
console.log(arguments);
}
fn(...arr);
虽然扩展运算符 … 和我们的res参数 … 一样,但是使用的方式不一样,res 是使用在函数的形参里面,并且是最后一个形参,而扩展运算符 … 则使用在我们函数调用的实参里面。
8.1 扩展运算符的应用
const arr=['11','22'];
const arr1=['33','44'];
const add=[...arr,...arr1];
console.log(add);
const arr2=['55','66'];
const arr3=[...arr2];
console.log(arr3);
<div></div>
<div></div>
<div></div>
<script>
let div=document.querySelecter('div');
let divs=[...div];
console.log(divs);
</script>
9. Symbol的介绍与创建
ES6引入了一种新的数据类型Symbol,表示独一无二的值,他是JavaScript的第七中数据类型,是一种类似于字符串的数据类型。 Symbol特点:
-
- Symbol的值是唯一的,用来解决命名冲突的问题
-
- Symbol值不能与其他数据进行运算
-
- Symbol定义的对象属性不能适用 for…in 循环遍历,但是可以使用 Reflect.ownKeys 来获取对象的所有键名
let s=Symbol();
let s1=Symbol('zz');
let s2=Symbol('zz');
console.log(s1=== s2);
let s3=Symbol.for('cc');
let s4=Symbol.for('cc');
console.log(s3===s4);
七种数据类型 Number Null String Symbol Object Boolean Undefined
9.1 Symbol创建对象属性
Symbol的作用就是表示独一无二的值,表示给对象添加属性和方法 向对象中添加方法 up down
let game={
};
let youxi={
name:'333',
[Symbol('say')]:function(){
console.log('444');
},
[Symbol('zibao')]:function(){
console.log('555');
}
};
console.log(youxi);
10. 迭代器
迭代器是一种接口,为各种不同的数据结构提供统一的访问机制,任何数据解构只要部署iterator解构,就可以完成遍历操作 1) ES6创造了一种新的遍历命令 for…of 循环,iterator 接口主要提供 for…of 进行遍历 补充: for in 语法里面 in 前面的变量在遍历后保存的是键名 for of 语法里面 of 前面的变量在遍历后保存的是键值 2) 原生具备 iterator 接口的数据(可用 for of 遍历) a) Array b) Arguments c) Set d) Map e) String f) TypedArray g) NodeList 3) 工作原理 a) 创建一个指针对象,指向当前数据结构的起始位置
const arr=['11','22','33'];
const iterator=arr[Symbol.iterator]();
console.log(iterator);
b) 第一次调用对象的next方法,指针自动指向数据结构的第一个成员
const arr=['11','22','33'];
const iterator=arr[Symbol.iterator]();
console.log(iterator.next());
c) 接下来不断调用next方法,指针一直往后移动,直到指向最后一个成员
const arr=['11','22','33'];
const iterator=arr[Symbol.iterator]();
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
d)每调用next方法返回一个包含value和done属性的
**注意:**当需要自定义遍历数据时,要想到迭代器
|