【JavaScript】ES6新特性(1)

news2024/11/26 22:19:53

1. let 声明变量

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

  • 块级作用域
<!DOCTYPE html>
<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>let 声明变量</title>
</head>

<body>
    <ul>
        <li>1111</li>
        <li>2222</li>
        <li>3333</li>
    </ul>

    <ol>
        <li>4444</li>
        <li>5555</li>
        <li>6666</li>
    </ol>
    <script>
        // 块级作用域
        {
            let i = 100; // 只存在块内
        }

        // // 即使在 if for 的块级也只存在于块内
        if (true) {
            let i = 100;
        }
        // console.log(i); // Uncaught ReferenceError: i is not defined
        // 报错原因是 打印的是块级外部的 i,没有检测到 i 的存在

        // var 定义的就不会报错
        if (true) {
            var i = 100;
        }
        console.log(i);

        // 不管 for 循环内部,外部也可以打印 i
        for (var i = 0; i < 5; i++) {
        }
        console.log(i); // 5
        // 弊端:会影响后面的程序

        for (let j = 0; j < 5; j++) {
        }
        // console.log(j); // Uncaught ReferenceError: j is not defined
        // 每次 for 循环都是一次新的变量
        // 循环内都会记住上一次的值,在上一次的值进行操作,直到完成循环
        // 结束后就访问不到 j,不会向外部泄露

        // 例:打印出点击 ul 下 的 li 的索引值
        // var uli = document.querySelectorAll('ul li');
        // for (var i = 0; i < uli.length; i++) {
        //     uli[i].onclick = function () {
        //         console.log(i);
        //     }
        // }
        // 改进
        var uli = document.querySelectorAll('ul li');
        for (var i = 0; i < uli.length; i++) {
            uli[i].index = i; // 将 i 赋值给每个 li 的索引值
            uli[i].onclick = function () {
                // console.log(i);
                console.log(this.index); // 直接打印相关的 li 索引值
            }
        }

        // let 
        var oli = document.querySelectorAll('ol li');
        for (let i = 0; i < oli.length; i++) {
            console.log(i);
            // i 在循环中没有被释放,依赖于 for 循环
        }
    </script>
</body>

</html>

在这里插入图片描述

  • 不允许重复声明
  • 没有变量提升
  • 暂存性死区
  • 不与顶层对象挂钩
<!DOCTYPE html>
<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>let 声明变量</title>
</head>

<body>
    <script>
        // 不允许重复声明
        var a = 1;
        var a = 10; // 重复声明
        console.log(a); // 10

        // let b = 10;
        // let b = 20;
        // 提示错误:Cannot redeclare block-scoped variable 'b'.

        // var c = 10;
        // let c = 20;
        // 报错
        // Uncaught SyntaxError: Identifier 'c' has already been declared

        // 没有变量提升
        console.log(myname); // 先显示 undefined
        var myname = 'ich'; // 变量提升,可以调用再定义,不报错

        // console.log(youname);
        // let youname = 'du';
        // 报错:Uncaught ReferenceError: Cannot access 'youname' before initialization

        // 暂存性死区
        // let mname = "ich";
        // function test() {
        //     // 暂存性死区
        //     // 因为 console.log 下面的 mname 不会变量提升,
        //     // console.log 没有找到 变量 mname
        //     // 一般情况下,没有找到就会向外部查找相应变量
        //     // 但是但进入到函数内部时,检测到有 mname,但是没有进行到下一步定义它
        //     // 所以无法使用 使用 函数内部的 mname,就会导致矛盾,出现报错
        //     console.log(mname);
        //     let mname = 'du';
        // }
        // test()
        // 报错:Uncaught ReferenceError: Cannot access 'mname' before initialization

        // 不与顶层对象挂钩
        var youage = 100;
        console.log(window.youage); // 100 与顶层对象挂钩

        let myage = 100;
        console.log(window.myage); // undefined 不与顶层对象挂钩
    </script>
</body>

</html>

在这里插入图片描述

2. const 声明常量

不允许被修改

必须初始化

不能重复定义

块级作用域

没有变量提升

不与顶层对象挂钩

