如何在声明后确定 ES6 值是不是为 var / const / let? [复制]

Posted

技术标签:

【中文标题】如何在声明后确定 ES6 值是不是为 var / const / let? [复制]【英文标题】:How can I find out if an ES6 value is var / const / let after it is declared? [duplicate]如何在声明后确定 ES6 值是否为 var / const / let? [复制] 【发布时间】:2019-10-16 00:08:17 【问题描述】:

我知道我可以通过查看声明的位置来确定值是 var const 还是 let。但是我想知道——主要是为了调试、开发 JS 编译器和学术兴趣——是否有可能在创建变量(var / const / let-ness)后找出它的不变性/范围。

doThing(something)

会回来

let

或等价物。就像我们可以使用 typeofsomething.constructor.name 来确定构造函数的类型。

【问题讨论】:

非常好的问题,我认为在 javascript 中没有任何可能的方法来检查值是否不可变。另外我认为javascript中没有方法可以立即检查。 @GrafiCodeStudio 是的,这看起来确实是重复的。 只是出于兴趣,这个有什么用例? @lewis 在问题中提到。 【参考方案1】:

您可以在与变量相同的函数中直接使用evalletconstvar 区分开来:

let a;

try 
    eval('var a');
    // it was undeclared or declared using var
 catch (error) 
    // it was let/const

正如@JonasWilms 之前所写,您可以通过尝试赋值来区分letconst


  let x = 5;
  const original = x;
  let isConst = false;
  
  try 
    x = 'anything';
    x = original;
   catch (err) 
    isConst = true;
  
  
  console.log(isConst ? 'const x' : 'let x');



  const x = 5;
  const original = x;
  let isConst = false;
  
  try 
    x = 'anything';
    x = original;
   catch (err) 
    isConst = true;
  
  
  console.log(isConst ? 'const x' : 'let x');

【讨论】:

有趣,我猜你可以进一步检查它是否可以在 try/catch 中写入,以确定它是否是 const @VLAZ:是的。这已经涵盖了,但现在由于某种原因被删掉了……? 奇怪,我没有看到那个版本。它不在历史记录中,所以它可能在宽限期内(或任何所谓的)。 @ry- 没关系,我误解了我得到的错误(我在 const 声明中缺少初始化程序,没有仔细查看错误消息) 包裹代码部分的是什么?【参考方案2】:

let 和 var 只是关于范围,所以这是不可能的。因为 JavaScript 不通过引用传递,如果您将变量传递给函数,您将失去“常量”以及范围 - 在该函数上,变量将只是一个局部范围的变量。所以我的想法是:这是不可能的。

【讨论】:

【参考方案3】:

您无法以任何方式直接访问环境记录链,因此您无法判断是否声明了变量。 with 语句可能使您能够缩小范围(如果声明了一个变量,因为它允许您将代理添加为环境记录),但这只会提供一些洞察力,而且这通常是一件非常危险的事情。

【讨论】:

但他想要的是一个返回它的函数。 这仅适用于"use strict"; 模式,除非此后发生了变化。 @ricardo 是的,这更不可能。【参考方案4】:

我曾经这样做,但它有点hacky......

我创建了一个变量并尝试更改它,如果它引发错误,那么它就是一个 const 变量。

我创建了一个变量并尝试在 大括号上更改它,如果值不同,则它最初是创建的,那么它是一个 var,如果不是,那么它是一个 let 变量。

【讨论】:

以上是关于如何在声明后确定 ES6 值是不是为 var / const / let? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

ES6新增语法总结

如何检查 `let` 变量是不是已在 ES6 上声明?

ES6详解

ES6 之 let const

es6 转载

面试知识-es6