ES6新增语法(二)

目录

一、解构赋值

1.数组解构

2. 对象解构

对象解构的另一种写法

二、箭头函数

2.箭头函数的this关键字

3.箭头函数面试题

 ​编辑

三、剩余参数

2.剩余参数和解构一起使用


 

一、解构赋值

解构指的是分解数据结构,赋值指的是一一为变量赋值

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

1.数组解构

let [a, b, c] = [1, 2, 3];  //等号左边的[]不代表数组,而是代表解构,[]中写的其实是变量的名字
                            //[]中的值和等号右边的变量是一一对应的关系,let关键字代表,[]中的变                
                            //量是let声明的
console.log(a);
console.log(b);
console.log(c);

 在ES6之前,要使用arr[0],arr[1]...,要重复声明多次变量

<script type="text/javascript">
		// 数组解构允许我们按照一一对应的关系从数组中提取值 然后将值赋值给变量
		let arr = [1, 2, 3];
		let [a, b, c] = arr;
		console.log(a); //1
		console.log(b); //2
		console.log(c); //3
	</script>

如果解构不成功(变量的数量和值的数量不一致),变量的值为undefined

let [foo] = [];  // foo为undefined
let [bar, foo] = [1]; //bar是1 foo 是undefined
<script type="text/javascript">
		// 数组解构允许我们按照一一对应的关系从数组中提取值 然后将值赋值给变量
		let arr = [1, 2, 3];
		let [a, b, c, d, e] = arr;
		console.log(a); //1
		console.log(b); //2
		console.log(c); //3
		console.log(d); //undefined
		console.log(e); //undefined

	</script>

2. 对象解构

{}里的是对象的名字,=右边的{}里写的是具体被解构的对象,对象解构实际上是属性匹配,变量的名字匹配属性中对象的名字,如果匹配成功就将属性的值赋值给变量

let person = { name: 'zhangsan', age: 20};
let { name, age} = person;
console.log(name);  //'zhangsan'
console.log(age);  //20

 在ES6之前,获取对象中属性的值要通过person.name、person.age。。。需要重复声明多次变量

<script type="text/javascript">
		// 对象解构允许我们使用变量的名字匹配对象的属性 匹配成功 将对象属性的值赋值给变量
		let person = { name: 'lisi', age: 20, sex: '男' };
		let { name, age, sex } = person;
		console.log(name);
		console.log(age);
		console.log(sex);

	</script>

 

对象解构的另一种写法

这种写法支持变量名和属性名不一样

let {name:myName, age: myAge} = { name: 'lisi', age: 20, sex: '男' }; //myName myAge属于别名
console.log(myName); //zhangsan
console.log(myAge); //20

另一种写法,=左边的{}里的内容写成和对象语法一样,用来匹配=右边的属性,:右边的才是变量(比如myName),如果匹配成功,就将属性值赋值给:右侧的变量

<script type="text/javascript">
		// 对象解构允许我们使用变量的名字匹配对象的属性 匹配成功 将对象属性的值赋值给变量
		let person = { name: 'lisi', age: 20, sex: '男' };
		let { name: myName, age: myAge } = person;  //name只起到匹配的作用
		console.log(myName);  //lisi
		console.log(myAge);  //20

	</script>

二、箭头函数

ES6中新增的定义函数的方式,更简便的定义函数

() => {}
const fn = () => {}

()是放形参的地方,{}是函数体,通常将箭头函数赋值给一个变量,通过这个变量调用函数

<script type="text/javascript">
		const fn = () => {
			console.log(123);  //123
		}
		fn();
	</script>
  •  函数体中只有一句代码,且代码的执行结果就是返回值,可以省略大括号
普通的函数定义
function sum(num1, num2) {
    return num1+ num2;
}

const sum = (num1, num2) => num1 + num2;
<script type="text/javascript">
		
		// const sum = (a, b) => { 
		// 	return a + b;  //函数体中只有一句,而且执行结果就是函数的返回值,那么return可以省略, 
                           //{}也可以省略
		// }

        //等同于以下代码
		const sum = (a, b) => a + b;
		const result = sum(10, 20);
		console.log(result);  // 30
	</script>
  • 如果形参只有一个,可以省略小括号
function fn (v) {
    return v;
}

const fn = v =>v; //这里由于只有一个参数所以省略(),又因为函数体中只有一句并且执行结果是函数的返回
                  //值所以省略{}
<script type="text/javascript">

		// const fn = (v) => {
		// 	alert(v);
		// }
		// fn(20);

		// 等价于以下语句
		const fn = v => {
			alert(v);
		}
		fn(20);
	</script>

2.箭头函数的this关键字

箭头函数不绑定this关键字,箭头函数中的this,指向的是函数定义位置的上下文this,即箭头函数被定义在哪儿,这个this就指向哪儿

const obj = {name: '张三'};
function fn() {
    console.log(this);
    return () => {
        console.log(this);
    }
}
const resFn = fn.call(obj); //call()改变this的指向 指向obj对象
resFn();

分析:定义了一个常量obj,内容是对象,一个传统函数fn,返回一个匿名函数,是用箭头函数定义的,通过call()方法,改变fn函数中this的指向(一般是谁调用这个函数就指向谁),指向obj,于是fn()里的第一句输出 this就是指向obj。 然后再将fn函数的返回值,也就是那个匿名函数赋值给resFn,就可以通过resFn()调用匿名函数了。

然后,调用resFn()时,虽然相当于调用了window下的resFn(),按理来说当前的this应该指向window,但是因为这个匿名函数是用箭头函数定义的,箭头函数自身没有this,this指向的是当前函数定义的位置的this的指向,就是这个匿名函数被定义在了fn()里,这个this指向的和fn()的this的指向一样,都指向obj

3.箭头函数面试题

<script type="text/javascript">
		var obj = {
			age: 20,
			say: () => {
				alert(this.age);
			}
		};
		obj.say();
	</script>

 

 分析:由于箭头函数不绑定this,所以这里的this指向函数存在的位置obj对象,而obj是一个对象,不能产生作用域,所以这个箭头函数实际上是被定义在了全局作用域下,this指向的是window,而window对象里没有age这个属性,所以undefined

如果在去全局作用域下定义一个age属性。。。。。。。

<script type="text/javascript">
		var age = 100;
		var obj = {
			age: 20,
			say: () => {
				alert(this.age);
			}
		};
		obj.say();
	</script>

 注意:对象是不产生作用域的

三、剩余参数

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

当实参的个数大于形参个数时,可以将剩余实参放到一个实参数组中

function sum(first,...args) {
    console.log(first);  //10
    console.log(args);  //[20,30]
}

sum(10,20,30);

 

<script type="text/javascript">
		const sum = (...args) => { //...表示接收所有剩余的参数
			let total = 0;
			args.forEach(item => total += item) //参数item是每一次循环的当前项
			return total;
		}
		console.log(sum(10, 20));  //30
		console.log(sum(1, 2, 3, 4, 5));  //15

	</script>

2.剩余参数和解构一起使用

剩余参数和解构配合使用

let students = ['wangwu','zhangsan','lisi'];
let [s1,...s2] = students;
console.log(s1); //'wangwu'
console.log(s2); // ['zhangsan','lisi']


版权声明:本文为m0_45659764原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。