javascript - 我应该使用一个空的属性键吗?

标签 javascript

我只在 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']

如果你想让 nullundefined 使用 '' 键,你可能需要使用回退:

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/

相关文章:

javascript - 无法将下拉值传递给 XSLT 参数

Javascript window.close() 和 window.stop() 逻辑还是技术?

javascript - socket.io 向服务器发送轮询请求

javascript - react Hook : updating state using useState does not update the state immediately

Javascript 函数仅在事件发生时被调用!

javascript - 在 Javascript 中解析 Giphy API JSON

javascript - JS Office Outlook 加载项 : get email as a file or just all email data

javascript - Angular : get input values in js function

javascript - 标题消息就像在 Stack Overflow 中一样

javascript - 进度条无法正常工作