我只在 Firefox 中对此进行了测试,但显然您可以使用空字符串作为对象中属性的键。例如,在此处查看第一个属性:
var countsByStatus = {
"": 23, //unknown status
"started": 45,
"draft": 3,
"accepted": 23,
"hold": 2345,
"fixed": 2,
"published": 345
}
在浏览 EcmaScript 规范时,似乎(至少在 5)中,属性键被定义为字符串,而字符串被定义为 0 个或多个字符。这意味着根据规范,空字符串是有效的属性名称。
无论如何,我很想在一段代码中使用它,在这段代码中我根据数据项的状态计算某些计数的摘要(类似于我上面显示的内容)。有些项目可能没有状态,我需要一个占位符。由于状态是用户可定义的,我不想冒险使用可能会发生冲突的虚拟词。
它看起来如此简单和优雅,在查看数据时我可以很容易地判断出空白字符串是什么意思。它还使代码更加高效,因为空字符串将是没有状态的项目中状态的确切值。
但与此同时,我的直觉告诉我它有问题。我的意思是,除了某些浏览器可能不支持这一点之外,我觉得我遇到了 JavaScript 中的一个错误,总有一天会被修复。但是,与此同时,对于我现在每天使用的许多其他 JavaScript 功能,我曾经有过同样的感觉(例如我发现 && 和 || 返回其中一个操作数的值,而不仅仅是真或假)。
最佳答案
一个对象的键必须是一个字符串,空字符串(''
)是一个字符串。我从来没有遇到过空字符串的跨浏览器问题,尽管在极少数情况下我认为使用空字符串作为键名是可以接受的。
我会劝阻将 ''
作为键的一般用法,但对于简单的查找,它会工作得很好,而且听起来很合理。这是添加注释以说明特殊情况的好地方。
此外,在查找过程中,您可能会遇到转换为字符串的值的问题:
o = {...} //some object
foo = 'bar';
//some examples
o[foo] //will return o['bar']
o[null] //will return o['null']
o[undefined] //will return o['undefined']
如果你想让 null
和 undefined
使用 ''
键,你可能需要使用回退:
key = key || '';
如果您可能传入了非字符串值,那么转换也很重要:
key = key || '';
key = '' + key;
请注意,0
的值将变为 ''
,而 '0'
的值将保持为 '0 '
.
在大多数情况下,我发现我是从 hashtable 对象中选择一个预定义的值。要检查该值是否存在于对象上,有多种选择:
//will be falsey if the value is falsey
if (o[key]) {...}
//will return true for properties on the object as well as in the prototype hierarchy
if (key in o) {...}
//returns true only for properties on the object instance
if (o.hasOwnProperty(key)) {...}
关于javascript - 我应该使用一个空的属性键吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8343938/