2017-01-31 58 views
-2

我正在尋找一種方法來檢查兩個變量是否引用JavaScript中的同一個對象。如果兩個變量引用同一個對象在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?因爲它使用全等運算符(===)不VARS指向相同串的2個實例2之間區分不回答這個問題。

+2

??當兩個變量引用同一個對象時,你的代碼100%正確地告訴你。有什麼問題? – Pointy

+1

還有'testSame()'的代碼在哪裏? – Pointy

+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); 
 
}

+0

到目前爲止,似乎確實沒有辦法用字符串來做到這一點。 – Coyote

+0

@Coyote是正確的 - 它在JavaScript中甚至沒有意義,認爲兩個相同的字符串是不同的。這就好比想要知道一個變量設置爲數字5是否與另一個變量設置爲數字5不同。 – Pointy

1

=====會做的伎倆你,從一個很短的控制檯測試:

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 
+0

不幸的是,等式運算符不能解決手邊的問題,嚴格的相等運算符也不能解決問題。 – Coyote

+0

所以你真的想比較字符串?或參考? – ospfranco

+0

如果您想按值比較字符串:http://www.w3schools.com/jsref/jsref_localecompare.asp – ospfranco

0

這一個是在這個問題上已經回答: How to check if two vars have the same reference?

短版使用===代替==

+0

不是,它不是'r === s'返回'true' 'false'。 – Coyote

+0

但r和s是相同的對象===檢查對象是否相同且類型相同。但是檢查對象是否相同的目的是什麼?這是主要問題; –

1

以下是工作原理。首先,在此代碼:

var a = {foo:"bar"}; 
var b = {foo:"bar"}; 

變量ab與引用初始化爲兩個不同的對象。因此,與=====的比較將報告它們不同(即不相等)。

這裏,但是:

var a = "some string"; 
var b = "some string"; 

兩個變量被初始化爲指的是相同的字符串。 JavaScript中的字符串值是而非對象 —它們是原語。因此ab=====之間的比較將因此返回true,因爲字符串是相同的。這是完全一樣的東西本來如果變量已經初始化是這樣的:

var a = 17; 
var b = 17; 

數字和字符串是原始類型,所以比較的是原語的語義值。但是,對象是而不是基元,並且對象的比較基於對象標識。

在JavaScript語義域中,它想要知道指向同一個相同字符串的兩個變量是否指向同一個字符串的兩個不同表達式,這實際上是無意義的,正如無意中想要知道的那樣是否有一個17與另一個不同。