当前位置: 首页 > news >正文

ecmascript 标准+ 严格模式与常规模式 + flat-flatMap 应用

文章目录

    • ecmascript 历程
    • 严格模式与常规模式下的区别及注意事项
    • 严格模式下的属性删除
    • Array.prototype.flat()和Array.prototype.flatMap() 实例应用

ecmascript 历程

  1. 变量声明要求

    • 常规模式
      • 在常规模式下,使用var关键字声明变量时会出现变量提升现象。这意味着变量可以在声明之前使用,并且会被自动提升到函数作用域的顶部。例如:
      function test() {console.log(x); var x = 10;
      }
      test(); 
      
      • 上述代码在常规模式下,console.log(x)不会报错,而是输出undefined。因为JavaScript引擎会将var x提升到函数顶部,代码实际上被解释为:
      function test() {var x;console.log(x); x = 10;
      }
      test(); 
      
    • 严格模式
      • 在严格模式下('use strict'),不允许使用未声明的变量。如果这样做,会直接抛出引用错误。例如:
      "use strict";
      function test() {console.log(x); var x = 10;
      }
      test(); 
      
      • 这段代码在严格模式下会抛出ReferenceError: x is not defined错误。严格模式强制要求变量先声明后使用,这样可以避免因变量未声明而导致的潜在错误,使得代码更加健壮。
  2. 函数参数重复命名

    • 常规模式
      • 在常规模式下,函数参数可以有重复的名称,后面的参数会覆盖前面同名的参数。例如:
      function add(a, a) {return a + a;
      }
      console.log(add(2, 3)); 
      
      • 上述代码在常规模式下会输出6,因为第二个a(值为3)覆盖了第一个a(值为2)。
    • 严格模式
      • 在严格模式下,不允许函数参数有重复的名称。如果出现这种情况,会抛出语法错误。例如:
      "use strict";
      function add(a, a) {return a + a;
      }
      console.log(add(2, 3)); 
      
      • 这段代码在严格模式下会抛出SyntaxError: Duplicate parameter name not allowed in this context错误。
  3. 对象属性操作

    • 常规模式
      • 在常规模式下,可以通过delete操作符删除不可配置的属性,虽然在严格模式下会返回false,但在常规模式下不会报错。例如:
      var obj = {};
      Object.defineProperty(obj, 'prop', {value: 10, configurable: false});
      console.log(delete obj.prop); 
      
      • 上述代码在常规模式下会输出false,但不会抛出错误。
    • 严格模式
      • 在严格模式下,试图删除不可配置的属性会抛出类型错误。例如:
      "use strict";
      var obj = {};
      Object.defineProperty(obj, 'prop', {value: 10, configurable: false});
      console.log(delete obj.prop); 
      
      • 这段代码在严格模式下会抛出TypeError: Cannot delete property 'prop' of #<Object>错误。
  4. 函数的this指向

    • 常规模式
      • 在常规模式下,函数中的this指向可能会出现一些不符合预期的情况。例如,在全局函数中,this通常指向全局对象(在浏览器环境中是window)。
      function test() {console.log(this);
      }
      test(); 
      
      • 在浏览器环境下,上述代码会输出window对象。并且在一些事件处理函数中,如果没有正确绑定this,它的指向也可能会出现问题。
    • 严格模式
      • 在严格模式下,函数中的this不会自动指向全局对象。如果this没有被明确的对象调用,它的值为undefined。例如:
      "use strict";
      function test() {console.log(this);
      }
      test(); 
      
      • 这段代码在严格模式下会输出undefined,这使得函数内部this的行为更加可预测,避免了一些由于this指向混乱而导致的错误。
  5. 应用注意点

    • 谨慎转换现有代码:如果要将现有的JavaScript代码转换为严格模式,需要仔细检查代码中是否存在不符合严格模式要求的部分,如未声明的变量、重复的函数参数等,否则可能会导致大量错误。
    • 模块和库使用:在开发模块和库时,严格模式可以帮助确保代码的质量和稳定性。因为模块和库通常会被多个项目使用,严格模式下的严格检查可以减少潜在的错误。
    • 团队协作和代码维护:在团队开发环境中,提倡使用严格模式可以使代码风格更加统一,便于团队成员理解和维护代码。因为严格模式的规则更加明确,减少了一些JavaScript中可能出现的模糊和易错的情况。

