zoukankan      html  css  js  c++  java
  • 第四章 变量声明

    变量声明

    一、let 和 const

    • let 和 const 是 JavaScript 里相对较新的变量声明方式。 let 在很多方面与 var 是相似的,但是可以帮助大家避免在 JavaScript 里常见一些问题(如作用域提升)。 const 是对 let 的一个增强,它能阻止对一个变量再次赋值。

    • 因为 TypeScript 是 JavaScript 的超集,所以它本身就支持 let 和 const。 推荐使用它们来代替 var。

    • 使用最小特权原则,所有变量除了你计划去修改的都应该使用 const。

    二、代码示例

    //块级作用域变量的获取
    function theCityThatAlwaysSleeps() {
        let getCity;
    
        if (true) {
            let city = "Seattle";
            getCity = function() {
                return city;
            };
        }
    
        return getCity();
    }
    
    //重定义及屏蔽,这个版本的循环能得到正确的结果,因为内层循环的i可以屏蔽掉外层循环的i
    function sumMatrix(matrix: number[][]) {
        let sum = 0;
        for (let i = 0; i < matrix.length; i++) {
            var currentRow = matrix[i];
            for (let i = 0; i < currentRow.length; i++) {
                sum += currentRow[i];
            }
        }
    
        return sum;
    }
    
    //const 声明
    const numLivesForCat = 9;
    const kitty = {
        name: "Aurora",
        numLives: numLivesForCat
    };
    // Error
    kitty = {
        name: "Danielle",
        numLives: numLivesForCat
    };
    // all "okay"
    kitty.name = "Rory";
    kitty.name = "Kitty";
    kitty.name = "Cat";
    kitty.numLives--;
    

    三、解构

    • 解构数组
    //最简单的解构
    let input = [1, 2];
    let [first, second] = input;
    console.log(first); // outputs 1
    console.log(second); // outputs 2
    
    // 交换变量
    [first, second] = [second, first];
    
    //作用于函数参数
    function f([first, second]: [number, number]) {
        console.log(first);
        console.log(second);
    }
    f(input);
    
    //数组里使用...语法创建剩余变量
    let [first, ...rest] = [1, 2, 3, 4];
    console.log(first); // outputs 1
    console.log(rest); // outputs [ 2, 3, 4 ]
    
    //忽略你不关心的尾随元素
    let [first] = [1, 2, 3, 4];
    console.log(first); // outputs 1
    let [, second, , fourth] = [1, 2, 3, 4];
    
    • 对象解构
    //对象解构
    let o = {
        a: "foo",
        b: 12,
        c: "bar"
    };
    let { a, b } = o;
    
    //就像数组解构,你可以用没有声明的赋值
    ({ a, b } = { a: "baz", b: 101 });
    
    //你可以在对象里使用...语法创建剩余变量
    let { a, ...passthrough } = o;
    let total = passthrough.b + passthrough.c.length;
    
    • 属性重命名
    //你也可以给属性以不同的名字
    let { a: newName1, b: newName2 } = o;
    
    • 默认值
    //默认值可以让你在属性为 undefined 时使用缺省值
    function keepWholeObject(wholeObject: { a: string; b?: number }) {
        let { a, b = 1001 } = wholeObject;
    }
    
    • 函数声明
    //解构也能用于函数声明
    type C = { a: string; b?: number };
    function f({ a, b }: C): void {
        // ...
    }
    
    • 展开
    //将一个数组展开为另一个数组
    let first = [1, 2];
    let second = [3, 4];
    let bothPlus = [0, ...first, ...second, 5];
    
    //将一个对象展开为另一个对象
    let defaults = { food: "spicy", price: "$$", ambiance: "noisy" };
    let search = { ...defaults, food: "rich" };
    //注意:如果前后对象有相同的属性,则后面的覆盖前面的
    
  • 相关阅读:
    Spring3+hibernate4+struts2整合的 过程中发生如下错误
    使用HQL语句的按照参数名字查询数据库信息的时候 “=:”和参数之间不能存在空格,否则会报错
    org.hibernate.service.classloading.spi.ClassLoadingException: Specified JDBC Driver com.mysql.jdbc.Driver class not found
    Java多线程编程:
    数据库连接池的工作原理
    Oracle数据库表的备份和数据表的删除操作
    数据库连接池
    Mysql登录异常的一个问题:
    2019年终总结
    设计模式入门-简单工厂模式
  • 原文地址:https://www.cnblogs.com/zfc2201/p/8157592.html
Copyright © 2011-2022 走看看