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

Dmi*_*sky 6 javascript typeerror

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

"use strict"如果系统变量喜欢NaN并且undefined已经改变,则抛出TypeError .
但为什么它是类型错误?为什么不语法错误?


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

Ori*_*iol 4

在 ES5 中,有 6 种不同类型的原生错误

  • 评估错误

    当前本规范中未使用此异常。保留该对象是为了与本规范的先前版本兼容。

  • 范围误差

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

  • 参考错误

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

  • 语法错误

    表明发生了解析错误。

  • 类型错误

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

  • URI错误

    指示全局 URI 处理函数之一的使用方式与其定义不兼容。

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

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

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

  • @MichaelBar-Sinai 不,因为 `NaN` 是一个标识符,可以[解析](http://www.ecma-international.org/ecma-262/5.1/#sec-10.3.1)到[参考] (http://www.ecma-international.org/ecma-262/5.1/#sec-8.7)`{base:globalObject,referencedName:“NaN”,strictFlag:whatever}`。那么 ReferenceError 就不合适了。`1` 不是标识符,因此无法解析为引用,然后 `1=2` 会抛出 ReferenceError。注意对“NaN”的赋值[可能会成功](https://jsfiddle.net/vfpgh4rq/),与对“1”的赋值不同。 (2认同)