A.S。:问题是关于错误的类型,而不是关于现象
如果"use strict"
和NaN
等系统变量发生了变化, undefined
会引发TypeError。
但为什么它是 Type 错误?为什么不语法错误?
编辑:实际上,这里不是SyntaxError,因为代码段的语法没有错误。
但错误的根源在于,某些受保护对象无法手动更改;所以,它只是访问错误(我知道没有这样的。)
那么,为什么访问错误看起来像type-one?
答案 0 :(得分:4)
在ES5中,共有6种不同的native errors:
此规范当前未使用此异常。这个 对象仍然与以前的版本兼容 说明书
表示数值已超出允许范围。
表示检测到无效的参考值。
表示发生了解析错误。
表示操作数的实际类型与预期的不同 类型。
表示在a中使用了一个全局URI处理函数 与其定义不相容的方式。
在您的情况下,抛出错误是因为您尝试将值分配给window.NaN
或window.undefined
,这些属性是不可写属性。
在分配新值之前,内部[[Put]]方法会检查[[CanPut]],这将返回false,因为该属性是不可枚举的。因此[[Put]]会抛出。
所以问题是指定引用的可写性(assignment expression中的左操作数)不是预期的。然后,在上面的6种错误类型中,最合适的似乎是TypeError,即使可写性不完全是type。
答案 1 :(得分:2)
因为NaN
和undefined
只是只读属性window
。它们不是运营商(如>
或+
)或关键字(如var
或class
)。
尝试将某些内容分配给NaN
会在Chrome中出现以下错误:
TypeError:无法分配给只读属性'
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
因此,抛出类型错误,因为NaN
和undefined
是“数据类型”,它们是具有特定(指定)值的全局常量,并且“严格模式“通过不允许更改这些来防止问题。