当前位置: 首页 > 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;&…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息&#xff0c;对客户进行统一管理&#xff0c;可以把所有客户信息录入系统&#xff0c;进行维护和统计功能。可通过文件的方式保存相关录入数据&#xff0c;对…...

R 语言科研绘图第 55 期 --- 网络图-聚类

在发表科研论文的过程中&#xff0c;科研绘图是必不可少的&#xff0c;一张好看的图形会是文章很大的加分项。 为了便于使用&#xff0c;本系列文章介绍的所有绘图都已收录到了 sciRplot 项目中&#xff0c;获取方式&#xff1a; R 语言科研绘图模板 --- sciRplothttps://mp.…...

群晖NAS如何在虚拟机创建飞牛NAS

套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...