严格模式与常规模式下的区别及注意事项

  1. 变量声明要求

    • 常规模式
      • 在常规模式下,使用var关键字声明变量时会出现变量提升现象。这意味着变量可以在声明之前使用,并且会被自动提升到函数作用域的顶部。例如:
      function test() {console.log(x); var x = 10;
      }
      test(); 
      
      • 上述代码在常规模式下,console.log(x)不会报错,而是输出undefined。因为JavaScript引擎会将var x提升到函数顶部,代码实际上被解释为:
      function test() {var x;console.log(x); x = 10;
      }
      test(); 
      
    • 严格模式
      • 在严格模式下('use strict'),不允许使用未声明的变量。如果这样做,会直接抛出引用错误。例如:
      "use strict";
      function test() {console.log(x); var x = 10;
      }
      test(); 
      
      • 这段代码在严格模式下会抛出ReferenceError: x is not defined错误。严格模式强制要求变量先声明后使用,这样可以避免因变量未声明而导致的潜在错误,使得代码更加健壮。
  2. 函数参数重复命名

    • 常规模式
      • 在常规模式下,函数参数可以有重复的名称,后面的参数会覆盖前面同名的参数。例如:
      function add(a, a) {return a + a;
      }
      console.log(add(2, 3)); 
      
      • 上述代码在常规模式下会输出6,因为第二个a(值为3)覆盖了第一个a(值为2)。
    • 严格模式
      • 在严格模式下,不允许函数参数有重复的名称。如果出现这种情况,会抛出语法错误。例如:
      "use strict";
      function add(a, a) {return a + a;
      }
      console.log(add(2, 3)); 
      
      • 这段代码在严格模式下会抛出SyntaxError: Duplicate parameter name not allowed in this context错误。
  3. 对象属性操作

    • 常规模式
      • 在常规模式下,可以通过delete操作符删除不可配置的属性,虽然在严格模式下会返回false,但在常规模式下不会报错。例如:
      var obj = {};
      Object.defineProperty(obj, 'prop', {value: 10, configurable: false});
      console.log(delete obj.prop); 
      
      • 上述代码在常规模式下会输出false,但不会抛出错误。
    • 严格模式
      • 在严格模式下,试图删除不可配置的属性会抛出类型错误。例如:
      "use strict";
      var obj = {};
      Object.defineProperty(obj, 'prop', {value: 10, configurable: false});
      console.log(delete obj.prop); 
      
      • 这段代码在严格模式下会抛出TypeError: Cannot delete property 'prop' of #<Object>错误。
  4. 函数的this指向

    • 常规模式
      • 在常规模式下,函数中的this指向可能会出现一些不符合预期的情况。例如,在全局函数中,this通常指向全局对象(在浏览器环境中是window)。
      function test() {console.log(this);
      }
      test(); 
      
      • 在浏览器环境下,上述代码会输出window对象。并且在一些事件处理函数中,如果没有正确绑定this,它的指向也可能会出现问题。
    • 严格模式
      • 在严格模式下,函数中的this不会自动指向全局对象。如果this没有被明确的对象调用,它的值为undefined。例如:
      "use strict";
      function test() {console.log(this);
      }
      test(); 
      
      • 这段代码在严格模式下会输出undefined,这使得函数内部this的行为更加可预测,避免了一些由于this指向混乱而导致的错误。
  5. 应用注意点

    • 谨慎转换现有代码:如果要将现有的JavaScript代码转换为严格模式,需要仔细检查代码中是否存在不符合严格模式要求的部分,如未声明的变量、重复的函数参数等,否则可能会导致大量错误。
    • 模块和库使用:在开发模块和库时,严格模式可以帮助确保代码的质量和稳定性。因为模块和库通常会被多个项目使用,严格模式下的严格检查可以减少潜在的错误。
    • 团队协作和代码维护:在团队开发环境中,提倡使用严格模式可以使代码风格更加统一,便于团队成员理解和维护代码。因为严格模式的规则更加明确,减少了一些JavaScript中可能出现的模糊和易错的情况。

