
ES6新添加的用于公告变量的关键字
// 使用let公告的变量具备块级作用域if(true) { let a = 10 console.log(a) // 10 if(true) { let c= 30 } console.log(c) // c is not defined}console.log(a) // a is not defined注意: 使用let 关键字公告的变量才具备块级作用域,使用var公告的变量不具有块级作用域特性。
在一个大括号中,使用let 关键字公告的变量才具备块级作用域,var关键字是不具有这个特点的。
if(true) { let num = 100 var abc = 200}console.log(abc) // 200console.log(num) // num is not defined防止循环变量变成全局变量
for(var i=0; i<2; i++) { }console.log(i) //2 for(let j=0; j<2; j++) { }console.log(j) //j is not defined使用let公告的变量 不存在变量提升
console.log(a); //a is not definedlet a = 20使用let公告的变量有暂时性死区特性
var tmp = 123;if(true) { tmp = 'abc' let tmp; // Cannot access 'tmp' before initialization}经典面试例子
var arr = []for(var i = 0; i<2; i++){ arr[i] = function () { console.log(i) }}arr[0](); // 2arr[1](); // 2因为变量i具体有全局作用,所以最终循环后得到i都是2,执行完也是2,如下图<br />
image.pnglet arr = []for(let i = 0; i<2; i++){ arr[i] = function () { console.log(i) }}arr[0](); // 0arr[1](); // 1代码每次循环都会产生一个块级作用域,每个块级作用域中的变量都是不同的,函数执行时输出的事自己上一级(循环产生的块级作用域)作用域下的i值<br />
image.png作用: 公告常量,常量就是值(内存地址)不能变化的量
// 使用const 关键字公告的常量必需赋初始值const PI //Missing initializer in const declarationconst公告的常量赋值后,值不能再改变
const PI = 3.14PI = 100 // Assignment to constant variable.当const公告事数组或者对象时候,内部值可以改变,但内存中存储地址没变
const arr = [100, 200];arr[0] = 'a';arr[1] = 'b';console.log(arr) // ['a', 'b]arr = ['c','d'] //Assignment to constant variable.
image.pngES6中允许从数组中提取值,按照对应位置,对变量赋值,对象也可以实现解构。
数值解构允许我们按照逐个对应的关系从数组中提取值而后将值赋值给变量
let [a, b, c] = [1, 2, 3]console.log(a) // 1console.log(b) //2console.log(c) //3假如解构不成功,变量值为undefined
let [foo] = [];let [bar, foo] = [1]console.log(bar) //1console.log(foo) //undefined对象解构允许我们使用变量的名字匹配对象的属性,匹配成功将对象属性的值赋值给变量
let person = { name: 'lanfeng', age: 20 }let { name, age} = personconsole.log(name) //lanfengconsole.log(age) // 20对象解构的另外一种写法
let person = { name: 'lanfeng', age: 20 } let { name: myName, age: myAge = 0} = person //myName,myAge属于别名console.log(myName) //lanfengconsole.log(myAge) // 20ES6中新添加的定义函数的方式
() => {}const fn = () => {}箭头函数事用来简化函数定义语法的
const fn = () => { console.log(123)}fn() //123函数体中只有一个代码,且代码中的执行结果就是返回值,可以省略大括号
// ES6之前的定义方法function sum(num1, num2) { return num1+ num2}const sum = (num1, num2) => num1 + num2假如形参只有一个,可以省略小括号
function fn(v) { return v}const fn v => v箭头函数不绑定this关键字,箭头函数中的this,指向的是函数定义位置的上下文this
//箭头函数不绑定this,箭头函数没有自己的this关键字,假如在箭头函数中使用this,this关键字将指向箭头函数定义位置中的thisconst obj = {name: 'lanfeng'}function fn() { console.log(this) return () => { console.log(this) }}const resFn = fn.call(obj) // 指向objresFn() //this指向obj箭头函数的经典例子:
var obj = { age: 20, say: () => { console.log(this.age) }}obj.say() //undefined,由于指向的是window剩余参数语法允许我们将一个不定数量的参数表示为一个数组,
function sum(first, ...args) { console.log(first) // 10 console.log(args) //[20, 30]}sum(10, 20, 30)剩余参数和解构配合使用
let arr = ['lanfeg','qianduan', 'yanfa']let [s1, ...s2] = arrconsole.log(s1) //lanfegconsole.log(s2) // ['qianduan', 'yanfa']
qrcode_for_gh_4d3763fa9780_258 (1).jpg