JS查漏补缺——ECMAScript相关

简介: JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来了解ECMAScript相关语法中的大小写和严格模式

大小写

ECMAScript中的一切都是区分大小写的,无论是变量操作符还是函数名,如:Typeof 和 typeof 是不一样的

严格模式

ES5中增加,是一种不同的JS解析和执行模型,通过在脚本开头或者函数体内部增加use strict字符这个预处理指令,开启严格模式,一些不规则的(ECMA3)写法在这里会抛出异常。
设立"严格模式"的目的,主要有以下几个:

  • 消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
  • 消除代码运行的一些不安全之处,保证代码运行的安全;
  • 提高编译器效率,增加运行速度;
  • 为未来新版本的Javascript做好铺垫。

开启严格模式:

  • 严格模式通过在脚本或函数的头部添加 use strict; 表达式来声明。
  • use strict并不严格限制一定要写在第一行。前边无产生实际运行结果的语句,use strict可以不在第一行
// 整个脚本都开启严格模式的语法
"use strict";
var v = "Hi!  I'm a strict mode script!";

//单独在某个函数内开启严格模式
function a (){
    "use strict";
    //函数体
}
//use strict可以不在第一行
function(){
    "asd";
    "use strict";
    a = 1;
}

严格模式 vs 正常模式

正常模式 严格模式
一个变量没有声明就赋值 默认是全局变量 全局变量必须显式声明(先用var命令声明,然后再使用)
对于静默失败(不报错也没有任何效果)的赋值操作 如:给NaN赋值 不给效果也不报错 报错
试图删除(不可删除的属性/变量/对象/函数)
delete Object.prototype;
不给效果也不报错 报错
对象有多个重名属性 允许重名属性,只有最后一个属性起作用 报语法错误
函数有多个重名的参数
function f(a, a, b) {
return ;
}
可以用arguments[i]读取 报语法错误
八进制数字语法 整数的第一位如果是0,表示这是八进制数,比如0100等于十进制的64 禁止八进制数字语法,使用会报语法错误

严格模式下的eval和arguments

eval

  1. 变量名不能使用 "eval" 字符串(不能通过程序语法被绑定 (be bound) 或赋值)
"use strict";
var eval = 1;         // 报错
  1. eval作用域: 在eval里面生成的变量只能用于eval内部
 "use strict";
  var a = 1;
console.info(eval("var a = 2; a"))  // 2
console.info(x)  //1

eval ("var a = 2");
alert (a);               // 报错

arguments

arguments是函数的参数对象

  1. arguments 不能通过程序语法被绑定 (be bound) 或赋值
"use strict";
  arguments++; // 语法错误
  var obj = { set p(arguments) { } }; // 语法错误
  try { } catch (arguments) { } // 语法错误
  function arguments() { } // 语法错误
  var f = new Function("arguments", "'use strict'; return 17;"); // 语法错误
  1. 参数的值不会随 arguments 对象的值的改变而变化
function f(a) {
    a = 2;
    return [a, arguments[0]];
  }
  f(1); // 正常模式为[2,2]

  function f(a) {
    "use strict";
    a = 2;
    return [a, arguments[0]];
  }
  f(1); // 严格模式为[2,1]
  1. 不再支持 arguments.callee
"use strict";
  var f = function() { return arguments.callee; };
  f(); // 报错
🚨 ES6 的模块自动采用严格模式,不管你有没有在模块头部加上 "use strict";

参考资料:
菜鸟教程:https://www.runoob.com/js/js-strict.html
《JavaScript高级程序设计》
MDN: https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Strict_mode
阮一峰的网络日志:https://www.ruanyifeng.com/blog/2013/01/javascript_strict_mode.html

目录
相关文章
|
8月前
|
JavaScript 前端开发 API
ECMAScript和JavaScript的区别是什么?
【4月更文挑战第11天】ECMAScript和JavaScript的区别是什么?
52 1
|
8月前
|
缓存 JavaScript 前端开发
深入理解 ECMAScript modules:提升你的 JavaScript 技能(五)
深入理解 ECMAScript modules:提升你的 JavaScript 技能(五)
|
8月前
|
JavaScript 前端开发
深入理解 ECMAScript modules:提升你的 JavaScript 技能(四)
深入理解 ECMAScript modules:提升你的 JavaScript 技能(四)
|
2月前
|
JavaScript 前端开发 安全
ECMAScript 6(以下简称 ES6)的出现为 JavaScript 带来了许多新的特性和改进,其中 let 和 const 是两个非常重要的关键字。
ES6 引入了 `let` 和 `const` 关键字,为 JavaScript 的变量管理带来了革新。`let` 提供了块级作用域和暂存死区特性,避免变量污染,增强代码可读性和安全性;`const` 用于声明不可重新赋值的常量,但允许对象和数组的内部修改。两者在循环、函数内部及复杂项目中广泛应用,有助于实现不可变数据结构,提升代码质量。
32 5
|
2月前
|
自然语言处理 JavaScript 前端开发
ECMAScript 6 的出现为 JavaScript 带来了许多新的特性和改进
这些只是ES6的一些主要特性,它们极大地增强了JavaScript的功能和表现力,使得JavaScript在大型应用开发、前端框架等领域能够更加高效地编写复杂的应用程序。
|
3月前
|
JavaScript 前端开发 编译器
掌握现代化JavaScript:ECMAScript提案与特性
【10月更文挑战第13天】本文介绍了ECMAScript(ES)的最新提案与特性,包括可选链、空值合并运算符、类字段和顶层Await等。通过跟踪TC39提案、使用Babel或TypeScript、测试兼容性以及逐步迁移,开发者可以高效地采用这些新特性,简化代码、提高开发效率并增强应用功能。文章还提供了实战技巧,帮助开发者在现代Web开发中充分利用这些现代化的特性。
|
4月前
|
Web App开发 JavaScript 前端开发
探索现代JavaScript开发:ECMAScript提案的未来
JavaScript是最受欢迎的编程语言之一,其发展迅速。ECMAScript(JS的标准化版本)的提案和更新为其带来了诸多新特性和改进。本文将介绍值得关注的ECMAScript提案,如可选链、空值合并运算符、逻辑赋值运算符、类字段和顶级Await,并展示如何利用这些新特性提升开发效率和代码质量。通过关注TC39提案流程、使用Babel和TypeScript等工具,开发者可以提前体验并利用这些新特性。随着JavaScript的不断进步,未来将有更多令人期待的功能加入。
|
5月前
|
JavaScript 前端开发 API
JS 与ECMAScript的关系、历史和未来发展
JS 与ECMAScript的关系、历史和未来发展
|
7月前
|
JavaScript 前端开发 编译器
ECMAScript与JavaScript:一场语言的邂逅
ECMAScript与JavaScript:一场语言的邂逅
|
7月前
|
JavaScript 前端开发 API
ECMAScript vs JavaScript: 理解两者间的联系与区别
ECMAScript vs JavaScript: 理解两者间的联系与区别