文章目录

一、ES6 块级作用域 let、const? 

二、ES6解构

1.数组解构

三、ES6扩展运算符

四、ES6模板字符串

五、ES6箭头函数


简介

      ES6,全称 ECMAScript 6.0 , 是 JavaScript 的下一个版本标准,2015.06 发版。

      ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript 里并没有类的概念,但是目前浏览器的 JavaScript 是 ES5 版本,大多数高版本的浏览器也支持 ES6,不过只实现了 ES6 的不笨特性和功能。


一、ES6 块级作用域 let、const? 

{
  var a = "aaa";
  let b = "bbb";
 
   console.log(a); // aaa
   console.log(b); // bbb
}
console.log(a); // aaa
console.log(b); // b is not defined

结论:对象是一个作用域,var声明的变量是全局的,而 let 声明的变量只存在于作用域里面,同时var声明的会挂在到window上面,而 let 和 const 则不会挂在window上

{
  const c = "ccc";
  console.log(c); // ccc
}
console.log(c); // c is not defined
______________________________________________________________________

const d = "ddd";
      d = 'eee'
console.log(d); // Uncaught TypeError: Assignment to constant variable

const e = ["a", "b"];
      e.push("c");
console.log(d); //['a', 'b', 'c']

 结论:const声明的是常量,也是只作用在块级作用域里面,定义之后就不可直接更改,只能通过js的方法去修改,否则会报错。


二、ES6解构

1.数组解构

数组解构就是能快速提取数组中的指定成员(数组的某一项值或所有的值)

解构赋值都是一一对应的,其实获取的就是数组的下标。

const arr = [200,300,400]
const [a,b,c] = arr
console.log(a,b,c) // 200,300,400

也可以取数组中的某一项。

const arr = [200,300,400]
const [, , c] = arr
console.log(c) // 400

如果解构的长度大于数组本身长度,那就会显示undefined

const arr = [200,300,400]
const [a,b,c,d] = arr
console.log('d:', d) // d: undefined

2.对象解构

  对象解构跟数组解构差不多,数组取的是下标,对象取得的是变量名。

let object = {
  name: "小熊饼干",
  age: "18",
};
let { name, age } = object;
console.log("name: ", name); // name: 小熊饼干
console.log("age: ", age);   // age: 18

给解构的对象添加新的变量名和变量。

let object = {
  name: "小熊饼干",
  age: "18",
};
let { name, age ,sex = '男'} = object;
console.log("name: ", name); // name: 小熊饼干
console.log("age: ", age);   // age: 18
console.log("sex: ", sex);   // sex: 男

同理,对象里面嵌套对象也是如此,

let object = {
  name: "小熊饼干",
  age: "18",
  link: {
    motion: "羽毛球",
    game: "王者",
  },
};
let { link:{ motion , game } } = object;
console.log("motion: ", motion); // motion: 羽毛球
console.log("game: ", game);     // game: 王者

三、ES6扩展运算符

使用 ... 可以展开元素,获取全部元素

const arr = [200,300,400]

console.log('all:' , all) // all: [200,300 , 400] 

console.log('all:' , ...all) // all: 200 300 400 

console.log('all:' , {...all}) // all: {0: 200, 1: 300, 2: 400}

四、ES6模板字符串

在使用模板字符串前,我们拼接字符串变量使用 + ,使用 ES6 提供的模板字符串,首先使用  `` 把字符串包起来,当要使用变量时 ,使用 ${变量}。

let a = "五";
let b = "开心";

let c = "今天星期" + a + ",下班好" + b;
console.log("c: ", c); // c:  今天星期五,下班好开心

let d = `今天星期${a},下班好${b}`;
console.log('d: ', d); // d:  今天星期五,下班好开心

五、ES6箭头函数

es6 新增了使用箭头 => 语法定义函数表达式的能力,箭头函数和普通函数很大程度上是相同的。

// 普通函数
let sum = function(a, b) {
	return a + b;
}
// 箭头函数
let sum1 = (a, b) => {
	return a + b;
}
sum(10 , 20)   // 30
sum1(10 , 20)  // 30

如果只有一个参数,可以不用括号。只有没有参数,或者多个参数的情况下,才需要使用括号。

// 有效
let sum = (x) => {
	return x;
};
// 有效
let sum1 = x => {
	return x;
};
// 没有参数需要括号
let sum2 = () => {
	return 1;
};
// 有多个参数需要括号
let sum3 = (a, b) => {
	return a + b;
};

箭头函数也可以不用大花括号,但这样会改变函数的行为。使用大花括号就说明包含“函数体”,可以在一个函数中包含多条语句,跟常规的函数一样。

  • 省略大括号箭头后面就只能有一行代码;
  • 省略大括号会隐式返回这行代码的值;
  • 省略大括号不能写return。
// 有效
let sum = (a, b) => { return a + b };
// 有效
let sum1 = (a, b) => a + b; // 相当于 return a + b;
// 无效的写法
let sum2 = (a, b) => return a + b;
//比如
let arr = [1, 2, 3, 4, 5];
arr.map(val => val * 2); // [2, 4, 6, 8, 10]

如果函数是使用箭头语法定义的,那么传给函数的参数将不能使用 arguments 关键字访问,虽然箭头函数中没有 arguments 对象,但可以在包装函数中把它提供给箭头函数:

// 普通函数
let sum = function() {
	return arguments.length;
}
sum(1, 2, 3); // 3

// 箭头函数
let sum1 = () => {
	return arguments.length;
}
sum1(1, 2); // Uncaught ReferenceError: arguments is not defined

//包装函数有arguments
function foo() {
	let bar = () => {
		console.log(arguments.length);
	}
	bar(); 
}
foo(5, 5, 5);  // 3

箭头函数中this 指向

let num = 11;
const obj1 = {
	num: 22,
	fn1: function() {
		let num = 33;
		const obj2 = {
			num: 44,
			fn2: () => {
				console.log(this.num);
			}
		}
		obj2.fn2();
	}
}
obj1.fn1(); // 22

原因箭头函数没有this,箭头函数的this是继承父执行上下文里面的this ,这里箭头函数的执行上下文是函数fn1(),所以它就继承了fn1()的this,obj1调用的fn1,所以fn1的this指向obj1, 所以obj1.num 为 22。
注意:简单对象(非函数)是没有执行上下文的!

如果fn1也是个箭头函数呢?

let num = 11;
const obj1 = {
	num: 22,
	fn1: () => {
		let num = 33;
		const obj2 = {
			num: 44,
			fn2: () => {
				console.log(this.num);
			}
		}
		obj2.fn2();
	}
}
obj1.fn1();

上述结果为undefined,因为fn1也是一个箭头函数,所以它就只能继续向上找也就是window了。由于是用 let 声明的变量,不会挂载到window上面,所以找不到,结果为undefined,如果把 let 改为var呢?小伙伴知道吗。上面讲 let 和 var 有讲到过的哦。