2023/3/7日笔记

81 阅读2分钟

4-1、数组的解构赋值

什么是解构赋值

  • 解析某一数据的结构,将我们想要的东西提取出来,赋值给变量或常量

代码案例

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>4-1、数组的解构赋值</title>
</head>
<body>
    <script>
        // 1.认识解构赋值
        // const arr = [1,2,3];
        // const a = arr[0];
        // const b = arr[1];
        // const c = arr[2];
        // console.log(a,b,c);

        const [a,b,c] = [1,2,3];
        console.log(a,b,c);
        // 2.什么是解构赋值
        // 解析某一数据的结构,将我们想要的东西提取出来,赋值给变量或常量
    </script>
</body>
</html>

4-2、数组解构赋值的原理

代码案例

<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>4-2、数组解构赋值的原理</title>
</head>

<body>
    <script>
        // 1.模式(结构)匹配
        // [] = [1,2,3];

        // 2.索引值相同的完成赋值
        // const [a,b,c] = [1,2,3];
        // console.log(a,b,c);

        // 不取的,可以直接用逗号跳过
        const [a, [, , b], c] = [1, [2, 3, 4], 5];
        console.log(a, b, c);
    </script>
</body>

</html>

4-3、数组解构赋值的默认值

默认值的生效条件

  • 只有当一个数组成员严格等于(===)undefined时,对应的默认值才会生效

默认值表达式

  • 如果默认值是表达式,默认值表达式是默认求值的。即可以理解为用得到才会调用,用不到就不会调用

代码案例

<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>4-3、数组解构赋值的默认值</title>
</head>

<body>
    <script>
        // 1.默认值的基本用法
        // const [a,b] = [];
        // // 等价于
        // const [a1,b1] = [undefined,undefined];
        // console.log(a,b,a1,b1);

        // const [a = 1, b = 2] = [];
        // console.log(a, b);

        // 2.默认值的生效条件
        // 只有当一个数组成员严格等于(===)undefined时,对应的默认值才会生效
        // const [a = 1, b = 2] = [3, 0];       //3,0
        // const [a = 1, b = 2] = [3, null];    // 1,null
        // const [a = 1, b = 2] = [3];          // 3,2
        // console.log(a,b);

        // 3.默认值表达式
        // 如果默认值是表达式,默认值表达式是默认求值的。即可以理解为用得到才会调用,用不到就不会调用
        const func = () => {
            console.log("我被执行了");
            return 2;
        };
        // const [x = func] = [1]
        const [x = func()] = [];
        console.log(x);
    </script>
</body>

</html>

4-4、数组解构赋值的应用

代码案例

<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>4-4、数组解构赋值的应用</title>
</head>

<body>
    <p>123</p>
    <p>321</p>
    <p>345</p>
    <script>
        // 1.常见的类数组的解构赋值
        // arguments
        // function fun() {
        //     // console.log(arguments);
        //     // console.log(arguments.push);
        //     const [x,y]=arguments;
        //     console.log(x,y);
        // }
        // // fun();
        // fun(1,2);

        // NodeList
        // console.log(document.querySelectorAll("p"));
        // const [p1,p2,p3] =document.querySelectorAll("p");
        // console.log(p1,p2,p3);

        // 2.函数参数的解构赋值
        // const array = [1, 1];
        // // const add = arr => arr[0] + arr[1];
        // // 可以理解为 形参[x,y] = 实参[1,1]
        // const add = ([x,y]) => x+y;
        // const add = ([x = 0,y = 0]) => x+y;
        // console.log(add(array));
        // console.log(add([]));
        
        // 3.交换变量的值
        let a = 1;
        let b = 2;
        
        // let c = a;
        // a = b;
        // b = c;
        // console.log(a,b);

        // [a,b] = [b,a];
        [a,b] = [2,1];
        console.log(a,b);

    </script>
</body>

</html>

5-1、对象的解构赋值

代码案例

<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>5-1、对象的解构赋值</title>
</head>

<body>
    <script>
        // 1.模式(结构)匹配
        // {}={}

        // 2.属性名相同的完成赋值
        // const {age,username} = {username:"114514",age:24};
        // const {age:age,username:username} = {username:"114514",age:24};
        // console.log(age,username);

        // 取别名
        const { age: ages, username: uname } = { username: "114514", age: 24 };
        console.log(ages, uname);
    </script>
