美文网首页
01- let 变量 与 const 常量

01- let 变量 与 const 常量

作者: 夏海峰 | 来源:发表于2018-08-21 14:39 被阅读13次

    1、let 变量

    let 声明的变量只在它所在的代码块内有效。ES5 只有两种声明变量的方法:var 命令和 function 命令。ES6 除了添加 let 和 const 命令,另外两种声明变量的方法:import 命令和 class 命令。所以,ES6 一共有 6 种声明变量的方法

    {
        var a = 10;
        let b = 20;
        const c = 30;
    }
    console.log(a);  // 10
    
    console.log(b);  // b is undefined
    
    console.log(c);  // c is undefined
    
    for(let i =0; i<10; i++) {
        //
    }
    console.log(i);   // i is undefined
    
    
    var a = [];
    for(var i = 0; i<10; i++) {
        a[i] = function() {
            console.log(i);
        }
    }
    a[6]();   // 10
    

    2、var 变量与变量提升

    使用 var 声明的变量,存在变量提升。

    var tmp = new Date();
    
    function f() {
        console.log(tmp);
        if (false) {
            // var tmp 变量提升
            var tmp = 'hello world';
        }
    }
    
    // 上面 f 函数等价于 f1函数
    function f1() {
        var tmp;
        console.log(tmp);
        if(false) {
            tmp = 'hello world';
        }
    }
    
    f();   // undefined
    f1();  // undefined
    
    
    for(var i=0; i<10; i++) {
        // ....
    }
    console.log(i);  // i 是一个全局变量,即 var 变量提升
    

    3、const 常量

    const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类型的数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指针,const只能保证这个指针是固定的,至于它指向的数据结构是不是可变的,就完全不能控制了。因此,将一个对象声明为常量必须非常小心

    const PI = 3.14;
    // PI = 4;   报错
    
    const OBJ = {};
    OBJ.name = 'geek';   // 不报错
    console.log(OBJ);
    
    // 冻结对象
    const foo = Object.freeze({});  // foo被冻结,将无法再被改变
    foo.name = 'geek';  // 该行代码不起作用、或者会报错
    console.log(foo);
    

    功能封装:冻结一个对象及其所有后代中的对象属性。

    var constantize = (obj) => {
        Object.freeze(obj);
        Object.keys(obj).forEach((key,i)=>{
            if (typeof obj[key] === 'object') {
                // 递归 冻结
                constantize(obj[key]);
            }
        });
    }
    

    完!!!

    相关文章

      网友评论

          本文标题:01- let 变量 与 const 常量

          本文链接:https://www.haomeiwen.com/subject/jdxjiftx.html