这里简单的介绍几个es6的语法,都是在vue中需要用到的
let & const
let
es6新增了一个let命令,用来声明变量,这个命令和var差不多,但是略有差别。下面介绍此中差距
let声明的变量是块级作用域
分别执行下面两段代码
// ************* 代码一 *****************
{
var a = 12;
}
console.log(a); // 12
// ************* 代码二 *****************
{
let a = 12;
}
console.log(a); // a is not define
上面两段代码都是在代码块中定义变量a并赋值,然后在代码块外面调用变量a。唯一不同的就是用来声明变量a的命令不同,那么可想而知,结果自然不同,使用var声明的变量在代码块外仍然有效,所以打印的结果是12。但是使用let声明的变量在代码块外面就访问不到了,所以结果是 a is
let声明的变量不能重复声明
{
var a = 12;
var a = 13;
}
console.log(a); // a = 13
{
let a = 12;
let a = 13;
}
console.log(a); // a has already been declared
由上面的代码可知,var声明的变量可以被覆盖。但是如果使用let声明变量,再次声明就会报错
在for循环中使用let的好处
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6]();
在上面的例子中,由于var声明的是全局变量i,因此在下面执行a[6]()方法时console.log(i)的i指向的仍然是全局的这个i,而此时的i已经在for循环之后变成了10,因此不管在下面执行哪一个方法,a[1]也好,a[2]也好,最终都会打印10,
但是有的时候就希望 i 就是当前的数字怎么办?这时用let就好办了
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6]();
由于前面提到过,let声明的是块级作用域,因此在每一次循环中都有i,对应的就是当前循环的 i 的数字
变量提升的问题
console.log(foo); // 输出undefined,浏览器渲染的时候会先声明var foo; 到后面再赋值
var foo = 2;
在上面的例子中,foo变量的声明在使用的后面,但是这并不会报错,因为浏览器会先帮我们声明foo,因此只会打印undefined
console.log(bar); // 报错ReferenceError
let bar = 2;
但是使用let就不一样了,使用let声明的变量不会允许变量提升,所以在bar变量没有声明前调用会报错
const
const是用来声明常量的,一旦声明不能修改
const PI = 3.1415;
PI = 3; // TYPEError,报错
模板字符串 & 箭头函数
模板字符串
模板字符串是es6引入的新特性,在以前的时候如果字符串中出现了需要插入对象的情况,就只能使用字符串拼接,那样会显得非常麻烦,那么这个模板字符串就是用于改变这种情况的,它能够极大的简化字符串的拼接
var a = 1;
var b = 2;
// 老式插法
var str = 'a=' + a + 'and b=' + b;
// 模板插入
var str = `a=${a} and b=${b}`;
像上面那样使用${}就可以把变量引入,但是注意,不再使用引号表示字符串了,而是使用反引号
箭头函数
首先看下箭头函数跟普通函数的区别
// 普通函数写法
var f = function(a){
return a;
}
// 箭头函数
var f = (a) => a;
// or
var f = (a) => {
return a;
};
// function(){} 等价于 ()=>{}
有上面的代码可知,箭头函数就是把 function(){} 简化成了 ()=>{}
但是使用箭头函数也会有一点问题,下面一一列举
this的指向问题
上面说 function(){}等价于()=>{}其实是不准确的,因为在this的指向上这两者仍旧有一些区别
在执行function定义的函数时,this会指向执行时的对象,而箭头函数会指向定义时的对象
var name = '张三';
var person = {
name:'李四',
age:18,
fav:function(){
console.log(this)
console.log(this.name)
}
}
person.fav(); // this指向执行时的对象,即person
var name = '张三';
var person = {
name:'李四',
age:18,
fav: ()=>{
console.log(this)
console.log(this.name)
}
}
person.fav(); // this指向定义时的对象,即window
arguments不能使用
使用箭头函数还有一个问题,那就是arguments不能再使用了
var func = function(){
console.log(arguments);
}
func(1, 2, 3); // 打印1 2 3
var func = () => {
console.log(arguments);
}
func(1, 2, 3); // 报错