严格模式将以前接受的一些错误更改为错误。JavaScript的设计初学者很容易理解,有时它提供的操作应该是错误非错误语义。有时这可以解决眼前的问题,但有时这会在未来造成更严重的问题。严格模式将这些错误视为错误,以便发现并及时修复。
分配给未声明的变量
严格模式使得不可能意外创建全局变量。在sloppy模式下,在赋值中错误地键入变量会在全局对象上创建一个新属性,并继续“工作”。会意外创建全局变量的赋值在严格模式下引发错误:
“使用严格”;let mistypeVariable;//假设不存在全局变量mistypeVariable//由于//“mistypeVariable”拼写错误(缺少“a”)mistypeVariable=17;
未能分配给对象属性
严格模式会进行赋值,否则这些赋值将无法抛出异常。有三种方法可以使属性分配失败:
- 分配给不可写数据属性
- 对仅getter访问器属性的赋值
- 上新属性的赋值不可扩展的对象
例如,NaN公司
是不可写的全局变量。在sloppy模式下,分配给NaN公司
什么都不做;开发人员没有收到失败反馈。在严格模式下,分配给NaN公司
引发异常。
“使用严格”;//分配给不可写全局未定义=5;//类型错误无限=5;//类型错误//不可写属性的赋值常量obj1={};Object.defineProperty(obj1,“x”,{value:42,可写:false});obj1.x=9;//类型错误//对getter-only属性的赋值常量对象2={获取x(){返回17;},};对象2.x=5;//类型错误//分配给不可扩展对象上的新属性常量固定={};Object.proventExtensions(固定);fixed.newProp=“ohai”;//类型错误
无法删除对象属性
尝试删除不可配置或不可删除的(例如,被代理拦截删除属性
返回的处理程序假
)属性在严格模式下抛出(在此之前尝试无效):
“使用严格”;删除Object.protype;//类型错误删除[].length;//类型错误
严格模式还禁止删除纯名称。删除名称
在strict模式下是一个语法错误:
如果名称是可配置的全局属性,请在其前面加上全局此
删除它。
参数名称重复
严格模式要求函数参数名称是唯一的。在sloppy模式下,最后一个重复的参数会隐藏以前同名的参数。之前的参数通过以下方式保持可用论据
,所以它们不是完全无法访问的。然而,这种隐藏毫无意义,可能是不可取的(例如,它可能隐藏了一个输入错误),因此在严格模式下,重复的参数名称是一种语法错误:
函数和(a,a,c){//语法错误“使用严格”;返回a+a+c;//如果运行此代码,则返回错误}
如果函数具有默认参数、rest参数或析构化参数,那么在非限定模式下,参数名称重复也是一个语法错误。
旧八进制文字
严格模式禁止0
-带前缀的八进制文字。在sloppy模式下,以0
,例如0644
,被解释为八进制数(0644 === 420
),如果所有数字都小于8。新手开发人员有时认为前导零前缀没有语义意义,因此他们可能会将其用作对齐设备,但这会改变数字的含义!八进制的前导零语法很少有用,可能会被错误使用,因此严格模式会导致语法错误:
“使用严格”;常数和=015+//语法错误197 +142;
表示八进制文字的标准化方法是通过0个
前缀。例如:
const sum With Octal=0o10+8;console.log(sumWithOctal);//16
八进制转义序列,例如"\45"
,等于"%"
,可用于通过扩展-ASCII码八进制字符代码。在严格模式下,这是一个语法错误。更正式地说,不允许\
后跟除0
,或\0
后跟一个十进制数字;例如\9
和\07
.
设置基元值的属性
严格模式禁止在上设置属性原始的值。访问基元上的属性会隐式创建不可观察的包装器对象,因此在sloppy模式下,设置属性会被忽略(no-op)。在严格模式下类型错误
被抛出。
“使用严格”;false.true=“”;//类型错误(14) .sailing=“home”;//类型错误“with”.you=“fart away”;//类型错误
重复的属性名称
重复的属性名称过去被视为语法错误
严格模式下。随着引入计算的特性名称由于可以在运行时进行复制,因此在ES2015中取消了此限制。
“使用严格”;常数o={p:1,p:2};//ECMAScript 2015之前的语法错误
注:使用于出错的代码成为非错误代码始终被认为是向后兼容的。这是语言严格要求抛出错误的一个很好的方面:它为将来的语义更改留出了空间。