</body>

</html>

5-2、对象解构赋值的注意事项

默认值的生效条件

  • 对象的属性值严格等于 undefined 时,对应的默认值才会生效

默认值表达式

  • 如果默认值是表达式,默认值表达式是惰性求值的

将一个已经声明的变量用于解构赋值

  • 如果将一个已经声明的变量用于对象的解构赋值,整个赋值需再圆括号中进行

代码案例

<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>5-2、对象解构赋值的注意事项</title>
</head>

<body>
    <script>
        // 1.默认值的生效条件
        // 对象的属性值严格等于 undefined 时,对应的默认值才会生效
        const { username = "ZhangSan", age = 0 } = { username: "Alex" }
        console.log(username, age);

        // 2.默认值表达式
        // 如果默认值是表达式,默认值表达式是惰性求值的
        // 只要默认值是表达式,就不区分是数组还是对象,都是一样惰性求值,故此处案例省略

        // 3.将一个已经声明的变量用于解构赋值
        // 如果将一个已经声明的变量用于对象的解构赋值,整个赋值需再圆括号中进行
        // let {x} = {x:1}
        // let x = 1;
        // ({x} = {x:"Alex"})
        // [x] = [1]
        // console.log(x);

        // 4.可以取到继承的属性
        // const {a = 1} = {};
        // const { toString } = {};
        // console.log(toString);
        // Object.prototype
        // console.log(Object.prototype);
        console.log({});
    </script>
</body>

</html>

5-3、对象解构赋值的应用

代码案例

<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>5-3、对象解构赋值的应用</title>
</head>
<body>
    <script>
        // 1.函数参数的解构赋值
        // const logPersonInfo = user => console.log(user.username,user.age);
        // logPersonInfo({username:"张三",age:24});

        // const logPersonInfo = ({age,username}) => console.log(username,age);
        // logPersonInfo({username:"张三",age:24});

        // const logPersonInfo = ({age = 0,username = "ZhangSan"}) => console.log(username,age);
        // logPersonInfo({});

        // 2.复杂的嵌套
        const obj = {
            x: 1,
            y: [2,3,4],
            z: {
                a: 5,
                b: 6,
            }
        };
        // 如果只想获取到3
        const {y:[,yyy]} = obj;
        console.log(yyy);

        // 如果想要获取整个y
        // const {y} = obj;
        const {y:y} = obj;
        console.log(y);

        // 如果想要获取整个z和z里面的b
        const {z,z:{b:b}} = obj;
        console.log(z,b);
    </script>
</body>
</html>

5-4、其他数据类型的解构赋值

字符串的解构赋值

  • 字符串既可以按数组形式来解构赋值,也可以按对象形式来解构赋值

undefined 和 null 的解构赋值

  • 由于undefined 和 null 无法转为对象,所以对它们进行解构赋值,都会报错
  • 或者说 undefined 和 null 没有对应的包装对象所以无法通过它们转换成相应对象

代码案例

<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>5-4、其他数据类型的解构赋值</title>
</head>

<body>
    <script>
        // 1.字符串的解构赋值
        // 数组形式的解构赋值
        // const [a,b,,,c] = "hello";
        // console.log(a,b,c);

        // 对象形式的解构赋值
        // const { 0: a, 1: b, 4: c, length } = "hello";
        // console.log(a, b, c, length);
        // console.log("hello".length);

        // 字符串既可以按数组形式来解构赋值,也可以按丢相信是来解构赋值

        // 2.数值和布尔值的解构赋值
        // 先将等号右边的值转为对象
        // console.log(new Number(123));
        // const { a, toString } = 123;
        // const { a = 1,toString } = 123;
        // console.log(a,toString);

        // const { b = 2, toString } = true;
        // console.log(b, toString);
 
        // 3.undefined 和 null 的解构赋值
        // 由于undefined 和 null 无法转为对象,所以对它们进行解构赋值,都会报错
        // 或者说 undefined 和 null 没有对应的包装对象所以无法通过它们转换成相应对象
        // const {toString} = undefined;
        // const {toString} = null;
    </script>
</body>

</html>