<!DOCTYPE html>
<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>const 声明常量</title>
</head>

<body>
    <script>
        // 常量
        const myname = 'ich';
        // myname = 'du';
        // 不允许被修改
        // 报错:Uncaught TypeError: Assignment to constant variable

        // 必须初始化
        // const youname;
        // youname = du;
        // 报错:'const' declarations must be initialized

        // 不能重复定义
        // const mname = 'ich';
        // const mname = 'du';
        // 报错:Uncaught SyntaxError: Identifier 'mname' has already been declared

        // 块级作用域
        {
            const myage = 100;
        }
        // console.log(myage);
        // 报错:Uncaught ReferenceError: myage is not defined

        // 没有变量提升
        // const youname = 'du';
        // function test() {
        //     console.log(youname);
        //     const youname = 'panda';
        // }
        // test();
        // 报错原因没有变量提升,进入函数内部打印遇到暂存性死去
        // 报错:Uncaught ReferenceError: Cannot access 'youname' before initialization

        // 不与顶层对象挂钩
        const myage = 100;
        console.log(window.myage); // undefined
    </script>
</body>

</html>

const 问题

是不是所有 const 修饰的变量都不能被修改?

  • 对象里的属性可以被修改
<!DOCTYPE html>
<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>const 问题</title>
</head>

<body>
    <script>
        // 是不是所有 const 修饰的变量都不能被修改?
        const myobj = {
            name: 'ich',
            age: 100
        }

        // myobj = 'fff'; // 不允许

        myobj.name = "du";
        console.log(myobj);
        // 对象里的属性可以被修改,myobj 是一个地址

        // 怎么样才可以使得对象里面的属性不被修改?
        // 用 fresze 冻住对象里面的每一个属性
        const youobj = Object.freeze({
            name: 'du',
            age: 100
        })
        youobj.name = "ich";
        console.log(youobj.name); // du 对象里的属性值没有被修改到
    </script>
</body>

</html>

在这里插入图片描述

3. 解构赋值

3.1 解构数组

使用解构赋值的方式从数组中获取成员

<!DOCTYPE html>
<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>变量解构赋值</title>
</head>

<body>
    <script>
        // 数组解构赋值
        let arr = [1, 2, 3];
        let [a, b, c] = arr; // 解构赋值,a 赋值 1,b 赋值 2,c 赋值 3

        // 两数交换
        let x = 1;
        let y = 2;
        [y, x] = [x, y]
        console.log('x = ' + x, 'y = ' + y); // x = 2 y = 1

        // 单拿最后一个值
        let arr1 = [1, 2, 3];
        let [, , e] = arr1;
        console.log(e); // 3

        // 单拿二维数组中的数组的第一个值
        let arr2 = [1, [2, 3, 4], 5, 6];
        let [a1, b1, c1] = arr2;
        console.log(b1); // [2,3,4]
        // 改进
        let [a2, [b2], c2] = arr2;
        console.log(b2); // 2
        // 若要拿 4
        let [a3, [, , b3], c3] = arr2;
        console.log(b3); // 4

        // 设置默认值
        let [l] = [];
        console.log(l); // undefined,因为没有赋值,所以是 undefined
        // 不想 undefined,可以加一个默认值
        let [z = 1] = [];
        console.log(z); // 1,获得默认值
        let [q = 1] = [100]
        console.log(q); // 100,默认值被替代
    </script>
</body>

</html>

在这里插入图片描述

在这里插入图片描述

3.2 解构对象

  • 解构赋值的方式从对象中获取成员
<!DOCTYPE html>
<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>变量解构赋值</title>
</head>

