2017-07-25 17 views
2

使用JavaScript,有間差Vs'Y [X]`

let foo = { 
    a: true, 
    b: false, 
    c: true 
} 

'c' in foo 

and 

foo['c'] 

? 

總想知道的是,不知道如何尋找答案在性能或行爲方面的任何差異。唯一明顯的區別是,如果'c'指向falsy值,則foo['c']將返回false,如果foo具有'c'鍵,則'c' in foo將返回true。

我之所以提出這樣的問題:

在許多情況下,我想只存儲一個鍵(快速搜索),我不關心的值:

let foo = { // the keys are important, values of no consequence 
     a: undefined, 
     b: undefined, 
     c: undefined 
    } 

我想知道是否僅僅存儲密鑰是最佳做法,甚至沒有分配值。

if(!('a' in foo)){ 
    foo['a'] = undefined; 
} 

它只是似乎很奇怪給哈希的任何值,當我不需要使用的值,我只需要存儲的關鍵。

+1

最簡單的方法是通過https://jsperf.com/ – frozen

+0

權利創建測試,但除了B的情況下(這是我所描述的)是有在查找時間或差還要別的嗎? –

+3

「明顯的區別」是不同的,是的,這是非常重要的。誰在乎他們做不同事情時的查找時間?使用符合正確含義的檢查。 – Ryan

回答

3

你回答與

唯一明顯的區別你自己的問題是,富[「C」]將返回false,如果「C」指向falsy值,其中爲「C」的foo將返回如果foo具有鍵'c',則返回true。

'c' in foo 

檢查是否有一個foo中命名爲 'C' 鍵

foo['c'] 

返回其值

2

雖然這可能已經足夠在評論中回答,這不是他們想要的,所以這是一個適當的建議:使用Set()

不同對象,它們支持所有串鑰匙,甚至是那些喜歡"__proto__""hasOwnProperty"(如果您關心使用這些)。

另外,它們還支持鍵的其他類型。特別感興趣的是使用非基元作爲鍵,並且也是NaN,這是特殊的,因爲它不等於它自己。

let lookup = new Set() 
 

 
console.log('arbitrary strings:') 
 

 
lookup.add('__proto__') 
 
lookup.add('hasOwnProperty') 
 

 
checkHas('__proto__') 
 
checkHas('hasOwnProperty') 
 

 
lookup.add(5) 
 
lookup.add(NaN) 
 

 
console.log('other types:') 
 

 
checkHas(5) 
 
checkHas(NaN) 
 

 
const myObject = {} 
 

 
lookup.add(myObject) 
 

 
console.log('some arbitrary object:') 
 

 
checkHas({}) 
 

 
console.log('myObject:') 
 

 
checkHas(myObject) 
 

 
lookup.add(myObject) 
 

 
function checkHas(key) { 
 
    console.log(key, lookup.has(key)) 
 
}
.as-console-wrapper { 
 
    max-height: 100% !important; 
 
}