zoukankan      html  css  js  c++  java
  • 【JavaScript】let和const

    let 关键字:声明的变量只在 let 命令所在的代码块内有效

    重新定义变量

    let 关键字就可以解决这个问题,因为它只在 let 命令所在的代码块 {} 内有效。

    var x = 10; 
    // 这里输出 x 为 10 
    { 
        let x = 2; 
        // 这里输出 x 为 2 
    } 
    // 这里输出 x 为 10

    使用全局变量

    使用 let 关键字声明的全局作用域变量不属于 window 对象:

    let carName = "Volvo"; 
    // 不能使用 window.carName 访问变量

    重置变量

    在相同的作用域或块级作用域中,不能使用 let 关键字来重置 var、 let  关键字声明的变量;不能使用 var 关键字来重置 let 关键字声明的变量;

    var x = 2;       // 合法
    let x = 3;       // 不合法
    {
        var x = 4;   // 合法
        let x = 5   // 不合法
    }
    
    let x = 2;       // 合法
    let x = 3;       // 不合法
    {
        let x = 4;   // 合法
        let x = 5;   // 不合法
    }
    
    let x = 2;       // 合法
    var x = 3;       // 不合法
    {
        let x = 4;   // 合法
        var x = 5;   // 不合法
    }

    let 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的

    let x = 2;       // 合法
    {
        let x = 3;   // 合法
    }
    {
        let x = 4;   // 合法
    }

    const关键字:用于声明一个或多个只读的常量,声明时必须进行初始化,且初始化后值不可再修改

    const PI = 3.141592653589793;
    PI = 3.14;      // 报错
    PI = PI + 10;   // 报错

    const定义常量与使用let 定义的变量相似:

    • 二者都是块级作用域
    • 都不能和它所在作用域内的其他变量或函数拥有相同的名称

    两者还有以下两点区别:

    • const声明的常量必须初始化,而let声明的变量不用
    • const 定义常量的值不能通过再赋值修改,也不能再次声明。而 let 定义的变量值可以修改。

    const 声明的常量必须初始化:

    // 错误写法
    const PI;
    PI = 3.14159265359;
    
    // 正确写法
    const PI = 3.14159265359;

    并非真正的常量

    const 的本质:const 定义的变量并非常量,并非不可变,它定义了一个常量引用一个值。使用 const 定义的对象或者数组,其实是可变的。下面的代码并不会报错:

    // 创建常量对象 
    const car = {type:"Fiat", model:"500", color:"white"}; 
    // 修改属性
    car.color = "red"; 
    // 添加属性 
    car.owner = "Johnson";

    但是我们不能对常量对象重新赋值:

    const car = {type:"Fiat", model:"500", color:"white"}; 
    car = {type:"Volvo", model:"EX60", color:"red"}; // 错误

    以下实例修改常量数组:

    // 创建常量数组 
    const cars = ["Saab", "Volvo", "BMW"]; 
    // 修改元素 
    cars[0] = "Toyota"; 
    // 添加元素 
    cars.push("Audi");
    //输出cars:Toyota,Volvo,BMW,Audi

    但是我们不能对常量数组重新赋值:

    const cars = ["Saab", "Volvo", "BMW"]; 
    cars = ["Toyota", "Volvo", "Audi"]; // 错误

    重置变量

    在相同的作用域或块级作用域中,不能使用 const 关键字来重置 var、let、const 关键字声明的变量:

    var x = 2;         // 合法
    const x = 2;       // 不合法
    {
        let x = 2;     // 合法
        const x = 2;   // 不合法
    }
    
    const x = 2;       // 合法
    const x = 3;       // 不合法
    x = 3;             // 不合法
    var x = 3;         // 不合法
    let x = 3;         // 不合法
    {
        const x = 2;   // 合法
        const x = 3;   // 不合法
        x = 3;         // 不合法
        var x = 3;     // 不合法
        let x = 3;     // 不合法
    }

    const 关键字在不同作用域,或不同块级作用域中是可以重新声明赋值的:

    const x = 2;       // 合法
    {
        const x = 3;   // 合法
    }
    {
        const x = 4;   // 合法
    }

    const 定义的变量并非不可改变,比如使用const声明对象,可以改变对象值。那么什么情况能彻底“锁死”变量呢?可以使用Object.freeze()方法来 冻结变量 ,如:

    // 创建常量数组
    const cars = ["Saab", "Volvo", "BMW"];
    //冻结变量
    Object.freeze(cars)
    // 修改元素
    cars[0] = "Toyota";
    // 显示数组
    document.getElementById("demo").innerHTML = cars; 
    
    //输出:Saab,Volvo,BMW

    需要注意的是,被冻结后的对象不仅仅是不能修改值,同时也

    1. 不能向这个对象添加新的属性
    2. 不能修改其已有属性的值
    3. 不能删除已有属性
    4. 不能修改该对象已有属性的可枚举性、可配置性、可写性
  • 相关阅读:
    Linux 常用命令
    silky微服务简介
    okhttp中的Builder模式
    Assert in C#&Java
    Abstract类中使用@Autowire
    @Scope("prototype") bean scope not creating new bean
    【转】centos系统查看cpu内存等情况
    hdu 7013 String Mod 题解
    牛客 11259 H Scholomance Academy 题解
    bzoj 2151 种树 题解
  • 原文地址:https://www.cnblogs.com/zhaoyl9/p/14661842.html
Copyright © 2011-2022 走看看