<body>
    <script>
        // 解构赋值的方式从对象中获取成员
        let obj = {
            name: 'ich',
            age: 100
        }
        let { name, age } = obj;
        console.log(name, age); // ich 100

        // 交换两个顺序
        let obj1 = {
            name1: 'ich',
            age1: 100
        }
        let { age1, name1 } = obj1;
        console.log(name1, age1); // ich 100
        // 调换顺序还是取一样的,因为是以 k 值来赋值的

        // 只取对象中的一个值
        let obj2 = {
            name2: 'ich',
            age2: 100
        }
        let { age2 } = obj2;
        console.log(age2); // 100

        // 变量和对象的 k 值重名
        // let code = 'AAA';
        // let res = {
        //     code: 200,
        //     data: '111'
        // }
        // let { data, code } = res;
        // console.log(data);
        // 提示报错:Uncaught SyntaxError: Identifier 'code' has already been declared
        // 
        // 解决重名问题:
        let code = 'AAA';
        let res = {
            code: 200,
            data: '111'
        }
        let { data, code: co } = res;
        console.log(data, co); // 111 200

        // 设置默认值
        let code1 = 'AAA';
        let res1 = {
            code1: 200,
            data1: '111'
        }
        let { data1, code1: co1 , erro = "没有错误"} = res1;
        // 没设置默认值,打印的时候回打印 undefined
        console.log(data1, co1, erro); // 111 200 没有错误
    </script>
</body>

</html>

在这里插入图片描述

  • 访问对象的 属性 list 的内容
<!DOCTYPE html>
<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>变量解构赋值</title>
</head>

<body>
    <script>
        // 访问对象的 属性 list 的内容
        let code = 'AAA';
        let res = {
            code: 200,
            data: {
                list: ['111', '222', '333']
            }
        }
        // 获取 data
        let { data, code: co } = res;
        console.log(data, co); // 111 200

        // 获取 list 
        let { data: { list } } = res;
        console.log(list);

        // 获取 list 的内容
        let { data: { list: [x, y, z] } } = res;
        console.log(x, y, z);
    </script>
</body>

</html>

在这里插入图片描述

  • 使用函数来处理对象,解构对象
<!DOCTYPE html>
<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>变量解构赋值</title>
</head>

<body>
    <script>
        // 使用函数来处理对象
        function getData() {
            let res = {
                code: 200,
                data: {
                    list: ['111', '222', '333']
                }
            }

            test(res);
            test1(res);
            test2(res);
            test3(res);
        }

        function test(res) {
            console.log(res); // {code: 200, data: {…}}
        }

        // 打印对象内容
        getData();

        // 在函数传参部分进行解构
        function test1({ code, data }) {
            console.log(code, data); // 200 {list: Array(3)}
        }

        function test2({ code, data: { list } }) {
            console.log(code, list); // 200 (3) ['111', '222', '333']
        }

        function test3({ code, data: { list: [x, y, z] } }) {
            console.log(code, x, y, z); // 200 '111' '222' '333'
        } 
    </script>
</body>

</html>

在这里插入图片描述

3.3 解构字符串

  • 解构赋值的方式从字符串中获取字符
<!DOCTYPE html>
<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>解构字符串</title>
</head>

<body>
    <script>
        // 解构字符串
        let str = "string";
        let [a, b, c] = str;
        console.log(a, b, c); // s t r

        // 获取字符串长度
        let { length } = str;
        console.log(length); // 6

        // 重名问题
        let { length: len } = str;
        console.log(len); // 6
    </script>
</body>

</html>

4. 模板字符串

ES5 中我们表示字符串的时候使用 '' 或者 ""

在 ES6 中,我们还有一个东西可以表示字符串,就是 ``(反引号)

  • 和单引号好友双引号的区别
    1. 反引号可以换行书写
    2. 反引号可以直接在字符串里面拼接变量

`` 里面的 ${} 就是用来书写变量的位置

<!DOCTYPE html>
<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>模板字符串</title>
    <style>
        .active {
            color: red;
        }
    </style>
</head>

<body>
    <ul></ul>
    <hr>
    <h2>修改后</h2>
    <ol></ol>
    <script>
        // 插入 <li><b>ich</b></li> 的html标签代码
        let name = 'ich';
        let uli = "<li>\
            <b>" + name + "</b>\
            </li>"
        // 使用了字符串拼接,还有换行的符号
        // 写法麻烦
        let oli = `<li>
            <b>${name}</b>
            </li>`
        // 支持换行,${} 中可以插入变量

        console.log(oli);

        let arr = ['ich', 'du', 'ice', 'panda'];
        let newlist = arr.map(function (item) {
            return `<li>
            <b>${item}</b>
            </li>`
        })
        console.log(newlist);

        let ul = document.querySelector("ul");
        ul.innerHTML = newlist;
        // 因为有逗号分隔了
        let ol = document.querySelector("ol");
        ol.innerHTML = newlist.join(""); // 以空字符串分隔

        // 实现添加 class ,并改变第一个 li 的 css 样式
        let newlist1 = arr.map(function (item, index) {
            return `<li class="${index === 0 ? 'active' : ''}">
            <b>${item}</b>
            </li>`
        })
        console.log(newlist1);
        ol.innerHTML = newlist1.join("");
    </script>
