【JavaScript】JS高级语法

目录

1.变量与函数

1.1作用域

1.2定义变量

1.3作用域链

1.4闭包

1.5预解析

1.6let提升

1.7函数参数

1.8箭头函数 

2.解构赋值

3.1数组解构

3.2对象解构

3.对象

4.1字面量创建对象

4.2构造函数

4.2.1自定义构造函数

4.2.2静态成员和实例成员

4.数据类型

4.1引用类型

4.1.1Object

4.1.2Array

4.1.3RegExp

4.2包装类型

4.2.1String

4.2.2Number

4.2.3Boolean

5.封装

5.1 原型对象

6.继承

5.2原型链

7.this指向

7.1普通函数

7.2严格模式

7.3箭头函数

7.3改变函数的this指向

7.3.1call

7.3.2apply

7.3.3bind

8.class关键字(类)

8.1封装

8.2继承

9.拷贝

9.1浅拷贝

9.2深拷贝


1.变量与函数

1.1作用域

作用域:规定了变量使用的范围,离开了这个范围变量就不能再被访问

分类:全局作用域和局部作用域 ===> 变量可以分为全局变量和局部变量

局部作用域:

  • 函数作用域:函数内部声明的变量,只能在函数内部被访问,外部无法直接访问
  • 块级作用域:JS中使用{ }包裹的代码称为代码块,代码块内部声明的变量外部有可能无法访问

局部变量:在局部作用域中声明的变量,只能在当前函数内部使用

  • 函数每次执行都会开辟新的内存空间,当函数执行完毕之后,就会释放这块空间,并且销毁里面的变量(局部变量)
  • 形参相当于局部变量

全局作用域:

  • 在script标签中局部作用域外的区域

全局变量:在全局作用域中声明的变量,在任何地方都能使用

📖Note:

  • 不建议定义大量的全局变量,防止造成变量污染

1.2定义变量

关键字:let,var,const 

let和var的区别:

  • let声明的变量会产生块作用域,var声明的变量不具有块级作用域
  • var可以重新定义声明的变量,let不可以
  • var声明的变量相当于window添加属性,let直接就是变量

let和var的同:

  • var和let声明的变量都可以只定义不赋值,这个变量就是undefined

const:声明的变量值不能改变,称为常量,const声明的常量必须初始化赋值,其他用法和let相同

📖Note:

  • 常量名通常大写
  • 一般固定不变的值使用const定义为常量

1.3作用域链

作用域链:底层的变量查找机制,当访问一个变量时,先在当前作用域内查找是否有这个变量的声明,没有找到则去上级作用域查找,依次查找父级作用域直到全局作用域,这个查找的过程会形成一个链状结构

📖Note:

  • 子作用域可以访问父作用域,父作用域不可以访问子作用域

1.4闭包

闭包:一种比较特殊的函数,使用闭包能够访问函数作用域中的变量,从代码形式上看闭包是一个作为返回值的函数

  • 闭包本质仍是函数,只不过是从函数内部返回
  • 闭包能够创建外部可访问的隔离作用域,避免全局变量污染,能够使变量的作用范围延伸
  • 过度使用闭包可能造成内存泄漏
  • 回调函数也能访问函数内部的局部变量

1.5预解析

预解析:在代码执行之前,先要预解析代码,预解析变量和函数

  • 变量:带有声明的变量,JS会把声明的变量提升到当前作用域的最前面,只声明不赋值
  • 函数:代表函数名的变量,JS会把带有名字的函数提升到当前作用域的最前面,只定义不调用

变量解析:

  • 变量在未声明时就被访问会报语法错误
  • 变量在声明之前就被访问,变量的值为undefined
  • 变量提升出现在相同作用域中
  • 实际开发中推荐先声明再访问变量

函数解析:

  • 函数表达式不存在提升的现象
  • 函数提升出现在相同作用域中

1.6let提升

上面代码报错原因:初始化之前不能访问n

let声明的变量存在变量提升,但是let定义的变量没有初始化之前不允许被使用

死区范围内(变量声明赋值之前的区域)不允许访问let定义的变量

1.7函数参数

