为什么在原生JavaScript中用尖括号调用函数是合法语法?
JavaScript函数调用时的尖括号语法解析
你看到的这个尖括号根本不是函数的泛型参数(毕竟JavaScript是动态类型语言,原生语法里并没有泛型),而是被JS引擎解析成了连续的小于<和大于>比较运算符。
拿你提供的代码举例:
let x = "ok"; console.log<"you wont see this">("And you wont see this either");
JS引擎会将其拆解为以下表达式:
(console.log < "you wont see this") > "And you wont see this either"
具体执行过程如下:
- 第一步:比较
console.log(函数对象)与字符串"you wont see this"。JS会把函数转换为字符串形式(类似"function log() { [native code] }"),然后按字典序进行对比。由于"function"的首字母"f"ASCII码小于"you"的首字母"y",这一步的比较结果为true。 - 第二步:用第一步得到的
true与字符串"And you wont see this either"比较。JS会将true转为数字1,将目标字符串转为数字(但该字符串无法转为有效数字,结果为NaN)。而任何值与NaN进行比较的结果都是false,因此整个表达式最终返回false。
至于为什么没有控制台输出?因为console.log自始至终都没有被调用——整行代码本质是一串比较运算,完全没有触发函数调用的逻辑。
内容的提问来源于stack exchange,提问作者GoldenretriverYT
相关产品推荐
相关产品推荐

