如何在声明后确定 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
或等价物。就像我们可以使用 typeof
或 something.constructor.name
来确定构造函数的类型。
【问题讨论】:
非常好的问题,我认为在 javascript 中没有任何可能的方法来检查值是否不可变。另外我认为javascript中没有方法可以立即检查。 @GrafiCodeStudio 是的,这看起来确实是重复的。 只是出于兴趣,这个有什么用例? @lewis 在问题中提到。 【参考方案1】:您可以在与变量相同的函数中直接使用eval
将let
和const
与var
区分开来:
let a;
try
eval('var a');
// it was undeclared or declared using var
catch (error)
// it was let/const
正如@JonasWilms 之前所写,您可以通过尝试赋值来区分let
和const
:
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? [复制]的主要内容,如果未能解决你的问题,请参考以下文章