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"]

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

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

相关文章

【C++】string的关系运算与比较分析

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;基础知识&#xff1a;C 中的 string 关系运算器1. 关系运算器概述2. 字符串比较的本质 &#x1f4af;代码解析与扩展代码例一&#xff1a;相等比较代码解析输出 代码例二&a…

Qt C++读写NFC标签NDEF网址URI

本示例使用的发卡器&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1biFgjSs&ftt&id615391857885 #include "mainwindow.h" #include "ui_mainwindow.h" #include <QDebug> #include "QLibrary" …

NVIDIA Clara平台助力医学影像处理:编程案例与实践探索(上)

一、引言 1.1 研究背景与意义 在现代医学领域,医学影像技术已然成为疾病诊断、治疗方案制定以及疗效评估的关键支柱。从早期的 X 射线成像,到如今的计算机断层扫描(CT)、磁共振成像(MRI)、正电子发射断层扫描(PET)等先进技术,医学影像为医生提供了直观、精准的人体内…

【硬件介绍】Type-C接口详解

一、Type-C接口概述 Type-C接口特点&#xff1a;以其独特的扁头设计和无需区分正反两面的便捷性而广受欢迎。这种设计大大提高了用户的使用体验&#xff0c;避免了传统USB接口需要多次尝试才能正确插入的问题。Type-C接口内部结构&#xff1a;内部上下两排引脚的设计虽然可能不…

【数据结构】第1天之Java中的数据结构

前言 众所周知&#xff0c;程序数据结构算法&#xff0c;可见数据结构的重要性。 在Java中&#xff0c;数据结构通常指的是Java集合框架中的类和接口。 Java集合框架提供了一套标准的数据结构&#xff0c;例如列表、集合、映射表等&#xff0c;以及相应的实现类。 今天要分享的…

Open FPV VTX开源之默认MAVLink设置

Open FPV VTX开源之默认MAVLink设置 1. 源由2. 准备3. 连接4. 安装5. 配置6. 测试6.1 启动wfb-ng服务6.2 启动wfb-ng监测6.3 启动QGroundControl6.4 观察测试结果 7. 总结8. 参考资料9. 补充9.1 telemetry_tx异常9.2 DEBUG串口部分乱码9.3 PixelPilot软件问题9.4 偶尔启动卡住 …

Spring Boot 和微服务:快速入门指南

&#x1f496; 欢迎来到我的博客&#xff01; 非常高兴能在这里与您相遇。在这里&#xff0c;您不仅能获得有趣的技术分享&#xff0c;还能感受到轻松愉快的氛围。无论您是编程新手&#xff0c;还是资深开发者&#xff0c;都能在这里找到属于您的知识宝藏&#xff0c;学习和成长…

Redis 为什么要引入 Pipeline机制?

在 Redis 中有一种 Pipeline&#xff08;管道&#xff09;机制&#xff0c;其目的是提高数据传输效率和吞吐量。那么&#xff0c;Pipeline是如何工作的&#xff1f;它又是如何提高性能的&#xff1f;Pipeline有什么优缺点&#xff1f;我们该如何使用 Pipeline&#xff1f; 1、…

Cesium小知识:粒子系统的参数详解

