使用JavaScript,
之间在性能或行为方面是否存在差异let foo = {
a: true,
b: false,
c: true
}
'c' in foo
and
foo['c']
?
总是想知道,不知道如何搜索答案。唯一明显的区别是foo['c']
会返回false,如果' c'指向一个假值,如果foo有键'那么'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;
}
给哈希值任意值似乎很奇怪,当我不需要使用值时,我只需要存储一个键。
答案 0 :(得分:3)
你用
回答你自己的问题唯一明显的区别是,如果'c'指向假值,foo ['c']将返回false,如果foo具有键'c',则foo中的'c'将返回true。
'c' in foo
检查foo中是否存在名为“c”的键
和
foo['c']
返回其值
答案 1 :(得分: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;
}