为何为接口属性设置无效值未抛出TypeError异常?
为什么给document.onvisibilitychange赋值4不会抛出TypeError反而变成null?
这是因为document.onvisibilitychange属于EventHandler类型,它的赋值规则和WebIDL里普通基本类型的转换规则完全不同。
EventHandler的赋值逻辑
根据WebIDL规范,给EventHandler类型的属性赋值时,会按以下步骤处理:
- 如果赋值的是
null或undefined,直接将属性设为null; - 如果是对象,检查该对象是否具有
[[Callable]]内部方法(也就是是否是可调用的函数),是则保留该对象,否则设为null; - 如果是原始值(比如数字
4),会先转换为对应的包装对象(这里是Number(4)),再检查这个包装对象是否可调用——显然数字包装对象不是可调用的函数,所以最终属性会被设为null。
和普通类型转换的区别
普通的WebIDL类型(比如long、DOMString)在赋值转换失败时会抛出TypeError,但EventHandler作为专门的回调类型,设计目的就是只接受可调用的函数或null/undefined,对于非可调用的值,会直接静默转为null,而非抛出错误。
验证示例
// 赋值函数,正常生效 document.onvisibilitychange = () => console.log('visibility changed'); console.log(document.onvisibilitychange); // ƒ () => console.log('visibility changed') // 赋值非函数对象,转为null document.onvisibilitychange = {a: 1}; console.log(document.onvisibilitychange); // null // 赋值原始值4,转为null document.onvisibilitychange = 4; console.log(document.onvisibilitychange); // null
内容的提问来源于stack exchange,提问作者GulgDev
相关产品推荐
相关产品推荐

