[js] ReferenceError和TypeError有什么区别?
ReferenceError
指的是引用出错,比如尝试访问未定义的变量,或者提前访问无提升的变量,都会引发这个错误:
console.log(foo); // ReferenceError: foo is not defined
let foo = 1;TypeError
指的是类型出错。
众所周知JavaScript是一个弱类型的语言,这既是它的优点,也经常被人诟病。你永远也不知道 a + b 是在做数值加减还是字符串拼接,而且似乎 a + b 几乎从来也不会报错。
而tc39自 ES5 到 ES6 以来,将 TypeError 的频率几乎翻了4倍之多。目的就是为了规范和强调类型这一概念,避免过于模糊类型这一概念导致JavaScript对于语义的不确定性。
Symbol() + 1; // TypeError: Cannot convert a Symbol value to a number({ toString: () =>({}) }) + 'a'; // TypeError: Cannot convert object to primitive value
这样使得JavaScript更为规范,当一个方法的参数需要一个 number 但却收到了一个 object,与其让它返回 NaN,不如果断地抛出 TypeError 吧。
个人简介
我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易,
但坚持一定很酷。
主目录
与歌谣一起通关前端面试题