函数参数

  • 声明函数时为形参赋值即为参数的默认值
  • 如果形参未定义默认值时,参数的默认值为undefined
  • 调用函数时没有传入对应参数时,参数的默认值会被当成实参传入

动态参数:

arguments:函数内部内置的伪数组变量,包含函数调用时传入的所有实参

📖Note:

  • 参数固定写形参,不固定使用arguements

剩余参数

  • 剩余值写法:...
  • ...是语法符号,置于函数最末形参前,用于获取多余的实参
  • 借助...获取剩余的实参

1.8箭头函数 

语法:

  • let fn = (形参列表) => {函数体}

调用:

  • fn(实参列表)

📖Note:

  • 如果参数只要一个,那么可以省略小括号
  • 如果函数体只有一行,可以省略大括号,大括号省略会自动返回结果

箭头函数的应用:回调函数

箭头函数使用注意点

  1. 箭头函数使基于函数表达式延伸出来的,不存在预解析,必须先定义再调用
  2. 箭头函数中,不存在arguements对象,动态参数使用剩余参数接收
  3. 箭头函数中不存在this,箭头函数中的this指向上级作用域的this

在对象的fun方法中,this本来应该指向事件源window,但是回调函数是箭头函数,箭头函数中的this指向了函数的调用者obj

2.解构赋值

解构赋值:一种快速为变量赋值的简洁语法,本质上仍是为变量赋值,

分类:数组解构,对象解构

3.1数组解构

数组解构:将数组的单元值快速批量赋值给一系列变量的简洁语法

非一一对应的情况:

1.变量多,值少

2.变量少,值多

3.按需取值

4.剩余值法

5.复杂情况

3.2对象解构

对象解构:把属性名当作变量名

命名冲突:修改属性名字

对象嵌套对象 

3.对象

对象:类中某个具体的实例,属性和方法的集合体

4.1字面量创建对象

4.2构造函数

构造函数:专门用于创建对象的函数,如果一个函数使用new关键字,那么这个函数就是构造函数

4.2.1自定义构造函数

构造函数中的this指向实例化对象

instanceof: 判断一个对象是否是另外一个构造函数的实例化对象

语法:对象 instanceof 构造函数

constructor :指回构造函数本身

4.2.2静态成员和实例成员

静态成员(静态属性/方法):把在构造函数身上直接添加的成员

  • 静态成员只能由构造函数访问

实例成员:构造函数内部为实例化对象准备的成员

  • 实例成员只能由实例化对象访问

4.数据类型

JS中主要的数据类型:字符串,数值,布尔,undefined,null,对象

字符串,数值,布尔,undefined,null称为简单类型或基础类型;对象也称为引用类型,常见的对象类型包括数组和普通对象

JS中内置了一些构造函数,用于创建对应类型的对象

数据传递:

  • 值传递:会把数据复制一份传递(简单类型)
  • 引用传递:会把数据地址复制一份传递(引用类型)

4.1引用类型

4.1.1Object

Object是内置的构造函数,用于创建普通对象

常见实例方法:

  • assign()方法:静态方法创建新的对象
  • keys()方法:静态方法获取对象的所有键 以数组形式返回
  • value()方法:获取对象中所有的属性值

4.1.2Array

Array是内置的构造函数,用于创建数组对象

数组实际上是new Array的实例化对象 

常见实例方法:

  • forEach():遍历数组,替代for循环
  • filter():过滤数组单元值,生成新数组
  • map():迭代原数组,生成新数组
  • join():数组单元素拼接成字符串
  • concat():合并两个数组,生成新数组
  • sort():对原数组单元值排序
  • splice():删除或替换原数组单元
  • indexOf():检索数组单元值
  • reverse():反转数组
  • from():伪数组转成数组

indexOf():查找某个元素在数组中首次出现的索引位置,找不到返回-1

lastindexOf():查找某个元素在数组中尾次出现的索引位置,找不到返回-1

静态方法:

 

数组的使用:

4.1.3RegExp

创建正则对象

4.2包装类型

JS中,字符串,数值,布尔具有对象的使用特征,如属性和方法

字符串,数值,布尔类型数据是JS底层使用Object构造函数‘包装’来的,被称为包装类型

4.2.1String

内置的构造函数。用于创建字符串