严格模式下的属性删除

  1. 可配置属性的删除
    • 在严格模式下,如果对象的属性是可配置的(configurabletrue),可以使用delete操作符正常删除属性。
    • 例如,创建一个对象并定义一个可配置属性:
    "use strict";
    let obj = {};
    Object.defineProperty(obj, 'prop', {value: 10,configurable: true
    });
    console.log(delete obj.prop); // 输出 true
    console.log(obj.prop); // 输出 undefined,因为属性已被删除
    
  2. 不可配置属性的处理
    • 如果属性是不可配置的(configurablefalse),在严格模式下不能直接使用delete操作符删除,否则会抛出TypeError
    • 例如:
    "use strict";
    let obj = {};
    Object.defineProperty(obj, 'prop', {value: 10,configurable: false
    });
    try {console.log(delete obj.prop); 
    } catch (error) {console.log(error); // 输出 TypeError: Cannot delete property 'prop' of #<Object>
    }
    
    • 若要删除不可配置的属性,需要先将其configurable属性修改为true。这可以通过Object.defineProperty或者Object.defineProperties方法来实现。
    • 以下是一个修改configurable属性后再删除的示例:
    "use strict";
    let obj = {};
    Object.defineProperty(obj, 'prop', {value: 10,configurable: false
    });
    // 先将configurable修改为true
    Object.defineProperty(obj, 'prop', {configurable: true
    });
    console.log(delete obj.prop); // 输出 true
    console.log(obj.prop); // 输出 undefined
    

Array.prototype.flat()和Array.prototype.flatMap() 实例应用

  1. Array.prototype.flat()实例应用

    • 基本功能flat()方法用于将嵌套的数组“扁平化”,即将多维数组转换为一维数组。默认情况下,它会将嵌套一层的数组扁平化,但可以通过传入一个深度参数来指定扁平化的深度。
    • 示例一:扁平化一层嵌套数组
      • 假设有一个二维数组,代表学生的成绩,每个学生有多门课程的成绩。
      let studentScores = [[80, 90], [70, 85], [90, 95]];
      let flattenedScores = studentScores.flat();
      console.log(flattenedScores); 
      
      • 输出结果为[80, 90, 70, 85, 90, 95],将原来的二维数组扁平化成为一个包含所有学生成绩的一维数组。
    • 示例二:扁平化多层嵌套数组
      • 考虑一个更复杂的情况,有一个多层嵌套的数组。
      let multiLevelArray = [[1, 2], [3, [4, 5]]];
      let flattenedDeeply = multiLevelArray.flat(2);
      console.log(flattenedDeeply); 
      
      • 这里传入深度参数2,因为数组最多嵌套了两层。输出结果为[1, 2, 3, 4, 5],成功将多层嵌套的数组扁平化。
    • 示例三:处理空数组元素
      • flat()方法在扁平化过程中会忽略空数组元素。
      let arrayWithEmpty = [[1, 2], [], [3, 4]];
      let flattenedWithEmpty = arrayWithEmpty.flat();
      console.log(flattenedWithEmpty); 
      
      • 输出结果为[1, 2, 3, 4],空数组元素在扁平化后被移除。
  2. Array.prototype.flatMap()实例应用

    • 基本功能flatMap()方法首先对数组中的每个元素应用一个映射函数,然后将结果扁平化。它相当于先执行map()操作,再执行flat()操作,但在性能上可能更优,因为它只需要遍历一次数组。
    • 示例一:处理字符串数组
      • 假设有一个字符串数组,想要将每个字符串拆分成字符数组,然后扁平化得到一个包含所有字符的数组。
      let stringArray = ["abc", "def"];
      let flattenedChars = stringArray.flatMap(str => str.split(''));
      console.log(flattenedChars); 
      
      • 首先,map部分对每个字符串应用split('')函数,将每个字符串拆分成字符数组,如["abc"]变成["a", "b", "c"]。然后flat部分将这些字符数组扁平化,最终输出结果为["a", "b", "c", "d", "e", "f"]
    • 示例二:处理对象数组中的属性数组
      • 假设你有一个包含用户对象的数组,每个用户对象有一个属性数组,表示用户的兴趣爱好。你想要获取所有用户的所有兴趣爱好。
      let users = [{name: "Alice", hobbies: ["reading", "painting"]},{name: "Bob", hobbies: ["sports", "music"]}
      ];
      let allHobbies = users.flatMap(user => user.hobbies);
      console.log(allHobbies); 
      
      • 对于每个用户对象,flatMap首先通过user.hobbies获取兴趣爱好数组(这是map操作),然后将所有这些兴趣爱好数组扁平化,最终输出结果为["reading", "painting", "sports", "music"]