</body>

</html>

在这里插入图片描述

在这里插入图片描述

GitHub代码
gitee代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/525129.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

08-04 中间件和平台运行期监控

缓存中间件的三大坑 缓存击穿 用户访问热点数据&#xff0c;并且缓存中没有热点数据&#xff0c;大量访问直接到DB&#xff0c;热点击穿采用Canal做数据异构方案&#xff0c;把数据库中的值全部放到缓存热点缓存策略&#xff1a;通过分析调用日志获取热点数据&#xff0c;放到…

PMP项目管理-[第十一章]风险管理

风险管理知识体系&#xff1a; 规划风险管理&#xff1a; 识别风险&#xff1a; 实施定性风险分析&#xff1a; 实施定量风险分析&#xff1a; 监督风险&#xff1a; 11.1 风险 定义&#xff1a;是一种不确定的事件或条件&#xff0c;一旦发生&#xff0c;就会对一个或多个项目…

Elasticsearch(二)

Clasticsearch&#xff08;二&#xff09; DSL查询语法 文档 文档&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl.html 常见查询类型包括&#xff1a; 查询所有&#xff1a;查询出所有数据&#xff0c;一般测试用。如&#xff1a…

eNSP模拟器下VRRP+MSTP实验配置

①&#xff1a;底层配置&#xff1a; vlan trunk 略 ②&#xff1a;MSTP配置&#xff1a; 所有交换机&#xff1a; stp region-configuration region-name aa revision-level 1 instance 1 vlan 2 to 3 instance 2 vlan 4 to 5 active region-configuration 核心1&…

Java笔记_21(网络编程)

Java笔记_21 一、网路编程1.1、初始网络编程1.2、网络编程三要素1.3、IP1.4、端口号1.5、协议1.6、UDP协议 一、网路编程 1.1、初始网络编程 什么是网络编程 在网络通信协议下&#xff0c;不同计算机上运行的程序&#xff0c;进行的数据传输。 应用场景:即时通信、网游对战…

(一)SAS初识

1、SAS常用工作窗口 “结果”&#xff08;Result&#xff09;窗口——管理SAS程序的输出结果&#xff1b; “日志”&#xff08;Log&#xff09;窗口——记录程序的运行情况&#xff1b; “SAS资源管理器”&#xff08;Explore&#xff09;窗口&#xff1b; “输出”&#xff0…

洛谷P1217-回文质数 Prime Palindromes

洛谷P1217-回文质数 Prime Palindromes 这个题目我做出来了但是超时了&#xff0c;时间复杂度有点高&#xff0c;主要是因为我用了大量的循环&#xff0c; 所以我这个是比较暴力的解法&#xff0c;下面我分析我的暴力代码 首先是判断回文数的函数 第一步将标识传入参数是不是…

[数据集][目标检测]篮球数据集VOC格式7398张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;7398 标注数量(xml文件个数)&#xff1a;7398 标注类别数&#xff1a;1 标注类别名称:["basketball"]…

详解MNIST数据集下载、解析及显示的Python实现

Content MNIST数据集基本介绍下载MNIST数据集到本地解析MNIST数据集显示MNIST数据集中训练集的前9张图片和标签 随着图像处理、计算机视觉、机器学习&#xff0c;甚至深度学习的蓬勃发展&#xff0c;一个良好的数据集作为学习和测试相关算法非常重要。MNIST数据集对于想要学习和…

PMP 高项 07-项目质量管理

