`y in y` vs`y [x]`之间的区别

时间:2017-07-25 19:36:07

标签: javascript node.js object dictionary hash

使用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;
 }

给哈希值任意值似乎很奇怪,当我不需要使用值时,我只需要存储一个键。

2 个答案:

答案 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;
}