区别:

  • subString()自动识别索引的大小

相同:

  • 如果只有一个参数,从这个索引位置截取直到字符串结束

4.2.2Number

内置的构造函数,用于创建数字类型

4.2.3Boolean

JS中一切皆对象

引用类型和包装类型都包含两个公共的方法

  • toString:以字符串形式表示对象
  • valueOf:获取原始值,很少主动调用该方法

📖Note:

  • null和undefined除外

5.封装

构造函数

  • 构造函数体现了面向对象的封装特性
  • 构造函数实例创建的对象彼此独立,互不影响
  • 命名空间式的封装无法保证数据的独立性

5.1 原型对象

原型对象:每一个构造函数都有一个名为prototype的属性,prototype指向一个对象数据类型,称为构造函数的原型对象,每个原型对象都具有constructor属性代表该原型对象对应的构造函数

作用:共享方法,节省内存

当实例对象找不到成员时,就会在原型对象中查找成员

实例化对象可以使用原型对象中的方法

6.继承

继承是面向对象的另一个特征,通过继承可以进一步提升代码的封装程度,JS中大多是借助原型对象实现继承特性

继承之后prototype的属性constructor属性被覆盖

添加constructor属性

问题:Teacher.prototype = obj是引用传值,Teacher.prototype和Student.prototype共用同一个obj的空间,Teacher.prototype.constructor = Teacher的修改也会导致Student的原型对象中的constructor属性指向Teacher

5.2原型链

原型链:由原型对象构成的一个链状结构

作用:提供了成员查找的机制

数组是Array的实例对象,构造函数Array()也有原型对象

 

<script>
        let str = '15375635243273819198387443534234945342648'
        // 用对象保存字符及字符出现次数
        let obj = {

        }
        // 统计次数
        // 如果对象中有这个键(字符),给值加1
        // 没有,则添加键,并给值加一
        for(let i = 0; i < str.length; i++) {
            // 在obj中查找是否有str[i]属性
            // 注意:不能使用.访问 obj.str[i] 是访问obj中确实存在的属性
            // 存在str[i]属性 返回属性值 隐式类型转换为布尔值
            if(obj[str[i]]) {
                obj[str[i]]++
            } else {
                obj[str[i]] = 1
            }
        }
        // 求出现最多次数的字符
        let max = 1
        let count = obj['1']

        for(let key in obj) {
            if(count < obj[key]) {
                count = obj[key]
                max = key
            }
        }
        console.log(max, count)
    </script>

7.this指向

7.1普通函数

普通函数的调用方式决定了this的值,谁调用函数this指向谁

构造函数 :this指向实例化对象

方法:this指向调用者

事件处理函数:this指向事件源

定时器:this指向调用者

自调用函数(立即调用函数):this指向调用者

普通函数没有明确调用者时this的值为window,严格模式下没有调用者时this的值为undefined

7.2严格模式

语法:"use strict"

放在作用域的开头,才能生效

放到全局作用域的开头,代表全局都是严格模式

严格模式下:

  1. 变量必须先定义再使用
  2. 普通函数中的this指向undefined
  3. 函数的形参不能重名

7.3箭头函数

箭头函数中的this不受调用方式的影响,实际上,箭头函数中并不存在this,箭头函数中访问的this是箭头函数所在作用域的this变量

📖Note:

  • 事件处理函数中一般不使用箭头函数,this的指向不明确

7.3改变函数的this指向

7.3.1call

call方法调用函数,同时指定函数中的this值

语法:函数.call(this, arg1, arg2......)

📖Note:

  • 使用call方法调用函数时,第一个参数为this指定的值
  • call方法的其余参数会依次自动传入函数作为函数的参数

7.3.2apply

语法:函数.apply(this, [ ])

第二个参数是一个数组,是传入的参数

7.3.3bind

语法:函数.bind(this, arg1, arg2......)

bind方法不会调用函数,而是创建了一个指定了this值的新函数

8.class关键字(类)

8.1封装

class是ES6中新增的关键字,专门用于创建类,类可被用于实现逻辑的封装

constructor(构造函数,构造方法,构造器):创建类时在类的内部有一个特定的方法constructor,该方法会在类被实例化时自动被调用,常用于处理一些初始化操作

