[英]Why does assigning to `NaN` or `undefined` cause a TypeError?
AS:问题是关于错误的类型,而不是关于这种现象
如果更改了NaN
和undefined
等系统变量, "use strict"
会抛出TypeError。
但为什么它是类型错误? 为什么不语法错误?
编辑:实际上,这里不是SyntaxError,因为代码段的语法没有错误。
但错误的根源在于,某些受保护对象无法手动更改 ; 所以,它是访问错误(没有这样的,我知道)。
那么,为什么访问错误看起来像type-one?
在ES5中,有6种不同的本机错误 :
此规范当前未使用此异常。 此对象仍与本规范的先前版本兼容。
表示数值已超出允许范围。
表示检测到无效的参考值。
表示发生了解析错误。
表示操作数的实际类型与预期类型不同。
表示其中一个全局URI处理函数的使用方式与其定义不兼容。
在您的情况下,抛出错误是因为您尝试将值分配给window.NaN
或window.undefined
,这些是不可写的属性。
在分配新值之前,内部[[Put]]方法检查[[CanPut]] ,它将返回false,因为该属性是不可枚举的。 因此[[Put]]会抛出。
所以问题是分配的引用( 赋值表达式中的左操作数)的可写性不是预期的。 然后,在上面的6种错误类型中,最合适的似乎是TypeError,即使可写性不是一个类型 。
因为NaN
和undefined
只是window
只读属性 。 它们不是运算符(如>
或+
)或关键字(如var
或class
)。
尝试将某些内容分配给NaN
会在Chrome中出现以下错误:
TypeError:无法分配给对象'
#<Window>
'的只读属性'NaN
'
因为这是一个没有意义的有效论据。 但它在SEMANTIC层面没有意义,而不是句法层面。
这是一个例子:
1+1=42
这是错误的,但它的错误方式不同于:
42 1 1 + =
您可以将第一个读作算术等式(一加一等于四十二)。 第二个,你甚至不能阅读。
这同样如此。 声明NaN=300;
可以在Javascript中读取“ NaN
指向值300”。但是当解析器将此请求提交给引擎时, 引擎会“不,不能这样做”。
语法错误
在大多数编程和脚本语言中,这通常意味着您在错误的位置使用了运算符。
有关“语法错误”的更多信息,请查看以下文章: https : //en.wikipedia.org/wiki/Syntax_error
类型错误
当数据类型错过匹配某些要求时会发生这些情况。
有关“数据类型”的更多信息,请查看以下文章: https : //en.wikipedia.org/wiki/Data_type
因此,抛出类型错误 ,因为NaN
和undefined
是“数据类型”,它是具有特定(指定)值的全局常量,而“严格模式”通过不允许更改这些来防止问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.