关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

ES5 新特性一览表(一)

发布时间:2023-06-29 13:00:49
概述 ECMAScript 5.1就是我们常说的es5。它在2012年就已经被公开。时至今日,除了一些较低版本的浏览器,各大主流浏览器都已经实现支持了es5的绝大部分特性。 数字化管理平台 Vue3+Vite+VueRouter+Pinia+Axios+ElementPlus Vue权限系统案例 个人博客地址 先上一段代码,体会一下:

单项数据绑定:通过修改JS中的数据,页面呈现最新修改的数据信息。这是一种映射关系,把JS数据的变化映射到DOM结构上

数据单项绑定呈现位置
一、严格模式 1.1 基本概述 除了正常的运行模式(混杂模式),ES5中添加了第二种运行模式:“严格模式”(strict mode) 顾名思义,这种模式,使得JavaScript在更严格的语法下运行 "严格模式"体现了Javascript更合理、更安全、更严谨的发展方向,包括IE 10在内的主流浏览器,都已经支持它,许多大项目已经开始全面拥抱它。 另一方面,同样的代码,在"严格模式"中,可能会有不一样的运行结果;一些在"正常模式"下可以运行的语句,在"严格模式"下将不能运行。掌握这些内容,有助于更细致深入地理解Javascript,让你变成一个更好的程序员 1.2 设置严格模式的目的 消除JavaSript语法的一些不合理,不严谨之处,减少一些怪异的行为 消除代码运行的一些不安全之处,为代码的安全运行保驾护航 提高编译器效率,增加运行速度 为未来新版本的JavaScript做好铺垫 1.3 如何使用 在全局 或 函数内部,第一条语句定义为 “use strict”; 如果浏览器不支持,只会解析为一条普通的字符串语句,加以忽略,不会有任何副作用 如果这行语句不在第一行,则无效,整个脚本以"正常模式"运行。 1.4 语法和行为改变 1.4.1 必须使用var声明变量 在正常模式中,如果一个变量没有声明就赋值,默认是全局变量。严格模式禁止这种用法,全局变量必须显式声明。 a = 100; //非严格模式下,输出 a: 100 //严格模式下,a没有声明,抛出一个错误 Error: a is not defined console.log("a:",a); 1.4.2 禁止使用八进制数 var num4 = 076;//八进制标识 0 //非严格模式下,使用八进制没有任何位置 //严格模式下,不支持八进制 报错SyntaxError: Octal literals are not allowed in strict mode. 1.4.3 禁止使用arguments.callee 在函数内部,有两个特殊的对象:arguments 和 this。其中, arguments 的主要用途是保存函数参数,但这个对象还有一个名叫 callee 的属性,该属性是一个指针,指向拥有这个 arguments 对象的函数。 但在严格模式下,是被禁止使用的。 如下,实现阶乘的递归调用 function factorial(num){ if(num == 1){ return 1; }else{ // return num * factorial(num - 1);//原来阶乘方式 //非严格模式下,使用arguments.callee()指向拥有这个arguments对象的函数 //严格模式下禁止使用 报错TypeError: 'caller', 'callee', and 'arguments' properties may not be accessed on strict mode functions or the arguments objects for calls to them return num * arguments.callee(num - 1); } } 1.4.4 禁止使用 delete 删除变量 delete常用于删除对象中的属性;如果使用delete删除一个变量,在正常模式下可以执行通过,但不会删除成功;在严格模式下是禁止这样使用的 // 定义变量a var a = 100; // 定义window全局对象的变量b window.b = 200; // 以上两个都属于全局变量 // 删除操作 // 非严格模式下,可以删除window对象的全局变量b,但是不能删除使用var声明的全局变量a,不会报错 // 严格模式下,禁止使用delete删除变量,一旦使用就会报错:SyntaxError: Delete of an unqualified identifier in strict mode delete a; delete b; 1.4.5 禁止自定义函数中的this指向window (function fn(){ //非严格模式下,普通函数中的this指向window //严格模式下,普通函数中的this不再指向window 返回undefined console.log(this); })(); 1.4.6 创建 eval 作用域,即:块级作用域 正常模式下,Javascript语言有两种变量作用域(scope):全局作用域和函数作用域。严格模式创设了第三种作用域:eval作用域。 正常模式下,eval语句的作用域,取决于它处于全局作用域,还是处于函数作用域。严格模式下,eval语句本身就是一个作用域,不再能够生成全局变量了,它所生成的变量只能用于eval内部使用 eval("var x = 10;"); // 非严格模式下,x为10 // 严格模式下,x没有声明,抛出一个错误 Error: s is not defined alert(x); 任意由eval()创建的变量或函数仍呆在eval()里。然而,你可以通过从eval()中返回一个值的方式实现值的传递: var result = eval("var a = 10,b = 20;a + b"); // 严格模式与非严格模式下都能正常工作(得到30) console.log("result:",result);//result: 30 1.4.7 width作用域 with(target){}方法: 正常模式下:如果添加了tatget对象,它会把这个对象,当作with要执行的代码体的作用域的最顶端,也就是with会改变作用域链。 作用域链是经过很复杂的情况生成的结构,作用域链改了之后,系统内核会消耗大量的效率去更改作用域链,是会把程序变得非常慢的。 所以,在ES5严格模式下,with方法就不可以再使用了。 "use strict"; var num = 10; var obj = { name:"张三", num:100 } fn() function fn(){ var num = 1000; // console.log(num);//1000 // with(window){ // console.log(num);//10 // } with(obj){ console.log(num);//100 var score = 99; console.log(score);//99 } console.log(score);//99 } // console.log(score);//Error: score is not defined width(){}中声明的不存在的变量的作用域由它所在的那个作用域决定 // 严格模式下不支持 width(){} 报错 SyntaxError: Strict mode code may not include a with statement 1.4.8 对象不能有重名的属性 正常模式下,如果对象有多个重名属性,最后赋值的那个属性会覆盖前面的值。严格模式下,这属于语法错误(但是程序目前检测不出来)。 var obj = {a:10,a:100} 1.4.9 函数不能有重名的参数 正常模式下,如果函数有多个重名的参数,可以用arguments[i]读取。严格模式下,这属于语法错误。 "use strict"; //严格模式下报错 Error: Duplicate parameter name not allowed in this context function fn(a,a,b){ return; } 1.4.10 保留字 为了向将来Javascript的新版本过渡,严格模式新增了一些保留字:implements, interface, let, package, private, protected, public, static, yield。 使用这些词作为变量名将会报错。 //非严格模式下不会报错 //严格模式下报错 Error: Unexpected strict mode reserved word var let = 10; 此外,ECMAscript第五版本身还规定了另一些保留字(class, enum, export, extends, import, super),以及各大浏览器自行增加的const保留字,也是不能作为变量名的。 注意:经过测试 IE6,7,8,9 均不支持严格模式

/template/Home/leiyu/PC/Static