ES6(一):let和const、模板字符串、函数默认值、剩余参数、扩展运算符、箭头函数

news2024/9/23 15:23:09

一、let和const声明变量

1.let没有变量提升,把let放下面打印不出来,放上面可以

<script>
        console.log(a);
        let a=1;
    </script>

2.let是一个块级作用域,花括号里面声明的变量外面找不到

<script>
        console.log(b);
        if(true)
        {
            let b=1;
        }
         //undefined
        if(true)
        {
            let b=1;
        }
        console.log(b);
         //undefined
        console.log(b);
        if(true)
        {
            var b=1;
        }
        //undefined
        if(true)
        {
            var b=1;
        }
        console.log(b);
        // 1
    </script>

3.不能重复声明

<script>
        let a=1;
        let a=2;
        console.log(a);
        
    </script>

var会覆盖,但是let会报错,可以避免写代码的时候重复命名问题

4.const

const赋值之后,变量值就不能再修改了

<script>
        const a=1;
         a=2;
        console.log(a);
        //报错
    </script>
const people={
            name:'ttt'
        }
        people.name='hhh';
        console.log(people.name);// hhh
        
        const people={
            name:'ttt'
        }
        people={
            age=18
        }
        console.log(people.age);// 报错

const也能声明对象这种常量,不可以修改对象,可以修改对象里的一些属性

5.let和const相同点和不同点

相同:都不能重复声明、是块级作用域、没有变量提升

不同:const赋值之后不能修改

6.优点

(1)for循环用let比var好

<script>
        var a=[];
        for(var i=0;i<10;i++)
        {
            a[i]=function(){
                return i;
            }
        }
        console.log(a[5]());
    </script>

最后输出来是个10,我悟了,学js的时候遇到过这个问题当时没搞懂,i是全局变量的意思是,如果i变了,其他地方的i都变(整个页面都是这一个i),上面这段输出的不管a[几]都是10。下面第一段i没走完就去赋值,结果正常,第二段没有变量提升所以也正常。

var a=[];
        for(var i=0;i<10;i++)
        {
            a[i]=i;
        }
        console.log(a[1]);
const a=[];
        for(let i=0;i<10;i++)
        {
            a[i]=function(){
                return i;
            }
        }
        console.log(a[1]());

for里面肯定不用const,后面++会被改

(2)不会污染全局变量

let RegExp=10;
        console.log(RegExp);//10
        console.log(window.RegExp);//f RegExp[]

window的对象不会被改

总结:默认情况下用const,除非你要修改再用let

二、模版字符串

<script>
        var p=document.querySelector('p');
        var id='hh';
        const text='lilili';
        div.innerHTML="<ul><li><p id="+id+">"+text+"</p></li></ul>";
    </script>

以前写是这样的,要拼接字符串,升级版:

var div=document.querySelector('div');
        const id='hh';
        const text='lilili';
        div.innerHTML=`<ul>
            <li>
                <p id=${id}>${text}</p>
            </li>
            </ul>`;

id和text用${}包起来,这种方法类似在body写

三、函数默认值、剩余参数、扩展运算符

1.函数默认值

以前写一个加和函数的话:a b 如果没有输入得有一个默认值。

<script>
        function add(a,b){
            a=a||10;
            b=b||20;
            return a+b;
        }
        console.log(add());
    </script>

ES6中:

 <script>
        function add(a=10,b=20){
            return a+b;
        }
        console.log(add(20,30));
    </script>

可以直接在()中写

function add(a,b=20){
            return a+b;
        }
        console.log(add(20));//40?
        function add(a=20,b){
            return a+b;
        }
        console.log(add(20));//报错

老师讲的是只给一个值,像第一种a可以给到,b有值,能出结果,第二种肯定不行,但是我浏览器上第一种也不行,都是NaN

function zhi(c){
            return c+5;
        }

        function add(a=zhi(4),b=20){
            return a+b;
        }
        console.log(add());//29

默认值也可以用函数来写。

2.剩余参数

以前我们传参数的时候,不确定有几个参数值不是就用arguments伪数组来代替吗,如下:

