繁体   English   中英

为什么分配给'NaN`或`undefined`会导致TypeError?

[英]Why does assigning to `NaN` or `undefined` cause a TypeError?

AS:问题是关于错误的类型,而不是关于这种现象

如果更改了NaNundefined等系统变量, "use strict"会抛出TypeError。
但为什么它是类型错误? 为什么不语法错误?


编辑:实际上,这里不是SyntaxError,因为代码段的语法没有错误。
但错误的根源在于,某些受保护对象无法手动更改 ; 所以,它是访问错误(没有这样的,我知道)。
那么,为什么访问错误看起来像type-one?

在ES5中,有6种不同的本机错误

在您的情况下,抛出错误是因为您尝试将值分配给window.NaNwindow.undefined ,这些是不可写的属性。

在分配新值之前,内部[[Put]]方法检查[[CanPut]] ,它将返回false,因为该属性是不可枚举的。 因此[[Put]]会抛出。

所以问题是分配的引用( 赋值表达式中的左操作数)的可写性不是预期的。 然后,在上面的6种错误类型中,最合适的似乎是TypeError,即使可写性不是一个类型

因为NaNundefined只是window只读属性 它们不是运算符(如>+ )或关键字(如varclass )。

尝试将某些内容分配给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

因此,抛出类型错误 ,因为NaNundefined是“数据类型”,它是具有特定(指定)值的全局常量,而“严格模式”通过不允许更改这些来防止问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM