01、let、const

ECMAScript 与 JavaScript 的关系

ES是JS的标准,JS是ES的实现。

浏览器对新标准的支持

http://kangax.github.io/compat-table/es6/

 

let

let与var的区别

1、let声明的变量,只在当前(块级)作用域内有效。

//块级作用域通俗的说就是 { } 包起来的内容。但是当声明是对象时,{}里面就不是块级作用域,而是对象
//记得es5是没有块级作用域的
//for循环中()为一块级作用域,{}为二块级作用域,一块级包含二块级。

 

2、let声明的变量不能被重复命名

//var的时候
var a= 1;
var a = 2;
//那么a最后就是2

//let的时候
let a= 1;
let a = 2;
//这样会报错,因为let的变量只能声明一次

 

3、不存在变量提升

console.log(a); //这里a是可以获取到的,不过是undefined。let就没有这个特性
var a = 123; 

 

4、暂存死区

//块级作用域中存在let、const声明的变量,这个变量一开始就会存在封闭的作用域
let a = 1;
{
    console.log(a);
    let a = 2;
}
//这样就会报错

 

 常见小例子

生成10个按钮,点击对应的按钮,弹出对应的 1-10 的数字

var 方式

//自执行的函数会形成一个独立的函数作用域for(var i = 1; i <= 10; i++){
    (function(i){  //这个i是接收传进来的i
        var btn = document.createElement('button');
        btn.innerText = i;
        btn.addEventListener('click',function(){
            alert(i);
        },false)
    })(i)   //这个i是for那里的i。从for传给匿名函数
}

 

let方式

for(let i = 1; i <= 10; i++){
    var btn = document.createElement('button');
    btn.innerText = i;
    btn.addEventListener('click',function(){
        alert(i);
    },false)
    document.body.appendChild(btn);
}

 

const

const是用来声明常量的,且声明时必须赋值。

特性与let相同,不能重复声明,不存在提升,只在当前作用域有效

 

引用类型常量(修改)

常量的值是不可改变的,但当常量为引用类型的时候就可以更改(但不是完全地更改),如

const xiao = {     //声明一个引用类型的常量
    name : 'xiao',
    age : 18
}
console.log(xiao.name);  //输出引用类型的值

xiao.name = 'haha';      //更改引用类型的值
console.log(xiao.name);     //更改成功

xiao = {}; //清空里面的数据就会失败。
//说明const声明的的常量,只能保证引用类型的地址不发生变化,但是里面的数据是可以变化的。

 

再如

const abb = []; //声明一个引用类型的常量

abb.push(2);    //给该里面填充数据

console.log(abb); //填充成功

 

 

引用类型常量(防止修改) 

防止常量为引用类型时被修改,如

const xiao = {
    name : 'xiao',
    age : 18
}
Object.freeze(xiao);  //用Object.freeze将常量包起来。只要包起来了里面的值就不能增加、修改、删除等操作

console.log(xiao.name); //没修改时的值

xiao.name = 'haha';      //这样进行修改,不会报错也不会成功
console.log(xiao.name);     //这里的值也还是没修改的值

xiao.address = 'beijing'; //给引用类型的常量添加方法,不会报错也不会成功
console.log(xiao.address);  //xiao.address的值为undefined

 

再如

const abb = [];

Object.freeze(abb);

abb.push(2);  //这里就会报错了,原因看上个例子

console.log(abb);

 

//Object.freeze(a);  //a对象里面的值不能扩展、修改、删除等等

 

es6之前声明常量方法

第一种

var a = 123; //假装是常量的方式

 

第二种

var b = {}; 

b.name = 'xiaoming';  

//给对象添加常量。这个常量可以被修改、删除等操作

 

第三种

//还有一个添加常量的方法。这个常量可以控制是否可写、可读

Object.defineProperty(b,'age',{  
//第一个参数是表示要操作的对象。当然可以也可以为window,这样就会是一个全局的常量了
//第二个参数是属性名
//第三个参数是{},里面是描述的操作 value : '18', //value后面是 属性值 writable : false; //这里表示不可写,就是只读的意思 })

 

上面第三种方法可以保证变量不被修改,但是对象还是可以正常的扩展的,如

b.sex = 'nan';
console.log(b.sex); //扩展是可以成功的

 

要想对象不能扩展,就得这样:

Object.seal(b); //表示b对象不能被扩展。位置放在刚定义完对象的时候

 

//Object.seal(b);  //b对象里面的值不能阔在,但是可以修改。

第三种方法 + Object.seal()  = Object.freeze()

.......

上一篇:Java继承和重写


下一篇:《python编程:从入门到实战》学习笔记