<script>
        let obj={
            title:'算法',
            name:'ttt',
            age:18
        }
        function pick(obj){
            //对象肯定得给我传进来,后面你选择了啥不一定
            let result=Object.create(null);
            //创建一个对象,最后这个函数得把函数返回出去
            for(var i=1;i<arguments.length;i++)
            //从1开始,0是对象
            {
                //arguments[i]是name 和age;
                result[arguments[i]]=obj[arguments[i]];
                //arguments[i]才是里面的值
            }
            return result;
        }
        let hh=pick(obj,'name','age');
        //把obj对象中的name、age用pick方法选出来,存到hh对象中去
        console.log(hh);
        
    </script>

es6中:用...具名参数指定剩余参数

function pick(obj,...keys){
            //keys可以随便取
            //对象肯定得给我传进来,后面你选择了啥不一定
            let result=Object.create(null);
            for(let i=0;i<keys.length;i++)
            //从0开始
            {
                //keys[i]是name 和age;
                result[keys[i]]=obj[keys[i]];
                //keys[i]才是里面的值
            }
            return result;
        }
        let hh=pick(obj,'title','age');
        //把obj对象中的name、age用pick方法选出来,存到hh对象中去
        console.log(hh);

区别就是...是真数组,arguments是伪数组;obj对应let hh=pick(obj,'title','age');中的obj,所以i就从1开始了。

3.扩展运算符

剩余参数是把多个独立的合并到一个数组中去,扩展运算符就是把一个数组分割,并将各个项作为分离的参数给函数。

(1)以前我们想要获取两个数组中最大值的时候用apply

let a=[1,2,3,4];
        let b=[1,3,5,2];
        console.log(Math.max.apply(a,b));//5

es6:不再用apply了

let b=[1,3,5,2];
        console.log(Math.max(...a));//5
let b=[1,3,5,2];
        let a={
            c:1,
            ...b
        }
        console.log(a);

a那里再...就不行了

四、箭头函数

1.箭头函数的语法

用=>代替之前的function。

// let arr=function(a,b){
        //     return a+b;
        // }
        let arr=(a,b)=>a+b
            //两个形参必须加()
        console.log(arr(10,20));

没有参数的情况:

let arr=()=>'hh'
        console.log(arr(10,20));

输出是个数组的话得用()包起来

// let arr=id=>{
        //     return{
        //         id:'id',
        //         name:'hh'
        //     }
        // }
        let arr=id=>({ id:'id',name:'hh'});
        let obj=arr(1);
        console.log(obj);

2.对象中的函数和箭头函数

 let people={
            name:'hh',
            eat:function(food){
                console.log(this.name+'吃了'+food);
            },
            eat2:food=>console.log(people.name+'吃了'+food),
            eat3:(food){
                console.log(people.name+'吃了'+food);
            }
        }
        people.eat3('chincken');

3.箭头函数的this指向

function的this就是看外面是谁,箭头函数的this就得往外翻两层

箭头函数没有this指向,箭头函数内部this只能通过查找作用域链来确定。

例1:

let Person = {
    name: 'zzy',
    age: 18,
    getAge: function () {
        console.log(this.age);
    }
}
Person.getAge();  //18
let Person = {
    name: 'zzy',
    age: 18,
    getAge: () => {
        console.log(this.age);
    }
}
Person.getAge();  //undefined

用function的时候,this指向的就是这个函数的调用者,但是用箭头函数,this就得翻两层,第二个指向外面的外面就是window,window没有age属性。

例2:

let Dj = {
    id: 007,
    drop: function () {
        document.addEventListener('click', function () {
        	console.log(this);  //document
            this.dance();
        })
    },
    dance: function () {
        console.log('drop the beat');
    }
}
Dj.drop();  //报错

这是一个dj对象,调用dj.drop,点击document之后发生事件,调用者是document,所以this指向document,而document没有dance方法

let Dj = {
    id: 007,
    drop: function () {
        document.addEventListener('click', () => {
            console.log(this);  //Dj
            this.dance();
        })
    },
    dance: function () {
        console.log('drop the beat');
    }
}
Dj.drop();  //drop the beat

点击之后因为有箭头函数,this就得往外翻两个大括号到dj里面,有dance这个方法

let Dj = {
    id: 007,
    drop: () => {
        document.addEventListener('click', () => {
            console.log(this);  //window
            this.dance();
        })
    },
    dance: function () {
        console.log('drop the beat');
    }
}
Dj.drop();  //报错

现在是往外翻四次,到了window 里面,没有dance方法

例3:

(es5的)中bind是让newfn复制一份fn过来,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用。所以再次调用fn还是指向window

