我正在寻找一种方法来检查两个变量是否在javascript中引用同一个对象。
前:
var a = {foo:"bar"};
var b = {foo:"bar"};
var aa = a;
testSame(a, b); //false
testSame(a, aa); //true
var r = "a string";
var s = "a string";
var rr = r;
testSame(r, s); //false
testSame(r, rr); //true
到目前为止,似乎没有一种方法可以做到这一点。
编辑:testSame()
不是一个真正的函数,它将是假设的解决方案。
编辑:问题How to check if two vars have the same reference?的答案没有回答这个问题,因为它使用严格相等运算符(===
),它不区分2个vars指向到2个相同字符串的实例。
答案 0 :(得分:2)
只需与==
或===
进行比较即可。但字符串除外。没有办法用字符串做你想问的事。
var a = {foo:"bar"};
var b = {foo:"bar"};
var aa = a;
testSame(a, b); //false
testSame(a, aa); //true
var r = "a string";
var s = "a string";
var rr = r;
testSame(r, s); // false <-- this will be true
testSame(r, rr); //true
function testSame(a, b) {
console.log(a === b);
}
答案 1 :(得分:2)
==
或===
将为您提供帮助:
let a = "string1"
let b = "string2"
a == b // false
let c = a
c == a // true
===
在比较之前会进行类型转换,所以你想要使用它;)
编辑1
仍然不明白问题的重点,只是对象:
let a = {}
let b = {}
a == b //false
let c = a
a == c //true
c == b //false
答案 2 :(得分:1)
这是事情的运作方式。首先,在此代码中:
var a = {foo:"bar"};
var b = {foo:"bar"};
变量a
和b
通过引用两个不同的对象进行初始化。因此,与==
或===
的比较会将它们报告为不同(即不相等)。
然而,这里:
var a = "some string";
var b = "some string";
初始化两个变量以引用相同的字符串。 JavaScript中的字符串值是不是对象 - 它们是原语。因此,a
和b
与==
或===
之间的比较将返回true
,因为字符串相同。这与变量初始化时的情况完全相同:
var a = 17;
var b = 17;
数字和字符串是基元,因此比较比较基元的语义值。但是,对象是 not 原语,对象的比较基于对象标识。
在JavaScript语义域中确实是荒谬的,想要知道指向同一个相同字符串的两个变量是否指向同一个字符串的两个不同表达式,其方式与想要知道是否无意义的方式完全相同一个17
与另一个不同。
答案 3 :(得分:1)
这个问题是正确的,但是有一个窍门。以下控制台代码片段将其揭示出来:
const A = "abc", B = new String(A), C = B
> A == B
true
> A === B
false
> B === C
true
变量A
是指根据需要转换为String
对象的整数基元。 JS机器可以优化对代码中定义的相等原始字符串的引用,以完全相同的RAM块为目标 –这就是为什么所定义的问题没有解决方案。
您需要将每个整数值手动包装到相应的对象类:String
,Number
,Boolean
,—并使用===
运算符对其进行测试:
var r = new String("a string");
var s = new String("a string");
var rr = r;
我已应用此技巧来跟踪React中最初为空的受控输入,即用户是否已对其进行编辑然后将其擦除以使其清晰可见,而无需在状态中涉及其他字段。
答案 4 :(得分:0)
这个问题已在这个问题中得到解答: How to check if two vars have the same reference?
短版使用===而不是==
答案 5 :(得分:0)
据我了解,===
检查对象的身份。 Javascript的字符串是不可变的,所以当您说
var x = "string"
vay y = "string"
x和y实际上引用内存中的同一对象。因此,不幸的是,您想要的是不可能的。符号提供此功能:
Symbol('x') === Symbol('x') // => false