ES6基础—let与var/const/对象字面量的增强写法
为了弥补JavaScript中var的缺陷,所以在ES6中有了let
let与var的区别
1.let定义的变量存在块级作用域,一个大括号即是一个块级作用域。
{
//一个块级作用域
}
1 { 2 let test1='baby'; 3 console.log(test1); //baby 4 } 5 console.log(test1); //undefined 6 { 7 var test1='baby'; 8 console.log(test1); //baby 9 } 10 console.log(test1); //baby
而var只存在函数作用域,即外部不能访问在函数内声明的变量。
值得注意的是,在if和for中声明的变量在其他地方依然可以使用。所以产生了循环多个事件时只会触发最后一个的问题,其中的一个解决方法—闭包就是利用函数作用域将 i 先存了下来。(ES6中可以使用 let 取代 var 来声明i即可解决问题。for(let i ; i < length ; i ++) )
2.let不存在预处理机制,var存在。就是说let必须先定义再使用
js引擎解析代码时存在预处理机制,会将var声明的变量提前,但不会赋值
1 console.log(test2); //undefined 2 var test2='kids'; 3 console.log(test2); //test
4 console.log(test3); //直接报错,下面不会继续运行 Uncaught ReferenceError: Cannot access 'test3' before initialization 5 let test3='kids'; 6 console.log(test3);
3.被let定义后的变量不能重新被定义,但是var可以
1 var test4='hahaha'; 2 var test4='xixixi'; 3 console.log(test4); //xixixi 4 5 let test5='hahaha'; 6 let test5='xixixi; 7 console.log(test5); //报错——Uncaught SyntaxError: Identifier 'test5' has already been declared
const
在ES6之前并没有可以声明常量的关键字。在定义标识符时必须为他进行赋值,也就是初始化,并且一旦使用const声明赋值就不可以再次赋值。
值得注意的是,如果用const以对象字面量的方式进行定义对象,是指向的对象不能改变,而对象的属性和方法可以进行更改。
1 const obj = { 2 name:'luca', 3 age:3 4 } 5 obj.age=15
这样是被允许的。
ES6的增强写法
在ES6之前对象字面量是这个样子
var name='luca'; var obj= { name:name, age:18, test:function () { //对象方法 } }
增强写法
let name = 'luca'; const obj = { name,
age:18, test () { //对象方法 } }
在这里,对象的属性值 name 在外面已声明,就不用写成键值对的方式,直接写 name 即可。对象的方法增强写法如上,有一个特殊情况,
只有是匿名函数的时候,才可以使用简洁语法,如果赋值的是一个有名字的函数,那么就不能使用上述写法。如:
let obj = { test:function hello (){ console.log("Hello") } }
今天也要尽情开心啊