let people={
            name:'hh',
            color:'pink'
        }
        function fn(){
            console.log(this);
            return ()=>{
                console.log(this);
            }
        }
        fn();
        let newfn=fn.bind(people);
        newfn();
//Window {window: Window, self: Window, document: document, name: '', location: Location, …}

{name: 'hh', color: 'pink'}

4.箭头函数的注意事项

1.箭头函数内部没有arguments了(arguments 是一个伪数组对象。代表传给一个function的参数列表。)this都指向window 了,arguments是外两层了不能用,没有外一层了。

2.箭头函数不能使用new关键字来事例化对象,function 是一个对象,但是箭头函数其实不是一个对象,是一个语法糖。

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

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

相关文章

Ubuntu系统的安装及基础操作

目录 一、VMware虚拟机安装Ubuntu20.04过程 1、安装前的准备工作 2、VMware虚拟机创建Ubuntu操作系统 步骤一&#xff1a;以管理员的身份运行VMware虚拟机 步骤二&#xff1a;新建虚拟机 步骤三&#xff1a;选择类型配置 步骤四&#xff1a;选择安装客户机操作系统 步骤…

一文解答:wifi贴码推广什么时候开始的?

随着互联网的快速发展和智能手机的普及&#xff0c;人们的生活方式也在发生着翻天覆地的变化&#xff0c;对于网络连接的需求也变得越来越迫切。在这样的背景下&#xff0c;WiFi贴码推广作为一种便捷的网络连接方式逐渐流行起来。那么&#xff0c;WiFi贴码推广究竟是什么时候开…

PostgreSQL - 查看表膨胀空间

目录 使用pgstattuple插件查看表膨胀空间 死元组&膨胀系数清理 查看表占用磁盘空间大小是如何组成的 什么是fms和vm&#xff1f; 什么是TOAST&#xff1f; 查看表和其关联的TOAST表的oid的关系 方法一 方法二 参考文档 使用pgstattuple插件查看表膨胀空间 select…

Clickhouse 单机部署安装

前言 在大数据的时代背景下&#xff0c;数据的处理和分析能力成为企业竞争力的关键。ClickHouse&#xff0c;作为一款由俄国Yandex公司开发的分布式数据分析型数据库&#xff0c;凭借其卓越的性能和稳定性&#xff0c;赢得了业界的广泛关注。本文将介绍ClickHouse的基本概念、…

中科数安|公司办公终端、电脑文件数据 \ 资料防泄密系统

#中科数安# 中科数安是一家专注于信息安全技术与产品研发的高新技术企业&#xff0c;其提供的公司办公终端、电脑文件数据及资料防泄密系统&#xff08;也称为终端数据防泄漏系统或简称DLP系统&#xff09;主要服务于企业对内部敏感信息的安全管理需求。 www.weaem.com 该系统…

在webapp中手动发布一个应用

部署应用前&#xff0c;我们需要下载Tomcat。 下载官网: Apache Tomcat - Welcome! 1、下载 第一步 : 找到Download目录下的Tomcat8 第二步:选择下载第一个zip链接 2、下载完成后&#xff0c;解压并打开Tomcat文件 3、找到并点击webapp文件 创建一个文件夹 在创建的文件中…

蓝桥杯第十一届电子类单片机组程序设计

目录 前言 单片机资源数据包_2023&#xff08;点击下载&#xff09; 一、第十一届比赛原题 1.比赛题目 2.赛题解读 1&#xff09;计数功能 2&#xff09;连续按下无效按键 二、部分功能实现 1.计数功能的实现 2.连续按下无效按键的处理 3.其他处理 1&#xff09;对于…

【危化品泄漏源定位】基于改进哈里斯鹰优化算法的危化品泄漏源定位算法 溯源定位算法【Matlab代码#63】

文章目录 【获取资源请见文章第7节&#xff1a;资源获取】1. 算法概述2. 原始哈里斯鹰算法&#xff08;HHO&#xff09;3. 改进哈里斯鹰算法&#xff08;IHHO&#xff09;3.1 动态自适应逃逸能量3.2 动态扰动策略 4. 构建源强和位置反算模型5. 部分代码展示6. 仿真结果展示7. 资…

BigDecimal类 --java学习笔记

BigDecimal 用于解决浮点型运算时&#xff0c;出现结果失真的问题 BigDecimal常用构造器和方法&#xff1a; HALF_UP 四舍五入

