为什么可以';你不能将条件表达式传递给Javascript散列键吗?

为什么可以';你不能将条件表达式传递给Javascript散列键吗?,javascript,Javascript,为什么不能将表达式传递给Javascript哈希键 设o={ 一:十二,, 二:二十三,, 3:90 } console.log( o['foo'| | one'] )在这里,您的代码将首先计算('foo'| |'one')//这是foo,然后尝试访问o的未定义属性 您可能想做的是: o['foo'] || o['one'] 在您的代码中,始终返回null,因为始终查找“foo”,因为它是一个具有多个位的字符串,并且被认为是true,所以它将查找其在对象中的第一个位置,并返回未定义的 这是一

为什么不能将表达式传递给Javascript哈希键

设o={
一:十二,,
二:二十三,,
3:90
}
console.log(
o['foo'| | one']

)
在这里,您的代码将首先计算
('foo'| |'one')//这是foo
,然后尝试访问
o
的未定义属性

您可能想做的是:

o['foo'] || o['one']

在您的代码中,始终返回null,因为始终查找“foo”,因为它是一个具有多个位的字符串,并且被认为是true,所以它将查找其在对象中的第一个位置,并返回未定义的

这是一个非常重要的问题:

此表格由阿尔贝托·里维拉(第一条评论)向您展示。

第二个选项是使用一种方法来验证对象中是否存在索引,并返回第一个位置,如下例所示:

let o = {
    one: 12,
    two: 23,
    three: 90
}

let validate = a => a.filter(v => v in o)[0]

console.log(
  o[validate(['foo', 'one'])]
);

在最后一种情况下,您将始终返回在对象中找到的第一个值,但总而言之,您这样做的方式是不正确的,因为“foo”将始终为true,因为您没有指示在对象中查找该值。

因为检查与该值无关。它正在检查'foo'
o['foo'| |'one']
的真实性,该值计算为
o['foo']
未定义,因为
o
没有属性
foo
。这是因为
'foo'
是真的,确切地说,'foo'将始终是真的,但当您在其索引中搜索它时,它是未定义的,因为之前没有定义,在这种情况下,它必须有一些“内部搜索”以下索引的方法,如我的注释所示。
let o = {
    one: 12,
    two: 23,
    three: 90
}

let validate = a => a.filter(v => v in o)[0]

console.log(
  o[validate(['foo', 'one'])]
);