一、ES6的新特性
1、什么是ES6?
ECMAScript 6.0(以下简称 ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了。
2、ES6和JavaScript的关系
ECMAScript 是 JavaScript 语法规定,JavaScript 是 ECMAScript的实现
3、相对于JavaScript新增加的特性
(1)两种新的声明方式
let 和const:两种新的声明方式
A、JavaScript 中 var 声明方式的局限:会造成变量的作用域的提升
B、let 声明变量只在块中有效(块级作用域 ‘ { } ’)
C、const声明的是变量,必须初始化并且不能重新赋值
(a)const声明的对象(常对象):可以改变对象的属性值,但不能改变对象本身
const obj = {
name:'张三',
age : 28
}
console.log(obj)
obj.name = '刘备'
console.log(obj)
obj = {
id:'1001',
name:'西安'
}
(b)冻结对象:用const声明对象,用Object . freeze(对象名)函数冻结对象,这样就无法修改对象的属性值
const obj = {
name:'张三',
age : 28
}
console.log(obj)
Object.freeze(obj) //冻结obj对象 (b)
obj.name = '刘备'
console.log(obj)
(c)如何冻结对象的内部的对象:可以通过封装函数,在函数中使用循环的方式逐层冻结
冻结函数的缺点:
//冻结函数的缺点。冻结对象:无法冻结嵌套的内部对象
const obj = {
name:'张三',
age : 28,
family:{
father:{
name:'张安',
age :55
}
}
}
console.log(obj)
Object.freeze(obj) //冻结obj对象 (b)
obj.name = '刘备'
obj.family.father.name = '张三丰' //冻结对象:无法冻结嵌套的内部对象
console.log(obj)
解决冻结函数:
//自定义冻结函数:逐层对对象进行冻结
const obj = {
name:'张三',
age : 28,
family:{
father:{
name:'张安',
age :55
}
}
}
function deepFreeze(obj){
Object.freeze(obj)
for(let key in obj){ //obj.hasOwnProperty(key):判断key是否有obj的属性; typeof obj[key]:判断obj对象的key属性的类型
if(obj.hasOwnProperty(key) && typeof obj[key] ==='object'){
deepFreeze(obj[key])
}
}
}
console.log(obj)
//Object.freeze(obj) 无法冻结内嵌对象
deepFreeze(obj)
obj.family.father.name = '张三丰'
console.log(obj)
(2)临时死区
临时死区:JavaScript 引擎在扫描代码时会在开辟两个区域一个是全局区域(存放 var 声明的变量),另一个是临时死区(存放 let 和 const 声明的变量)
(3)在循环中使用 let 和 const
A、在循环中创建函数
let funArr = [] //数组:用来存放函数(数组的每个单元都是一个函数)
for(let i=0;i<5;i++){
funArr.push(function(){
console.log('i=',i)
})
}
funArr.forEach(function(item){
item()
});
B、for-in 循环:用