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

时间:2016-05-08 18:26:45

标签: javascript typeerror

A.S。:问题是关于错误的类型,而不是关于现象

如果"use strict"NaN等系统变量发生了变化,

undefined会引发TypeError。 但为什么它是 Type 错误?为什么不语法错误?

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

4 个答案:

答案 0 :(得分:4)

在ES5中,共有6种不同的native errors

  • EvalError

      

    此规范当前未使用此异常。这个   对象仍然与以前的版本兼容   说明书

  • RangeError

      

    表示数值已超出允许范围。

  • ReferenceError

      

    表示检测到无效的参考值。

  • SyntaxError

      

    表示发生了解析错误。

  • TypeError

      

    表示操作数的实际类型与预期的不同   类型。

  • URIError

      

    表示在a中使用了一个全局URI处理函数   与其定义不相容的方式。

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

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

所以问题是指定引用的可写性(assignment expression中的左操作数)不是预期的。然后,在上面的6种错误类型中,最合适的似乎是TypeError,即使可写性不完全是type

答案 1 :(得分:2)

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

尝试将某些内容分配给NaN会在Chrome中出现以下错误:

  

TypeError:无法分配给只读属性&#39; NaN&#39;对象&#39; #<Window>&#39;

答案 2 :(得分:1)

因为它是一个没有意义的有效论据。但它在SEMANTIC水平上没有意义,而不是语法。

以下是一个例子:

1+1=42

这是错的,但它的错误方式不同于:

42 1 1 + =

您可以将第一个读作算术方程式(一加一等于四十二)。第二个,你甚至无法阅读。

同样如此。语句NaN=300;可以在Javascript中读取为&#34;让NaN指向值300`。但是当解析器将此请求提交给引擎时,引擎会进入&#34; Nope,无法执行此操作&#34;。

答案 3 :(得分:0)

语法错误
在大多数编程&amp;脚本语言这通常意味着您在错误的地方使用了操作员 有关“语法错误”的更多信息,请查看以下文章:https://en.wikipedia.org/wiki/Syntax_error

类型错误
当数据类型错过匹配某些要求时会发生这种情况 有关“数据类型”的更多信息,请查看以下文章:https://en.wikipedia.org/wiki/Data_type

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

相关问题