为何typeof let返回'undefined'而非抛出SyntaxError?
关于
typeof let返回'undefined'的疑问解答 嘿,我来帮你理清这两个问题的核心原因,其实主要和JavaScript环境对ES6规范的支持程度以及typeof的特殊规则有关:
疑问1:为什么typeof let === 'undefined'?
这得分两种情况看:
- 在标准ES6+环境中:
let是严格的保留关键字,根本不能当作普通标识符(变量名)使用,所以typeof let应该直接抛出语法错误,不会返回任何值。 - 在ES6之前或支持不彻底的环境(比如IE11)中:
let还没被列为保留关键字,这时候它就是个普通的标识符。如果你从来没声明过名为let的变量,typeof遇到未声明的标识符时,就会返回'undefined'——这和你写typeof someRandomVar(某个从没定义过的变量)返回'undefined'是同一个逻辑。
疑问2:为什么执行console.log(typeof let);不抛出SyntaxError,反而返回'undefined'?
同样是环境支持的问题:
- 标准ES6+引擎会把
let识别为关键字,而typeof操作符需要接收一个合法的表达式,关键字单独出现在这个位置属于语法错误,所以会直接抛出SyntaxError。 - 但在旧环境里,
let不是关键字,所以引擎会把它当成一个未声明的变量名处理。而typeof有个特殊规则:对未声明的变量使用typeof不会抛出ReferenceError,而是返回'undefined'——这就是你看到的结果。
补充:别混淆TDZ的情况
如果你是把let变量的暂时性死区(TDZ)行为和这个搞混了,我也顺便提一下:
比如下面这段标准ES6代码:
console.log(typeof myLetVar); // 输出'undefined' let myLetVar;
这里的myLetVar是用let声明的变量,在let语句之前的TDZ里,变量已经被创建但还没初始化,typeof对这种状态的变量会特殊处理,返回'undefined',但这和你问的typeof let是完全不同的场景——这里的操作数是变量名myLetVar,不是关键字let。
内容的提问来源于stack exchange,提问作者Kristianmitk
相关产品推荐
相关产品推荐

