【问题标题】:Why is let not recognised as a keyword in type conversion to string in javaScript?为什么 let 在 javaScript 中类型转换为字符串时不被识别为关键字?
【发布时间】:2021-07-01 19:24:16
【问题描述】:

在 JavaScript 中类型转换为字符串显然忽略了 let 作为关键字。

String(let) 抛出错误 ReferenceError: let is not defined

String(var) 抛出错误SyntaxError: Unexpected token 'var'

这是预期的行为吗?

【问题讨论】:

  • 更有趣的是,你可以这样做window['let'] = "foo" 然后String(let) 返回“foo”...
  • 另外...String() 不是“字符串插值”,您描述的是 toString()(“字符串插值”== 模板文字)

标签: javascript string-interpolation let template-literals


【解决方案1】:

“保留关键字”不能用作标识符(变量名)。 varis a reserved keyword.

let 不是保留关键字,因为这会破坏向后兼容性:在没有 ES6 的情况下编写的古代脚本碰巧使用 let 作为变量名会失败(并且浏览器会尝试 very hard 不向后中断兼容性

  • 有关详细说明,请参阅该问题)。

所以使用 String(var) 会引发 语法 错误,但在语法上允许使用 let - 直到您尝试引用它(此时会抛出错误,因为没有存在这种名为let 的变量)。

出于完全相同的原因,可以定义一个名为 let 的变量,但不能定义一个名为 var 的变量:

var let = 123;
console.log(String(let));

var var = 123;
console.log(String(var));

另外,let 不能在严格模式下声明为标识符:

'use strict';
var let = 123;
console.log(String(let));

这是可能的,因为如果使用严格模式,则可以保证运行的代码是在 ES5 之后编写的(因此无需担心任何向后兼容性)。

作为评论说明,这是not string interpolation。这只是识别有效变量/标识符名称的解析器。

【讨论】:

  • 很好的答案。但是,您弄乱了指向我的评论的链接
  • 有趣的是var var提供的错误...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-01-29
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-30
  • 2019-10-28
相关资源
最近更新 更多