ES6

195 阅读6分钟

ES6简介

1.ES6 全程ECMAScript 6.0 主要是为了解决ES5的先天不足 目标与愿望:
1.适应更复杂的应用
2.实现代码库之间的共享
3.不断 代维护新版本
4.支持更多语法,使用更方便
新的变量声明方式 let\const
ES6之前,使用声明变量,可以声明多次变量,这样导致的问题查找很难
在ES6中,使用let声明变量,使用const声明常量
let作用域是块级作用域,如:


解构赋值
解构赋值语法是一种JavaScript表达式,用来将数组中的值或对象中的属性取出来区分为不同变量
分为:对象解构赋值和数组解构赋值
案例:定义一个对象,表示3维空间中的一个点,需要用这些坐标点进行开平法计算:
若使用第一种写法,确实是有效的,但只是简单的复制粘贴。
使用解构赋值,能更简单的采集到这些坐标 --对象解构赋值
还有其他形式的解构赋值,如:数组解构赋值
解构赋值能很好的运行在对象中,但它同样也能很快的作用于数组中。

箭头函数
箭头函数是ES6提供的新的语法结构,用于替换匿名函数
相当于简写了function,使用()代替,使用=>代替{ }

 <script>
    var show=function(){
        console.log("hello word!");
    }
    show();
    var show2=() =>{
       console.log("hello word");
       show2
    }
    var show3=function(name){
        console.log(name);
    }
    show3("hxy");
    var show4 = name =>{
        console.log(name);
    }
    show4("hxy");
    var add =function(a,b){
        return a+b;
    }
    console.log(add(1,2));
    var add1=(a,b)=>{
        return a+b
    }
    console.log(add1(1,2));

    var add3=(a,b)=>a+b;
    console.log(add3(1,2))
</script>

剩余参数
...用于声明剩余的参数,a、b是命名参数,...c用来收集剩余参数
...也称为扩展运算符,通过...运算使得两个数组实现深拷贝

<script>
    //数据的解构赋值
    let [x,y,z] =[1,2,3]
    console.log(x +","+y+","+z+",")
   //对象的解构赋值
   let newPoint={
        x:2,
        y:4,
        z:5
    }
    let {x,y,z} =newPoint;
    console.log(Math.sqrt(x*x+y*y+z*z).toFixed(2))
    let newPoint={
        x:2,
        y:4,
        z:5
    }
    let x=newPoint.x;
    let y=newPoint.y;
    let z=newPoint.z;
    let distance=Math.sqrt(x*x+y*y+z*z)
    console.log(distance);
</script>  

数组展开
传递三个参数,实现一个计算任意个数之和的add函数
传递参数的时候,可以使用...

<script>
 function show(a,b,...c){
     console.log(a);
     console.log(b);
     console.log(c);
 }
 show(1,2,3,4,5,9)
 let arr =[1,2,4]
 console.log(arr);
 console.log(...arr);
 function add(...aar){
     return arr.reduce((previous,current)=>{
         return previous+current;
     })
 }

参数模板(模板字符串)
模板字符串是为了解决使用“+”号拼接字符串的不便利而出现的
它的功能非常强大,但是大多数时候使用它则非常简单
¥{变量名称/常量名称}。外面是由 (反单引号)包裹

<script>
    let a="hello";
    let b="world";
    let c='${a+b}';
    let d='${a} ${b}';
    console.log(c);
    console.log(d);
    
    //对运算的支持
    let x=1;
    let y=2;
    let result='${x+y}';
    console.log(result);
    
</script>

数组方法
Array.from(json):将json字符串转为数组,json字符串转为数组,json字符串务必要有长度属性
实例方法find():从数组中查找,传入一个有3个参数的匿名函数:1.value:当前查找的值 2. index:当前查找的数组索引3.arr:当前数组

  //json数组格式转换
		let json={
			'0':"niit",
			'1':"computer",
			'2':"mobile",
			length:3
		}
		let arr1=Array .from(json);
		console.log(arr1);
		function test(a,b){
			let arr= Array.from(arguments,value=>value+2);
			console.log(arr);
		}
        test(1,2);
    //查找
		let arr3 = [1, 2, 3, 4, 5, 6, 7, 8, 9];
		console.log(arr3.find(function(value, index, arr) {
			return value > 5
        }));

