1.变量声明

        首先js变量声明有三种,var,const,let,这三种变量声明中我们第一优先使用const,需要改变这个值的时候我们用ley,var是尽量不去使用。

        那么我们现在来总结一下三种声明变量的区别。首先是var let 都是定义变量。

        

 {var a = 20}console.log(a);

       首先是var声明变量这里我们输出控制台看到了20。因为我们var没有块级作用域,使用var定义的变量会直接作为全局变量。

        

 {let b =20}console.log(b);

        这里的输出结果是会报错, b是局部变量,只能在{}中使用。也就是说let声明的变量有块级作用域,而var没有。那么作用域有什么用呢?

        

   for (var i = 0; i < 5; i++) {console.log('循环内部', i);//能访问到i}console.log('循环内部', i);

       这里还是拿到了i 因为var让i变成了全局变量,这很明显不符合常理,因为我们循环体中我们仅仅希望i去控制循环,并不希望去设置一个全局变量i。

        

  for (let i = 0; i < 5; i++) {console.log('循环内部', i);//能访问到i}console.log('循环内部', i);

        使用let就只能在作用域里面访问到i,在全局是访问不到的。

        我们在去尝试下面的代码。

        

  if (true) {var b = 33}console.log(b);

      控制台输出了33,很正常因为全局变量b=33.我们改一下。

        

  if (true) {let b = 33}console.log(b);

       这里我们就无法访问到b,因为只在{}这个块级作用域里面才能访问到b,我们在来看一种情况。

        

  if (false) {/ var b = 33}console.log(b);

       这里没有报错,甚至输出的是undefined,这里是因为var会引发 变量提升,就是当我们用var去声明一个变量的时候,浏览器在解析代码的时候,会优先把var声明的变量在一开始就var声明,所以尽管没有赋值成功,也会默认声明,这显然非常不符合逻辑。所以我们开发时不去使用var。

        

const obj = {name: '随你'}
obj.age = 18
obj.name = "www"console.log(obj.name);console.log('obj.age', obj.age)

        这里我们用const去定义一个obj对象,我们不可以直接去更改obj对象,// obj = { name: '猴子石' }不可以这样直接对obj进行赋值,但是我们可以改变对象的内容,去添加新的对象或者覆盖掉已经有的属性。

        总结1.var 没有块级作用域2.let 有块级作用域3.const 和let类似 具有块级作用域,但是只能赋值一次4.const 使用场景 1.对一些常量可以使用const 一般大写字母 const PI = 3.15

        5.对一些对象函数也可以使用const 可以避免对象和函数被意外修改 可以让obj永远指向后面的对象。

2.解构赋值

        我们从数组里面获取里面的元素的时候,我们最开始是用变量赋值的方式。

        let a, blet arr = ['w', 'n']a = arr[0]b = arr[1]console.log(a, b);

        好像很简单的逻辑就很麻烦写起来。我们可以用解构赋值的语法去获取。

         let a, blet arr = ['w', 'n'][a, b] = arr //解构赋值console.log(a, b);

        这样就非常简便,我们甚至可以在解构赋值的时候去声明变量。

const [a, b] = arr

        这就是数组的解构赋值,但是如果有很多数组,我们希望去用数组解构的时候,就需要一一对应,或者用...b这种去让b去接住后面所有的数组元素。

  const wrr = ['wwwww', '傻孩子', 'bailong', 'aaaa', 'ppp']// const [a, b, , c] = wrr// console.log(a, b, c);//多个解构就是一一对应,多余的就不显示想跳过一个就,就可以// const [a, b, ...c] = wrr// console.log(a, b, c);//也可以直接...c(数组)去拿取后面所有的元素 而且这里的...c会接所有元素所以只能放最后

    这就是数组的解构赋值现在我们来看对象的解构。

        

const obj = {name: 'wwww',age: 12,gender: '难'}let a, b, c;({ name: a, age: b, gender: c } = obj) //这里用括号因为不()直接等号左边{}不合理//要注意的是被赋值的变量在右边,对象的属性在左边 比如第一个将name赋值被aconsole.log(a, b, c);//通常我们把变量名和对象的属性名一致// const { name: name, gender: gender, age: age } = obj// console.log(name, gender, age);//然后对象可以简写因为左右一致,const { name, age, gender } = objconsole.log(name, age, gender);// 解构赋值还可以交换数组中变量的位置arr = [1, 2, 3]console.log(arr);[arr[1], arr[2]] = [arr[2], arr[1]]console.log(arr);// 这里把下标1,2换了位置

 和数组的解构赋值思路一样,只不过对象需要用{}包裹,然后赋值的时候,左边是我们对象里面的属性,右边是我们想要进行赋值的变量!!!,然后我们可以简写(往往解构的时候变量名和对象的属性名一致),就可以直接。

        

这样去解构赋值,也可以用解构赋值来换取位置,方法如图。

3.展开

        

function fn(a, b, c) {return (a + b + c)}const arr = [1, 2, 3]//计算三个数字的和// let result = fn(arr[0], arr[1], arr[2])let result = fn(...arr)//...展开数组 ...可以展开数组console.log(result);const arr2 = [7, 8, ...arr, 4, 5, 6]//将arr浅复制给arr2console.log(arr2);//数组可以展开对象也可以const obj = {name: 'www',age: 12,gender: 'nan'}const obj2 = { gogog: 'www', ...obj, address: 'wopa', name: 'zzzz' } //把obj在新对象中展开相当于浅复制//对象是无序的如果重复了后来的覆盖前面的console.log(obj2);

         首先我们在前面的数组结构用到了...a去表示一个数组变量,那么我们就可以用...arr去表示一个数组展开后的内容,也就是...展开数组。我们可以用...arr去传参,相当于传过去展开的数组,对象也可以这样,相当于展开了对象。然后我们这里用...obj去给obj2这个对象赋值,展开之后,这里name重复后来的会覆盖掉前面的。

4.箭头函数

        

const fn = function () {return 'hello'}const fn2 = a => aconsole.log(fn2(123));箭头函数只有一个参数的函数,参数等于返回值如果没有参数或者多个参数用()括起来()=>返回值 (a,b,c)=>{}const sum = (a, b, c) => a + b + cconst sum = (a, b, c) => ({ name: 'sun' })let result = sum(1, 2, 3)console.log(result);箭头后面的叫做返回值  返回值必须是表达式?表达式(有返回值的语句)如果返回的是对象需要加()如果需要在箭头函数定义逻辑,在箭头后跟一个代码块代码块语法和普通函数一致const fn4 = (a, b) => {if (a === 10) {a += 5} else if (a === 20) {a += 10}return a + b}console.log('fn4', fn4(1, 2))

         箭头函数是我们定义函数的另一种简写方式,当只有一个参数的时候,而且返回值等于参数的时候可以这样去书写,但是如果有多个参数的话,我们就需要给参数加一个()而且返回值必须是表达式,也就是必须要有值作为返回值,如果我们希望通过一个逻辑去返回值的话,我们就在箭头后面跟一个代码块。这就是箭头函数的使用方法。

5.箭头函数和普通函数的区别

        

        //箭头函数是传统函数表达式的简写方式,但是也有一些限制导致一些场景无法使用//没有自己的this//没有arguments//不能作为构造函数调用//无法通过call apply bind指定函数的thisfunction fn(a, b, ...args) {//用来保存函数实参arguments 类数组不能用操作数组的方法// console.log(arguments.length);//输出的2// console.log(...arguments);//输出的1,2console.log(...args);//用...args代替arguments更好用是真正的数组}fn(1, 2, 3, 4, 5)const fn2 = (...argus) => {// console.log(arguments);//报错argument is undefinedconsole.log(...argus);}fn2(1, 2, 3)//箭头函数没有arguments(类数组)但是也可以用...argus去保存实参//箭头函数没有自己的thisconst fn3 = () => {console.log(this);//这里的this是window}fn3()//函数中的this是指向外层作用域(运行环境中的this)。这里fn3的作用域是全局 所以说windowconst obj = {fn4: () => {console.log(this);}}obj.fn4()//这里仍然是window因为箭头函数没有自己的this,它的this总是外层作用域的thisconst obj2 = {ss: function () {console.log(this);}}obj2.ss()//这里的this指向的就是obj2因为普通函数调用时看“谁点的它”(谁调用)谁调用就指向谁const obj3 = {ss: function () {const test = () => {console.log(this);}test()}}obj3.ss()//这里指向的是obj3,因为这个this就是外层作用域也就是普通函数的this,普通函数的this指向obj3所以这里指向obj3

        首先箭头函数虽然是传统函数的简写方式,但是也是有一些场景无法使用的,比如没有自己的this没有argument保存实参,也不能作为构造函数调用,因为不能用this,也无法通过call,bind方法去指定this。如图fn4箭头函数中的this是外层作用域也就是obj的this,而obj是在全局中定义的,所有this指向的window。而ss这个普通函数obj2.ss输出的this指向的obj2因为普通函数的this是说调用指向谁。

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

防 XSS和CSRF 过滤器(Filter)

会话管理存在问题&#xff1a; 1.服务集群部署或者是分布式服务如何实现会话共享 2.会话的不同存储地方的安全性问题 答&#xff1a; 会话共享 可以使用后端集中管理(redis)或者客户端管理 &#xff08;jwt&#xff09;&#xff1b; 存储安全性 这个还真的没有太好的方式&…

鸿蒙容器组件 WaterFlow、FlowItem解析:动态瀑布流布局实践

一、引言&#xff1a;不规则布局的智能化解决方案 在图片社交、电商导购、资讯聚合等现代应用场景中&#xff0c;瀑布流布局以其灵活的空间利用率和自然的视觉流动感成为界面设计的重要选择。鸿蒙提供的 WaterFlow 与 FlowItem 组件&#xff0c;通过智能布局算法与声明式语法&…

概率密度基本概念

概率密度&#xff08;Probability Density&#xff09;是概率论中用于描述随机变量分布的一种方式&#xff0c;特别适用于连续随机变量。它并不是一个概率值&#xff0c;而是表示单位范围内的概率大小或“浓度”。更具体地说&#xff0c;概率密度表示在某个特定值附近&#xff…

10-1 MySQL 索引优化与查询优化

10-1 MySQL 索引优化与查询优化 文章目录 10-1 MySQL 索引优化与查询优化1. 数据准备2. 索引失效案例2.1 索引字段&#xff1a;全值匹配最优2.2 索引字段&#xff1a;最佳左前缀法则2.3 主键插入顺序2.4 索引字段进行了&#xff1a;计算、函数、类型转换(自动或手动)导致索引失…

基于目标驱动的分布式敏捷开发

研究结论 风险对项目目标的影响 时间目标&#xff1a;需求管理不当&#xff08;如需求优先级不明确、多产品负责人需求冲突&#xff09;、架构变更导致的返工、跨站点协调问题&#xff08;如第三方依赖、通信基础设施不足&#xff09;是影响项目时间的主要风险因素。质量目标&…

高通手机跑AI系列之——穿衣试装算法

环境准备 手机 测试手机型号&#xff1a;Redmi K60 Pro 处理器&#xff1a;第二代骁龙8移动--8gen2 运行内存&#xff1a;8.0GB &#xff0c;LPDDR5X-8400&#xff0c;67.0 GB/s 摄像头&#xff1a;前置16MP后置50MP8MP2MP AI算力&#xff1a;NPU 48Tops INT8 &&…

opencv入门(5)图像像素的读写操作和算术运算

文章目录 1 图像遍历与修改1.1 使用数组1.2 使用指针 2 图像的算术运算2.1 一般算术操作2.2 算术API 1 图像遍历与修改 C中支持 数组遍历 和 指针方式遍历 1.1 使用数组 访问使用 image.at(row,col) 进行访问 如果是单通道灰度图&#xff0c;就使用image.at进行读取 如果是三…

Stable Diffusion入门-ControlNet 深入理解-第三课:结构类模型大揭秘——深度、分割与法线贴图

大家好,欢迎回到Stable Diffusion入门-ControlNet 深入理解系列的第三课! 在上一课中,我们深入探讨了 ControlNet 文件的命名规则,以及线条类 ControlNet模型的控制方法。如果你还没有看过第二篇,赶紧点这里补课:Stable Diffusion入门-ControlNet 深入理解 第二课:Contr…

喷油嘴深凹槽内轮廓测量的方法探究 —— 激光频率梳 3D 轮廓测量

引言 喷油嘴作为燃油喷射系统核心部件&#xff0c;其深凹槽内轮廓精度直接影响燃油雾化效果与发动机排放性能。喷油嘴深凹槽具有深径比大&#xff08;可达 30:1&#xff09;、孔径小&#xff08;φ0.5 - 2mm&#xff09;、表面质量要求高&#xff08;Ra≤0.2μm&#xff09;等…

上证ETF50期权交易规则一文详解

50ETF期权&#xff0c;首先这是期权交易&#xff0c;所以50ETF期权有期权交易的所有特征&#xff0c;其次&#xff0c;50ETF期权的标的对象是上证50&#xff0c;所以50ETF&#xff08;认购看涨&#xff09;期权的走势和上证50的走势是一样的。 行权时间&#xff1a; 在行权日当…

Oracle获取执行计划之10046 技术详解

Oracle 的 10046 事件是性能调优中最常用的工具之一&#xff0c;通过跟踪会话的 SQL 执行细节&#xff0c;生成包含执行计划、等待事件、绑定变量等信息的跟踪文件&#xff0c;帮助定位性能瓶颈。以下是技术详解&#xff1a; 一、10046 事件基础 10046 是 Oracle 内部事件&…

Linux 日志监控工具对比:从 syslog 到 ELK 实战指南

更多云服务器知识&#xff0c;尽在hostol.com 你有没有被 Linux 上满屏飞滚的日志整崩溃过&#xff1f;看着 /var/log 目录越来越肥&#xff0c;关键日志像大海捞针一样藏在里面&#xff0c;每次出故障就像拆盲盒&#xff0c;赌你能不能第一眼看出问题。 日志系统&#xff0c…

本地服务器部署后外网怎么访问不了?内网地址映射互联网上无法连接问题的排查

我的网站部署搭建在本地服务器上的&#xff0c;在内网可以正常访问&#xff0c;但是外网无法访问&#xff0c;该怎么排查&#xff1f;局域网内部经过路由器的&#xff0c;有设置了虚拟服务器转发规则&#xff0c;在互联网公网上还是无法访问服务器怎么办&#xff1f;相信很多人…

如何免费正确安装微软的office全家桶

记录一下如何正确安装微软的office全家桶 找到安装包傻瓜式安装 找到安装包 安装包在附件&#xff0c;大家可以自行进行下载 傻瓜式安装 操作一目了然&#xff0c;点你需要的就行了

论文阅读:BLIPv1 2022.2

文章目录 一、研究背景与问题现有方法的局限性研究目标 二、核心方法与创新点多模态编码器 - 解码器混合架构&#xff08;MED&#xff09;标题生成与过滤&#xff08;CapFilt&#xff09;数据自举方法 三、实验与结果数据集与训练配置关键实验发现与 state-of-the-art 方法的对…

630,百度文心大模型4.5系列开源!真香

2025年被普遍认为是AI Agent商业化的关键之年&#xff0c;而大模型正是Agent能力的核心支撑。 当开发成本大幅降低&#xff0c;我们很可能看到各种垂直领域的Agent应用如雨后春笋般涌现。 技术普惠的现实意义对于广大AI创业者和开发者来说&#xff0c;这无疑是个好消息。 之…

数据结构:递归:斐波那契数列(Fibonacci Sequence)

目录 什么是斐波那契数列&#xff1f; 用递归推导Fibonacci 复杂度分析 用迭代推导Fibonacci 复杂度分析 递归优化&#xff1a;记忆化递归&#xff08;Memoized Recursion&#xff09; 复杂度分析 什么是斐波那契数列&#xff1f; 斐波那契数列&#xff08;Fibonacci Seq…

ArcGIS Pro利用擦除工具,矢量要素消除另一矢量部分区域

选择“System Toolboxes”→“Analysis Tools.tbx”→“Overlay”→“Erase&#xff08;擦除&#xff09;”。 原始 擦除后

Linux: network: 性能 pause

最近看到一个问题,是关于网卡的throughput的性能问题,后来在ethtool-S里看到有pause的counter,这个也是网络性能问题的一个分析方向。算是学到了新的知识点。 $ grep -i -e 2025- -e pause ethtool*ens2f1np1 | grep -v -e ": 0\$" | headtail 4====

目标检测系列(五)已标注数据集(yolo格式)导入labelstudio继续标注

目录 1、labelstudio安装 2、yolo(txt)转json 3、COCO转yolo(仅针对coco格式标注信息) 4、设置环境变量并启动labelstudio 5、进入label studio创建工程并设置任务标签 6、安装http-server并启动文件映射服务 7、进入label studio导入json文件即可 1、labelstudio安装 …