Cesium 的粒子系统通过 ParticleSystem 类提供了一套丰富的参数来控制粒子的生成、行为和外观。以下是这些参数的详细说明,帮助你更好地理解和使用 Cesium 的粒子系统。 基本参数 image (String) - 粒子图像的URL路径。这个图像是每个粒子在渲染时使用的纹理。 startColor (Co…

【数据结构-堆】力扣1834. 单线程 CPU

给你一个二维数组 tasks &#xff0c;用于表示 n​​​​​​ 项从 0 到 n - 1 编号的任务。其中 tasks[i] [enqueueTimei, processingTimei] 意味着第 i​​​​​​​​​​ 项任务将会于 enqueueTimei 时进入任务队列&#xff0c;需要 processingTimei 的时长完成执行。 现…

OSPF - 2、3类LSA(Network-LSA、NetWork-Sunmmary-LSA)

前篇博客有对常用LSA的总结 2类LSA&#xff08;Network-LSA&#xff09; DR产生泛洪范围为本区域 作用:  描述MA网络拓扑信息和网络信息&#xff0c;拓扑信息主要描述当前MA网络中伪节点连接着哪几台路由。网络信息描述当前网络的 掩码和DR接口IP地址。 影响邻居建立中说到…

【强化学习】演员评论家Actor-Critic算法(万字长文、附代码)

&#x1f4e2;本篇文章是博主强化学习&#xff08;RL&#xff09;领域学习时&#xff0c;用于个人学习、研究或者欣赏使用&#xff0c;并基于博主对相关等领域的一些理解而记录的学习摘录和笔记&#xff0c;若有不当和侵权之处&#xff0c;指出后将会立即改正&#xff0c;还望谅…

【2024年华为OD机试】 (C卷,100分)- 密钥格式化(Java JS PythonC/C++)

一、问题描述 题目描述 给定一个非空字符串 S&#xff0c;其被 N 个‘-’分隔成 N1 的子串&#xff0c;给定正整数 K&#xff0c;要求除第一个子串外&#xff0c;其余的串每 K 个用‘-’分隔&#xff0c;并将小写字母转换为大写。 输入描述 正整数 K 和‘-’分割的字符串&a…

基于单片机的指纹密码锁

【摘要】 本设计是一款基于单片机的指纹识别电子密码锁系统。该系统以STC89C52单片机作为模块核心同时结合ZFM-60指纹模块实现录取指纹并存储指纹数据的功能&#xff0c;并且通过HS12864-15C液晶显示比对流程及比对结果&#xff0c;该指纹电子密码锁通过直流继电器与发光二极管…

企业总部和分支通过GRE VPN互通

PC1可以ping通PC2 1、首先按照地址表配置ip地址 2、分别在AR1和AR3上配置nat 3、配置GRE a 创建tunnel接口&#xff0c;并选择tunnel协议为GRE&#xff0c;为隧道创建一个地址&#xff0c;用作互联 b 为隧道配置源地址或者源接口&#xff0c;这里选择源接口&#xff1b;再为…

回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测

回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测 目录 回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 回归预测 | MATLAB实MLR多元线性回归多输入单输出回归预测。 程序设计 完整代码&#xff1a;回…

计算机网络(五)运输层

5.1、运输层概述 概念 进程之间的通信 从通信和信息处理的角度看&#xff0c;运输层向它上面的应用层提供通信服务&#xff0c;它属于面向通信部分的最高层&#xff0c;同时也是用户功能中的最低层。 当网络的边缘部分中的两个主机使用网络的核心部分的功能进行端到端的通信时…

【PPTist】插入形状、插入图片、插入图表

一、插入形状 插入形状有两种情况&#xff0c;一种是插入固定的形状&#xff0c; 一种是插入自定义的形状。 插入固定的形状时&#xff0c;跟上一篇文章 绘制文本框 是一样一样的&#xff0c;都是调用的 mainStore.setCreatingElement() 方法&#xff0c;只不多传的类型不一…

Elasticsearch—索引库操作(增删查改)

Elasticsearch中Index就相当于MySQL中的数据库表 Mapping映射就类似表的结构。 因此我们想要向Elasticsearch中存储数据,必须先创建Index和Mapping 1. Mapping映射属性 Mapping是对索引库中文档的约束&#xff0c;常见的Mapping属性包括&#xff1a; type&#xff1a;字段数据类…

ROS Action接口

实现自主导航是使用Action接口的主要目的 在实际使用navigation导航系统的时候&#xff0c;机器人需要自主进行导航。不能每次都手动设置导航的目标点。所以需要编写程序代码来实现导航控制。这就需要使用到navigation的导航接口。Navigation的这个导航接口有好几个。Rose官方…