ES6

103 阅读5分钟

1, 什么是ES6 ?

     ES6实际上是一个泛指,代表ES2015及后续的版本

2, 为什么要使用ES6 ?

     新增功能的使用、标准化统一化

3, 块级作用域

      在ES6以前只有 全局作用域 和 局部作用域,ES6新增 块级作用域 { } 

4, let  新增变量声明的关键字

  • let 声明的变量只在所处的块级有效    具有块级作用域

      意义:在业务逻辑比较复杂时,防止内层变量覆盖外层变量。在循环时,防止循环变量(i)变成 全局变量,实际上,循环结束后,循环变量就没有存在的必要了。

  • 不存在变量提升,  必须先声明后使用 

  • 变量提升:函数声明和变量声明总是会被解释器悄悄地被"提升"到方法体的最顶部

  • JavaScript 只有声明的变量会提升,初始化的(var a = 100;)不会。

  • 暂时性死区

  • 暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

var temp = 100;
if(true){
	//  将报错, 一旦用let声明 变量, 变量将与 { } 块级作用域 绑定
	console.log(temp);
	let temp;
}
  • let 的经典面试题 , 关键点在于,前面使用的是全局作用域变量,后面i变为2时,前面的i也修改成了i, 而后面使用的是块级作用域变量,一次循环产生一个块级域,一共有2个,每个里面的i 互不干扰,所以输出 0,1;

  • 输出的为  2  2

  • 输出为 0  1

5,const 关键字

 作用: 声明常量, 常量是值(或内存地址)不能变化的量

  • ** 具有块级作用域   (同let)**
  • 声明常量时必须赋值 (常量一般都是大写字母
  • **常量赋值后,值(内存地址)不可以修改  {**对于复杂类型数据是可以修改的,地址(引用不可修改)}

6, 解构赋值 

    ES6中允许从数组中提取值,按照对应位置,对变量赋值。 对象也可以实现解构。

  • 数组解构   按照一一对应的关系从数组中提取值,然后将值赋给变量

  • 对象解构  属性与变量匹配,匹配成功时,将属性值赋值给变量

// 2,对象解构赋值
let obj = {
	id : 1,
	name:'周杰伦',
	age: 40
}
let {number, name, age} = obj;
console.log(number); // 匹配失败  undefined
console.log(name); // 匹配成功    周杰伦
console.log('================================='); 

// 可以给变量取别名
let{id:idNumber, name:starName, age: year} = obj ;

console.log(idNumber); // 匹配成功    1
console.log(name); // 匹配成功    周杰伦
console.log(starName); // 匹配成功    周杰伦

7, 箭头函数       新增定义函数的方式

作用: 简化函数定义语法 ()=>{  } 

<script type="text/javascript">
	let fn = () => {
		console.log('这时箭头函数体');
	};
	fn();
</script>
  • 当函数体只有一句话,且代码执行结果就是返回值时,可以不写大括号

    let sum = (a,b) => a+ b; console.log(sum(1,2));

  • 如果形参只有一个,可以省略小括号。

    const opp = flag => !flag ; console.log(opp(true));

  • 箭头函数不绑定this关键字, 箭头函数中的this,指向的是 函数定义位置上下文this,

8, 剩余参数

剩余参数语法允许我们将一个不定数量的参数表示为一个数组。

扩展运算符

<script type="text/javascript">
	const sum = (...args)=>{	
		let total = 0;
		args.forEach((item)=>{
			total += item;
		})
		return total;
	}
	console.log(sum(10,20,30));
	console.log('===========================');

	// 扩展运算符
	let arys = [1,2,3];

	// ...arys  等于  1,2,3
	console.log(...arys);  //1  2  3   // 逗号不会被输出,逗号被当做了参数分隔符
</script>
  • 扩展运算符用于合并数组
// 合并数组
let ary1 = [1,2,3];
let ary2 = [4,5,6];
// 方法一
let ary3 = [...ary1,...ary2];
// 方法二
let ary4 = ary1.push(...ary2);
console.log(ary3);
console.log(ary4);
  • 扩展运算符用于将类数组或可遍历的对象转换成真数组, (伪数组:伪数组表示在结构上与数组相似,有索引index,也有长度length, 我们常见的有俩个,一个是arguments,还有一个是DOM的children属性,获取回来的子节点集合)。
9, Array的扩展方法
  • Array.from( ) 从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例
<script type="text/javascript">
	//  扩展运算符用于将类数组或可遍历的对象转换成真数组
	let divs = document.querySelectorAll('div');
	console.log(divs);
	// 方法一: 使用扩展运算符
	var realArray = [...divs];
	console.log(realArray);

	// 方法二: 使用 Array的 方法
	var realArray2 = Array.from(divs);
	console.log(realArray2);
       // Array.from() 方法从一个类似数组或可迭代对象创建一个新的,浅拷贝的数组实例
</script>
  • arr.find( )  用于找出第一个符合条件的数组成员,没有找到就返回undefined
// ----------------------------------------------
// find()
const arr = [1,2,0,4,5,6];
// find中写一个函数作为find 查找的判断条件,该函数可以有item,index 
// 例:查找arr中 第一个大于 2 的值
var rs = arr.find((item) => item>2);
console.log(rs);
  • arr.findIndex( )  用于查找第一个符合条件的数组成员的索引,
const arr2 = [12 ,34, 33, 45];
let index = arr2.findIndex(item=> item>12 );
console.log(index); // 1 

10, String 的扩展方法

  • 模板字符串 ,  使用反引号定义 例: let name = zhangsan

  • 模板字符串可以解析变量 

let name = `zhangsan`;
let outline = `你好,我是 ${name}` ;
console.log(outline); // 你好,我是 zhangsan
  • 可以调用函数
function sayHi(){
	alert('hi');
}
let hi = `${sayHi()}`;
 console.log(hi);
  • startsWith 和 endsWith

  • str.startsWith('123')   // 判断字符串 str是否 以 123 开头,返回boolean 值

  • str.endsWith('ing')     // 判断字符串str 是否以 ing 结尾,返回boolean 值

  • repeat()

  • var str  =  'xin'.repeat(2)     //   'xinxin'

11,  Set 数据结构

Set 数据结构类似于 数组, 但是成员 的值是唯一,不重复的。

  • 长度用 size 而不用 length
const setdate =  new Set([1,2,2,3,4,5,5,5,5]);
console.log(setdate.size);  // 5 重复的值将被忽略
  • 妙用: 数组去重 

  • 将数组转换成set 数据结构, set 数据结构再转换成数组

    const arr = [1,2,2,3,4,5,5,5,5,9,99,9,88];
    const newarr = [...(new Set(arr))];
    console.log(newarr);  // [1,2,3,4,5,9,99,88]
    
  • 实例方法

    const s = new Set([]); console.log(s.size); s.add(1).add(3).add(4); // 返回Set本身,所以可以迭代写 s.delete(3); // 返回布尔值 s.has(1); // 返回 布尔值 // s.clear(); // 清空

    // 和数组一样也可以使用forEach遍历, 用于对每个成员执行某种操作,没有返回值 s.forEach(value => console.log(value));