Qt-QPainter drawText方法不同重载之间的区别

QPainter类的drawText方法有如下重载&#xff1a; void drawText(const QPointF &position, const QString &text) void drawText(const QPoint &position, const QString &text) void drawText(int x, int y, const QString &text) void drawText(co…

人人站CMS后台登不进去解决方案(已解决)

公司有一个网站使用的是人人站CMS&#xff0c;最近发现后台登录不进去&#xff0c;有以下报错 发生以下错误: file get contents(http://www.rrzcms.com/Public/cms/config/config.ison): failed to open stream: HTTP reguest failed! 请求的URL导致内部服务器错误。 如果您反…

三维铁木辛柯梁Matlab有限元编程 | 弹簧支座 | 弹性支撑单元| Matlab源码 | 理论文本

专栏导读 作者简介&#xff1a;工学博士&#xff0c;高级工程师&#xff0c;专注于工业软件算法研究本文已收录于专栏&#xff1a;《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现&#xff0c;并提供所有案例完整源码&#xff1b;2.单元…

茶叶加工厂用什么ERP比较好

茶叶加工厂&#xff0c;作为传统与现代相结合的产业&#xff0c;面临着销售渠道多样化、管理场景复杂化以及数据共享需求迫切等挑战。在这样的背景下&#xff0c;选择一款合适的ERP软件显得尤为重要。那么&#xff0c;茶叶加工厂究竟该选用什么样的ERP系统呢? 在众多ERP软件中…

C# danbooru Stable Diffusion 提示词反推 Onnx Demo

目录 说明 效果 模型信息 项目 代码 下载 C# danbooru Stable Diffusion 提示词反推 Onnx Demo 说明 模型下载地址&#xff1a;https://huggingface.co/deepghs/ml-danbooru-onnx 效果 模型信息 Model Properties ------------------------- ----------------------…

用户案例|向量引擎在携程酒店搜索中的应用场景和探索

Zilliz AI 初创计划是面向 AI 初创企业推出的一项扶持计划&#xff0c;预计提供总计 1000 万元的 Zilliz Cloud 抵扣金&#xff0c;致力于帮助 AI 开发者构建高效的非结构化数据管理系统&#xff0c;助力打造高质量 AI 服务与运用&#xff0c;加速产业落地。访问https://zilliz…

部署prometheus+Grafana可视化仪表盘监控服务

一、部署prometheus及监控仪表盘 简介 Prometheus是开源监控报警系统和时序列数据库(TSDB)。 Prometheus的基本原理是通过HTTP协议周期性抓取被监控组件的状态&#xff0c;任意组件只要提供对应的HTTP接口就可以接入监控&#xff0c;输出被监控组件信息的HTTP接口被叫做expo…

微信公众号测试号里面显示若依前端页面

内网穿透 注册购买内网穿透隧道 https://natapp.cn/ 启动成功 这样就绑定你的本地启动项目 微信公众测试号配置 注册微信公众号测试号 获取access_token&#xff0c;AppID与appsecret 调用微信官方接口生成access_token&#xff08;AppID和AppSecret可在“微信公众平台-设置…

IAB视频广告标准《数字视频和有线电视广告格式指南》之 简介、目录及视频配套广告 - 我为什么要翻译介绍美国人工智能科技公司IAB系列(2)

写在前面 谈及到中国企业走入国际市场&#xff0c;拓展海外营销渠道的时候&#xff0c;如果单纯依靠一个小公司去国外做广告&#xff0c;拉渠道&#xff0c;找代理公司&#xff0c;从售前到售后&#xff0c;都是非常不现实的。我们可以回想一下40年前&#xff0c;30年前&#x…

蓝桥杯--冶炼金属

目录 一、题目 二、解决代码 &#xff08;1&#xff09;版本一&#xff08;报错&#xff1a;超时&#xff09; 代码分析 &#xff08;2&#xff09;版本二&#xff08;不会超时&#xff09; 代码分析 &#xff08;3&#xff09;版本三&#xff08;最终精简版&#xff09;…

Github 2024-03-11 开源项目周报 Top15

根据Github Trendings的统计&#xff0c;本周(2024-03-11统计)共有15个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目4TypeScript项目3Jupyter Notebook项目3C#项目1HTML项目1CSS项目1Dart项目1Lua项目1Shell项目1Rust…