如何判断值相同的两个JavaScript变量是否为同一变量?
判断值相同的变量是否为同一变量的实用方案
在JavaScript里,字符串、数字这类基本类型的变量,存的是值本身——哪怕两个变量值完全一样,也是独立的内存单元,没法用===直接判断是不是"同一个变量"。你不想改V8源码的话,下面这几个简便方法能解决你的问题:
方案1:用对象包装基本类型,靠引用判断
把基本类型包成String对象,这样变量存的是对象引用,就能用===判断是不是同一个引用了:
function check_var(v){ console.log(v === a); // 是不是a console.log(v === b); // 是不是b } let a = new String("string"); let b = new String("string"); check_var(b); // 输出 false, true
⚠️ 注意:这么做会把原始字符串变成String对象,类型变了,用的时候要小心类型差异的坑。
方案2:用WeakMap给变量绑定唯一ID
用WeakMap存变量和唯一ID的映射,既不会内存泄漏,又能准确追踪:
const varIdMap = new WeakMap(); let idCounter = 0; // 给变量注册唯一ID function markVar(v) { varIdMap.set(v, ++idCounter); } function check_var(v){ const currentId = varIdMap.get(v); if (currentId === varIdMap.get(a)) { console.log("传入的是变量a"); } else if (currentId === varIdMap.get(b)) { console.log("传入的是变量b"); } } let a = "string"; let b = "string"; markVar(a); markVar(b); check_var(b); // 输出 "传入的是变量b"
WeakMap的好处是,当变量被垃圾回收时,对应的ID也会自动清掉,不用担心内存问题。
方案3:用闭包把值和唯一标识绑在一起
给每个变量创建一个带唯一ID的包装对象,通过ID判断是不是同一个变量:
function wrapVar(value) { // Symbol天生唯一,不用怕重复 const uniqueId = Symbol(); return { get value() { return value; }, get id() { return uniqueId; } }; } function check_var(v){ if (v.id === a.id) { console.log("传入的是变量a"); } else if (v.id === b.id) { console.log("传入的是变量b"); } } let a = wrapVar("string"); let b = wrapVar("string"); check_var(b); // 输出 "传入的是变量b"
这种方式把值和标识绑定死,不会受字符串池之类的机制影响,准确性很高。
方案4:用Proxy追踪变量访问
如果你的变量是放在对象里的,用Proxy拦截读取操作,直接记录哪个变量被传进来:
const vars = { a: "string", b: "string" }; let lastAccessed = null; // 创建代理,拦截属性读取 const trackedVars = new Proxy(vars, { get(target, prop) { lastAccessed = prop; return target[prop]; } }); function check_var(v){ console.log("传入的变量是:", lastAccessed); } check_var(trackedVars.b); // 输出 "传入的变量是:b"
这种方式适合批量管理变量,不用一个个注册ID。
总结
如果不想大改代码,优先选方案2或者方案3——这俩既灵活又不会引入太多额外问题。方案1和4适合特定场景,按需挑就行。
内容的提问来源于stack exchange,提问作者eyal
相关产品推荐
相关产品推荐