项目质量管理 概念 质量的基本概念 克劳斯比&#xff1a;符合要求 戴明&#xff1a;低成本条件下可预测的一致性和可靠度&#xff0c;适应市场需要 朱兰&#xff1a;适用性&#xff0c;满足客户需要 国际标准化组织&#xff1a;质量是反映实体&#xff08;产品、过程或活动等…

中间件容器化部署实现方案的前期调研

中间件容器化部署是为了实现GitOps模式的持续交付,实现部署即代码。痛点在于大多数中间件都是有状态的,本篇介绍如何实现有状态中间件的容器化部署。 常见中间件要实现容器化部署,需要解决以下问题: 对于网关类中间件,作为流量入口,虽然是无状态类型的中间件,但由于需要…

flask实现S3 Web客户端下载文件

import io from minio import Minio from minio.error import S3Error from flask import Flask, jsonify, render_template, request, send_file# 实例化 Flask 应用 app Flask(__name__)# 配置 MinIO 客户端 minio_client Minio("192.168.2.110:58894",access_ke…

Vue CLI 初始化脚手架

3.1. 初始化脚手架 3.1.1. 说明 Vue脚手架是Vue官方提供的标准化开发工具&#xff08;开发平台&#xff09;最新的版本是 4.x文档 Vue CLI 3.1.2. 具体步骤 如果下载缓慢请配置npm淘宝镜像npm config set registry http://registry.npm.taobao.org全局安装 vue/cli npm ins…

Python BP算法模板

BP算法模板 神经网络结构 三大基本结构 权重(轴突、树突) 权重的矩阵表示 数值(胞体) 数值处理方式 sigmoid 函数 def __sigmoid(self,x):return 1 / (1 np.exp(-x))sigmoid 的导函数 def __sigmoid_prime(self,x):return x * (1 - x)sigmoid 函数图像 其目的是将数值限制…

Java多线程synchronized Lock volatile,看完这一篇就够了

线程安全问题 一、对线程安全的理解&#xff08;实际上是内存安全&#xff09;二、线程同步的实现方法synchronized实现同步Lock实现同步volatile实现同步JUC的Callable实现同步 三、守护线程四、ThreadLocal原理和使用场景五、Thread类的常用方法&#xff0c;以及线程的状态六…

Linux下使用Mysql 第二天

目录 Mysql数据库API库 编写hello应用链接函数库 MySQL API常用函数 总体印象 初始化 Makefile 管理 连接数据库关闭连接 读取数据 查询表数据 获取结果集 解析结果集 释放结果集 获取列数 获取表头 实例程序 MySQL tools实现 思路分析 程序实现 中文问题 …

MS iCraft Z790ITX WIFI 电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件型号驱动情况 主板MS iCraft Z790ITX WIFI 处理器Intel Core i5-13400已驱动 内存Asgard DDR5 6400CL32 16GBx2 RGB已驱动 硬盘西数 WDS250G3X0C-00SJG0 ( SN750) …

如何设计API返回码(错误码)?

一、前言 客户端请求 API&#xff0c;通常需要通过返回码来判断 API 返回的结果是否符合预期&#xff0c;以及该如何处理返回的内容等 相信很多同学都吃过返回码定义混乱的亏&#xff0c;有的 API 用返回码是 int 类型&#xff0c;有的是 string 类型&#xff0c;有的用 0 表…

ansible 常用用例

目录 一、说明 二、创建 ansible 环境 三、实验操作 四、install_ansible.sh 脚本内容 一、说明 该文档是日常经常使用的模板&#xff0c;通过该例子让更多的初学者了解ansible 剧本的写法&#xff0c;很多情况&#xff0c;可以按照该模版来套用即可。 读者不需要下载…

6.深入理解Mysql事务隔离级别与锁机制

MySQL性能调优 1. 概述2. 事务及其ACID属性2.1并发事务带来的问题2.2 事务隔离级别 3. 锁详解3.1 锁分类3.1.1 表锁3.1.2 行锁3.1.3 间隙锁(Gap Lock)3.1.4 临键锁(Next-key Locks)3.1.5 行锁分析3.1.6 查看INFORMATION_SCHEMA系统库锁相关数据表3.1.7 死锁3.1.8 锁优化建议 4.…