实例方法fill(value,start,end):使用给定值填充数组,数组中的原有元素会被抹去,从位置start开始填充,不包含end位置
遍历数组,一下3个方法都返回一个遍历器对象,可以使用for...of循环遍历,或使用next()遍历 :1.entries():键值对遍历2.keys():键名遍历3.values():键值遍历

  //填充
 let arr4=[1,2,3,4,5,6,7,8,9]
 arr4.fill(1,2,5);
 console.log(arr4);
 //数组遍历
 let arr5 = ['niit','computer','mobile'];
 //输出也索引
 for(let index of arr5.keys()){
     console.log(index);
 }
 //输出值
 for(let index of arr5.values()){
     console.log(index)
 }
 //输出索引和内容
 for(let [index,val] of arr5.entries()){
     console.log(index+":"+val);
 }
 //entries()方法
 let list =arr5.entries()
 console.log(list.next().value);

map: 返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值
案例:一个数组存取了5位学生的成绩,大于等于360分显示及格,否则小于60分显示不及格,按照成绩的顺序,将及格/不及格显示在新的数组中。

  //map
let scores2 =[23,45,76,85,34,64]
 let scores1 = scores2.map(function(score){
     if(score>=60){
         return '及格';
        
     }else 
     {return '不及格';
    }
 });
 console.log(scores2);
 console.log(scores1);

JavaScript异步编程

● 方案

● 回调函数Callback
● 事件监听
● 发布订阅
● Promise/A+
● 生成器Generators/yield·
● async/ Await
Promise
异步编程的解决方案,比传统的解决方案–回调函数和事件–更合理和更强大,完美解决回调地狱问题
简单说就是一个容器,保存某个未来才会结束的事件
Promise对象的特点: 对象的状态不受外界影响。Promise对象代表一 个异步操作,有三种状态:pending (进行中)、fulfilled (已成功)和rejected (已失败)。 一旦状态改变,就不会在变。Promise对象的状态改变,只有两种可能:从pending变为fulfilled和从pending变为rejected.

前端模块化

JavaScript模块化进程
1.全局function模式:将不同功能封装成不同的全局函数,会污染全局命名空间
2.namespace模式:简单对象封装,解决了命名冲突,但是数据不安全
3.IIFE模式:匿名函数自调用,解决了数据安全,但模块依赖存在问题
4.ITFE模式增强:引入依赖,现代模块实现的基石 模块化的优势 1.避免命名冲突(减少命名空间污染)
2.更好的分离,按需加载
3.更高复用性
4.高可维护性

namespace模式

IIFE模式 :Immediately Invoked Function Expression

IIFE模式模式增强:增强模块间的依赖关系

引入多个script后出现的问题
问题:请求过多,依赖模糊,难以维护
解决方案:
1.模块化规范:CommonJS、AMD、ES6、CMD等规范。
2.CommonJS:Node应用采用CommonJS模块规范。主要用于服务器端。
3.AMD:非同步加载模块,允许指定回调函数,浏览器端一般采用AMD规范。
4.ES6:ES6模块的设计思想是尽量的静态化,使得编译时就能确定模块的依赖关系,以及输入和输出的变量。
5.CMD:专门用于浏览器端,模块的加载时异步的,模块使用时才会加载执行。CMD规范整合了CommonJS和AMD规范的特点。
CommonJS模块化规范
CommonJS:
● Node应用有模块组成,采用CommonJS模块规范
● 每隔文件就是一个模块,有自己的作用域
● 在一个文件里面定义的变量、函数、类,都是私有的,对其他文件不可见
在服务器端,模块的加载是运行时同步加载的
● 在浏览器端,模块需要提前编译打包处理

特点:
● 所有代码都运行在模块作用域,不会污染全局作用域。
● 模块可以多次加载,但是只会在第一次加载时运行一次,然后运行结果就被缓存,以后再加载就直接读取缓存结果。要想让模块再次运行,必须清楚缓存。
● 模块加载的顺序,按照其在代码中出现的顺序。
CommonJS基本语法
暴露模块:
● module.exports = value
● exports.xxx = value

引入模块:
● require(xxx),如果是第三方模块,xxx为模块名
● 如果是自定义模块,每个模块内部,module变量代表当前模块,它的exports属性(即module.exports)是对外的接口
加载某个模块,就是加载该模块的module.exports属性