8.2继承

子类有自己的成员时,继承过程中,子类中constructor必须调用super函数

类的本质:构造函数

  • ES6之前,使用构造函数创建对象
  • ES6之后,使用关键字class创建对象

9.拷贝

9.1浅拷贝

复杂对象类型 ===> 简单数据类型

Object.assign(obj1, obj2)

浅拷贝

9.2深拷贝

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

绿联 安装phpmyadmin管理MySQL数据库

绿联 安装phpmyadmin管理MySQL数据库 1、镜像 phpmyadmin:latest 2、安装 2.1、基础设置 重启策略&#xff1a;容器退出时总是重启容器。 2.2、网络 网络选择桥接&#xff08;bridge&#xff09;。 2.3、存储空间 可增加配置文件&#xff0c;一般无需添加&#xff0c;不做…

【教学类-09-07】20240401细线迷宫图02+箭头图片(A4横版一页-2份竖版)

作品展示 作品展示 word模板 重点说明 代码展示 批量制作细线条的迷宫图(A4横板一面2张竖版)箭头图片 作者&#xff1a; 1、落难Coder https://blog.csdn.net/u014297502/article/details/124839912 2、AI对话大师 3、阿夏 作者&#xff1a;2024年4月3日 numint(input(几人&…

《数据结构学习笔记---第九篇》---循环队列的实现

文章目录 1.循环队列的定义 2.循环队列的判空判满 3.创建队列并初始化 4.入队和出队 5. 返回队尾队首元素 6.释放循环队列 1.循环队列的定义 定义&#xff1a;存储队列元素的表从逻辑上被视为一个环。 我们此次实现的循环队列&#xff0c;采用顺序表 typedef struct {int…

OpenCv —— cv::VideoCapture设置摄像头图像格式为“MJPEG“

背景 今天恰巧同事有台USB摄像头,她想要在Windows系统下通过OpenCV读取该摄像头宽高为1080x768、帧率为60的视频,用来做图像算法处理。但无奈通过网上OpenCV教程 读取的视频对应尺寸的帧率仅为10帧左右,根本无法满足使用要求。于是作者通过本篇文章介绍如何解决,欢迎交流指…

Word的”交叉引用“和”插入题注“快捷键设置

Word的”交叉引用“和”插入题注“快捷键设置 在MSWord2021中&#xff0c;可以自定义设置快捷键。方法如下&#xff1a;文件-选项-自定义功能区-键盘快捷方式&#xff08;自定义&#xff09;。具体过程如图所示。 最后&#xff0c;按照上述流程将插入题注&#xff08;Insert…

Somme Requiem 全AI制作的电影短片

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Linux基础概念

Linux Linux 和 UNIX 中的文件系统是一个以 / 为根的树状式文件结构&#xff0c;/ 是 Linux 和 UNIX 中的根目录&#xff0c;同样它也是文件系统的起点。所有的文件和目录都位于 / 路径下&#xff0c;包括经常听到的 /usr、/etc、/bin、/home 等。在早期的 UNIX 系统中&#x…

格式化输出数据

JDK 5 新特性&#xff0c;格式化输出数据 长度不够前面补空格&#xff0c;超出长度按实际输出 System.out.printf(“格式控制部分”,表达式1,表达式2,,表达式n); 格式控制部分由格式符号、普通字符组成&#xff0c;普通字符原样输出&#xff0c;格式符号输出表达式的值 // …

03 | Swoole 源码分析之 Http Server 模块

首发原文链接&#xff1a;Swoole 源码分析之 Http Server 模块 大家好&#xff0c;我是码农先森。 Http 模块的注册初始化 这次我们分析的就是 Swoole 官网的这段代码&#xff0c;看似简单&#xff0c;实则不简单。 在 Swoole 源码文件 swoole_http_server.c 中有这样一个函数…

银行监管报送系统介绍(十五):金融审计平台

《“十四五”国家审计工作发展规划》中重点强调&#xff0c;金融审计&#xff1a;以防范化解重大风险、促进金融服务实体经济&#xff0c;推动深化金融供给侧结构性改革、建立安全高效的现代金融体系为目标&#xff0c;加强对金融监管部门、金融机构和金融市场运行的审计。 —…