相关文章:

ecmascript 标准+ 严格模式与常规模式 + flat-flatMap 应用

文章目录 ecmascript 历程严格模式与常规模式下的区别及注意事项严格模式下的属性删除Array.prototype.flat()和Array.prototype.flatMap() 实例应用 ecmascript 历程 变量声明要求 常规模式&#xff1a; 在常规模式下&#xff0c;使用var关键字声明变量时会出现变量提升现象。…...

基于ILI9341液晶屏+STM32U5单片的显示试验

试验要求&#xff1a; 1、通过串口&#xff0c;下发两个命令 STR和PIC&#xff1b; 2、STR模式&#xff1a; &#xff08;1&#xff09;串口输入什么&#xff0c;屏幕上显示什么 &#xff08;2&#xff09;如果屏幕满&#xff0c;自动下滚 &#xff08;3&#xff09;输入回车&a…...

最短路径算法

关注&#xff1a;算法思路&#xff0c;时间复杂度&#xff0c;适用情况&#xff08;单源/多源&#xff0c;负边权/负边权回路&#xff09; 复习弗雷德算法--基于动态规划--多源--负边权--时间复杂度O(v^3) int的最大值是0x7fffffff #include <iostream> using namesp…...

如何用 ESP32-CAM 做一个实时视频流服务器

文章目录 ESP32-CAM 概述ESP32-S 处理器内存Camera 模块MicroSD 卡槽天线板载 LED 和闪光灯其他数据手册和原理图ESP32-CAM 功耗 ESP32-CAM 引脚参考引脚排列GPIO 引脚哪些 GPIO 可以安全使用&#xff1f;GPIO 0 引脚MicroSD 卡引脚 ESP32-CAM 的烧录方式使用 ESP32-CAM-MB 编程…...

Centos7 解决Maven scope=system依赖jar包没有打包到启动jar包中的问题(OpenCV-4.10)

最近项目中遇到问题,OpenCV的Jar包在程序打包后,找不到相关的类,比如MAT,这个时候怀疑OpenCV_4.10的Jar没有和应用程序一起打包,后面排查到确实是没有打包进去,特此记录,便于日后查阅。 <!-- 加载lib目录下的opencv包 --> <dependency><groupId>org…...

iOS实际开发中使用Alamofire实现多文件上传(以个人相册为例)

引言 在移动应用中&#xff0c;图片上传是一个常见的功能&#xff0c;尤其是在个人中心或社交平台场景中&#xff0c;用户经常需要上传图片到服务器&#xff0c;用以展示个人风采或记录美好瞬间。然而&#xff0c;实现多图片上传的过程中&#xff0c;如何设计高效的上传逻辑并…...

如何将分割的mask转为为分割标签

将分割的mask转换为分割标签通常涉及将每个像素的类别标识&#xff08;在mask中以不同的灰度值或颜色表示&#xff09;转换为整数标签。这些标签通常用于机器学习或深度学习模型的训练、验证和测试阶段。 使用方式&#xff0c;控制台或者命令行使用以下命令&#xff1a; pyth…...

【动手学电机驱动】STM32-MBD(5)Simulink 模型开发之 PWM 输出

STM32-MBD&#xff08;1&#xff09;安装 Simulink STM32 硬件支持包 STM32-MBD&#xff08;2&#xff09;Simulink 模型部署入门 STM32-MBD&#xff08;3&#xff09;Simulink 状态机模型的部署 STM32-MBD&#xff08;4&#xff09;Simulink 状态机实现按键控制 STM32-MBD&…...

MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合

2024小结&#xff1a;在写作分享上&#xff0c;这里特别感谢CSDN社区提供平台&#xff0c;支持大家持续学习分享交流&#xff0c;共同进步。社区诚意满满的干货&#xff0c;让大家收获满满。 对我而言&#xff0c;珍惜每一篇投稿分享&#xff0c;每一篇内容字数大概6000字左右&…...

vue2日历组件

