首页 > 其他分享 >ecmascript 标准+ 严格模式与常规模式 + flat-flatMap 应用

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

时间:2025-01-12 17:58:59浏览次数:3  
标签:flat flatMap console log 代码 模式 严格 obj

文章目录

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

标签:flat,flatMap,console,log,代码,模式,严格,obj
From: https://blog.csdn.net/m0_51244077/article/details/145090948

相关文章

  • 学英语学压测:07 jmeter 三种运行模式:GUI、命令行、Server
    ......
  • Sigrity System SI SerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Rx_Dev
    SigritySystemSISerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Rx_DeviceSigritySystemSISerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以及该协议......
  • Sigrity System SI SerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Tx_Hos
    SigritySystemSISerialLink模式进行USB3.0协议仿真分析操作指导-SuperSpeed_Tx_HostSigritySystemSISerialLink模式提供了10个协议合规性检查工具模板,用户可以将根据实际应用替换模板中的SPICE文件,然后进行协议仿真分析,同时软件还提供了目标结果的模板MASK以及该协议需......
  • 【Rust】枚举与模式匹配
    目录思维导图一、概述1.枚举的定义与使用2.特殊枚举:Option4.模式匹配5.iflet构造二、枚举1.枚举的定义与作用2.IP地址的枚举示例示例代码3.结构体与枚举的组合示例代码4.枚举变体的灵活性示例代码5.枚举的方法代码示例:6.Option枚举的优势标准库......
  • Java常用设计模式
    单例模式单例模式就是:在程序运行期间,某些类有且最多只有一个实例对象饿汉模式(静态常量)饥饿模式又称为饿汉模式,指的是JVM在加载类的时候就完成类对象的创建//饿汉式(静态常量)publicclassSingleton1{//构造器私有化,外部不能newprivateSingleton1(......
  • 【设计模式与体系结构】结构型模式-外观模式
    引言昨夜见军帖,可汗大点兵,军书十二卷,卷卷有爷名。阿爷无大儿,木兰无长兄,愿为市鞍马,从此替爷征。东市买骏马,西市买鞍鞯,南市买辔头,北市买长鞭。————《木兰诗节选》花木兰替父从军,欲买马、鞍鞯、辔头和长鞭,需要分别去往东市、西市、南市和北市。换言之,花木兰一人就得与四个贸易......
  • 观察者设计模式:原理、应用与对比分析
    引言在软件工程中,设计模式是解决常见问题的经典方案。观察者设计模式(ObserverPattern)是一种行为型设计模式,用于在对象间建立一种一对多的依赖关系,使得当一个对象状态改变时,所有依赖它的对象都会收到通知并自动更新。本文旨在探讨观察者模式的基本原理、应用场景、具体案例,并与其......
  • springboot毕设 基于O2O模式的外卖订餐系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和人们生活节奏的加快,O2O(OnlineToOffline)模式的外卖订餐系统逐渐成为人们日常生活中不可或缺的一部分。现代都市人的生活......
  • 如何开启苹果手机(IOS)系统的开发者模式?
    如何开启开发者模式?一、打开设置二、隐私与安全性三、找到开发者模式四、开启开发者模式------------------------------------------------------------如果发现没有开发者模式的选项一、电脑下载爱思助手二、连接手机三、工具箱——虚拟定位——打开虚拟定位——提示需......
  • COMMAND(命令)—对象行为型模式
    1.意图将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。2.别名动作(Action),事务(Transaction)3.动机有时必须向某对象提交请求,但并不知道关于被请求的操作或请求的接受者的任何信息......