如何在声明后确定ES6值是变量,常量还是let?

10
我知道可以通过查看值被声明的位置来确定它是varconst还是let,但我想知道(主要是为了调试、开发JS编译器和学术兴趣)是否有可能在创建后确定变量的不可变性/作用域(var/const/let)。
例如:
doThing(something)

将返回

let

或者等效。就像我们可以使用typeofsomething.constructor.name来确定类型一样。


2
非常好的问题,我认为在JavaScript中没有任何可能检查一个值是否不可变。同时,我认为JavaScript中也没有直接检查这一点的方法。 - Nicolae Maties
@GrafiCodeStudio 是的,这似乎是一个重复的问题。 - mikemaccana
2
只是出于兴趣,这有什么用途? - Lewis
@lewis 在问题中提到。 - mikemaccana
4个回答

10

你可以通过在同一个函数中使用直接的eval来区分letconstvar

let a;

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

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

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

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


有趣的是,你可以进一步使用try/catch检查它是否可写,以确定它是否为“const”。 - VLAZ
@VLAZ:是的。那已经被提到了,但现在因为某种原因被编辑掉了...? - Ry-
奇怪,我没有看到那个版本。它不在历史记录中,所以可能是在宽限期内(或者叫做其他什么)。 - VLAZ
@ry- 没事了,我误解了我得到的错误(在const声明中缺少一个初始化器,没有仔细看错误信息)。 - Jonas Wilms
代码段周围的{}是什么? - mikemaccana
@mikemaccana:使用块来限定变量作用域。可以让名称“x”在两次使用中都有效,这样块就可以除了一个单词之外完全相同。 - Ry-

1
您无法直接访问环境记录链,因此无法确定变量声明的位置。使用with语句可能会帮助您缩小变量声明的范围,因为它允许您将代理作为环境记录添加,但这只提供了一些见解,并且通常是非常危险的事情。

但他想要的是一个返回它的函数。 - Ricardo Peres
1
除非有什么变化,否则这只在“use strict”模式下起作用。 - Deckerz
1
@ricardo 嗯,那就更不可能了。 - Jonas Wilms

1

let和var只涉及作用域,所以这是不可能的。因为JavaScript不通过引用传递,如果您将变量传递给函数,则会失去“constness”和作用域 - 在该函数上,变量将仅成为局部作用域的一个。所以我的想法是:这是不可能的。


0

我以前这样做,但有些不太规范的方法...

我创建一个变量,尝试更改它,如果它抛出错误,则为常量变量。

我创建一个变量,在 {} 括号中尝试更改它,如果值与最初创建的不同,则是 var,否则是 let 变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接