这个代码可以直接运行&#xff0c;未防止有组件库没安装&#xff0c;将组件库的代码&#xff0c;转成文字了 vue页面 <template><div class"about"><div style"height: 450px; width: 400px"><div style"height: 100%; overflo…...

【PyQt】多行纯文本框

[toc]qt多行纯文本框 QPlainTextEdit QPlainTextEdit 是可以多行的纯文本编辑框 文本浏览框 内置了一个** QTextDocument **类型的对象 &#xff0c;存放文档。 1.信号&#xff1a;文本被修改 当文本框中的内容被键盘编辑&#xff0c;被点击就会发出 textChanged 信号&…...

workerman5.0篇〡异步非阻塞协程HTTP客户端

概述 workerman/http-client 是一个异步http客户端组件。所有请求响应异步非阻塞&#xff0c;内置连接池&#xff0c;消息请求和响应符合PSR7规范。 Workerman 5.0 版本中的异步HTTP协程客户端组件是一个基于PHP协程的高性能HTTP客户端&#xff0c;它能够充分利用PHP的异步特…...

JavaScript 延迟加载的方法( 7种 )

JavaScript脚本的延迟加载&#xff08;也称为懒加载&#xff09;是指在网页的主要内容已经加载并显示给用户之后&#xff0c;再加载或执行额外的JavaScript代码。这样做可以加快页面的初始加载速度&#xff0c;改善用户体验&#xff0c;并减少服务器的压力。 以下是几种常见的延…...

python+pymysql

python操作mysql 一、python操作数据库 1、下载pymysql 库&#xff0c; 方法一&#xff1a;pip3 install pymysql 或pip install pymysql 方法二&#xff1a;在pycharm中setting下载pymysql 2、打开虚拟机上的数据库 3、pymysql连接 dbpymysql.Connection(host&qu…...

基于 Selenium 实现上海大学校园网自动登录

基于 Selenium 实现上海大学校园网自动登录 一、技术方案 核心工具&#xff1a; Selenium&#xff1a;一个用于自动化测试的工具&#xff0c;能够模拟用户在浏览器上的操作。Edge WebDriver&#xff1a;用于控制 Edge 浏览器的驱动程序。 功能设计&#xff1a; 检测网络状…...

啥!GitHub Copilot也免费使用了

文章目录 前言免费版直接修复代码多文件上下文Agent模式总结 前言 最近&#xff0c;GitHub 给开发者们带来了一个好消息&#xff1a;他们的 AI 编程助手 GitHub Copilot 现在可以免费使用了&#xff01;以前&#xff0c;每个月要花 10 美元才能享受的服务&#xff0c;现在对所…...

Spring配置文件中:密码明文改为密文处理方式(通用方法)

目录 一、背景 二、思路 A) 普通方式 B) 适合bootstrap.properties方式 三、示例 A) 普通方式&#xff08;连接Redis集群&#xff09; A) 普通方式&#xff08;连接RocketMQ&#xff09; B) 适合bootstrap.properties方式 四、总结 一、背景 SpringBoot和Sprin…...

Linux下ext2文件系统

文章目录 一 :penguin:基本概述二 :star: ext2文件系统:star:​ 1. :star:​Boot Block&#xff08;引导块&#xff09;位置与作用 三 Block Group(块组):star:​1.:star:​ Super Block(超级块):star:​2.:star:​ Group Descriptor&#xff08;块组描述符&#xff09;:star:​…...

BUUCTF:web刷题记录(1)

目录 [极客大挑战 2019]EasySQL1 [极客大挑战 2019]Havefun1 [极客大挑战 2019]EasySQL1 根据题目以及页面内容&#xff0c;这是一个sql注入的题目。 直接就套用万能密码试试。 admin or 1 # 轻松拿到flag 换种方式也可以轻松拿到flag 我们再看一下网页源码 这段 HTML 代码…...

【微服务】面试题 6、分布式事务

分布式事务面试题讲解 一、问题背景与解决方案概述 因微服务项目涉及远程调用可能引发分布式事务问题&#xff0c;需解决。主流解决方案有阿里 Seata 框架&#xff08;含 XA、AT、TCC 模式&#xff09;和 MQ。 二、Seata 框架关键角色 事务协调者&#xff08;TC&#xff09;&…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...