用于自动驾驶,无人驾驶领域的IMU六轴陀螺仪传感器:M-G370

用于自动驾驶,无人驾驶的IMU惯导模块六轴陀螺仪传感器:M-G370。自2020年&#xff0c;自动驾驶,无人驾驶已经迎来新突破&#xff0c;自动驾驶汽车作为道路交通体系的一员&#xff0c;要能做到的就是先判断周边是否有障碍物&#xff0c;自身的行驶是否会对其他交通参与成员产生危…

烂笔头笔记:Windows 11下照片查看器显示偏色问题修复

本文出处&#xff1a;http://blog.csdn.net/chaijunkun/article/details/137278931&#xff0c;转载请注明。由于本人不定期会整理相关博文&#xff0c;会对相应内容作出完善。因此强烈建议在原始出处查看此文。 最近在研究HDR视频的截图算法&#xff0c;目的就是生成色彩正确…

rpc的通信流程

rpc能实现调用远程方法就跟调用本地&#xff08;同一个项目中的方法&#xff09;一样&#xff0c;发起调用请求的那一方叫做服务调用方&#xff0c;被调用的一方叫做服务提供方。 接下来就和大家分享一下调用过程的流程和细节。 传输协议 既然是远程调用那肯定就需要通过网络…

Matlab|计及需求侧响应日前—日内两阶段鲁棒备用优化

目录 1 主要内容 日前计划模型 日内调整模型 不确定集建模 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序复现文章《计及需求侧响应日前—日内两阶段鲁棒备用优化》&#xff0c;以6节点系统为例&#xff0c;综合考虑风电出力不确定性与电力设备 N-k强迫停运&…

App应用的服务器如何增加高并发能力

大家好&#xff01;我是你们的好朋友咕噜铁蛋&#xff01;近年来&#xff0c;随着移动互联网的蓬勃发展&#xff0c;各类App应用如雨后春笋般涌现&#xff0c;用户量呈现爆发式增长。然而&#xff0c;随之而来的高并发访问问题也开始频繁出现&#xff0c;给服务器带来了极大的挑…

Codeforces Round 928 (Div. 4)F. Vlad and Avoiding X 二维转一维成为线性,然后dfs就可以线性暴力

当所有的都是Black时&#xff0c;只需要8个点就可以不出现“X”型。 ——题解 Problem - F - Codeforces 思路&#xff1a; 如标题。此题还是值得思考练习下暴力写法的。 **为什么上图有的被粉色标记了呢&#xff0c;因为白色和粉色之间互不干扰。** 所以题解把两种…

Movavi Video Converter 2022 for Mac/Win:卓越的视频音频文件转换器

在数字化时代&#xff0c;视频和音频文件已成为我们日常生活和工作中不可或缺的一部分。无论是制作精美的家庭影片&#xff0c;还是编辑专业的商业视频&#xff0c;一款高效、便捷的视频音频文件转换器无疑是您的得力助手。而Movavi Video Converter 2022&#xff0c;就是这样一…

【HTML】标签学习(下.2)

&#xff08;大家好哇&#xff0c;今天我们将继续来学习HTML&#xff08;下.2&#xff09;的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 二.列表标签 2.1 无序列表(重点) 2.2有序列表(理解) 2.3 自定义列表(重点…

事件队列事件循环(EventLoop) 宏任务 微任务详解 面试题

事件队列 事件循环 EventLoop 宏任务 微任务详解 一、概念二、宏任务&#xff08;多个&#xff09;、微任务&#xff08;1个&#xff09;三、Promise 的构造函数四、process.nextTick在事件循环中的处理五、vue nextTick原理 一、概念 event: 事件 loop: 循环&#xff0c;循环…

【25考研】:四川大学计算机学院24届874考研考情分析

去年的考情分析也是我做的&#xff0c; 今年就在去年的基础上做了。保持形式不变&#xff0c;更改数据。 21考情&#xff1a; 万载月寒肠断客&#xff1a;四川大学计算机学院21届CS考研考情分析 22考情&#xff1a; 懒羊羊&#xff1a;四川大学计算机学院2022考研考情分析 2…