我只在Firefox中对此进行了测试,但显然您可以使用空字符串作为对象中属性的键.例如,请在此处查看第一个属性:
var countsByStatus = {
"": 23, //unknown status
"started": 45,
"draft": 3,
"accepted": 23,
"hold": 2345,
"fixed": 2,
"published": 345
}
Run Code Online (Sandbox Code Playgroud)
在浏览EcmaScript规范时,似乎(至少在5中),属性键被定义为字符串,字符串被定义为0或更多字符.这意味着根据规范,空字符串是有效的属性名称.
无论如何,我很想在一段代码中使用它,我在计算数据项状态的一些计数摘要(类似于我上面所示).有些项目可能没有状态,我需要一个占位符.由于状态是用户可定义的,我不想冒险使用可能冲突的虚拟词.
它看起来如此简单和优雅,在查看数据时我可以很容易地判断空字符串是什么意思.它还使代码更有效,因为空字符串将是没有状态的项目中状态的确切值.
但与此同时,我的直觉告诉我它出了问题.我的意思是,除了某些浏览器可能不支持这种情况的机会之外,我觉得我在JavaScript中遇到了一个将在某天修复的错误.但是,与此同时,我曾经对我现在每天使用的许多其他JavaScript功能产生了同样的感觉(例如我发现&&和||返回其中一个操作数的值的时间,而不仅仅是对或错).
zzz*_*Bov 24
对象的键必须是字符串,空字符串('')是字符串.没有跨浏览器问题,我遇到过空字符串,尽管很少有人认为使用空字符串作为键名是可以接受的.
我会劝阻''作为键的一般用法,但对于简单的查找,它会工作得很好,听起来很合理.这是一个添加注释的好地方,注意到特殊情况.
此外,在查找期间,您可能会遇到强制转换为字符串的值的问题:
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']
Run Code Online (Sandbox Code Playgroud)
如果您想拥有null并undefined使用''密钥,则可能需要使用后备:
key = key || '';
Run Code Online (Sandbox Code Playgroud)
如果您可能传入了非字符串值,那么投射也很重要:
key = key || '';
key = '' + key;
Run Code Online (Sandbox Code Playgroud)
请注意,值0将变为'',而值'0'将保持不变'0'.
在大多数情况下,我发现我从a中选择了一个预先定义的值 哈希表宾语.要检查对象上是否存在该值,有许多选项:
//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)) {...}
Run Code Online (Sandbox Code Playgroud)
jAn*_*ndy 12
从技术上讲,没有任何问题,你可以在任何js引擎上保存它(我知道).由于ECMAscripts规范说任何对象键都是一个字符串,它当然也可以是一个空字符串.
唯一需要注意的是,您将永远无法使用点表示法访问该属性
countsByStatus.;
Run Code Online (Sandbox Code Playgroud)
当然会导致语法错误,所以它总是需要
countsByStatus[''];
Run Code Online (Sandbox Code Playgroud)
关于技术部分.如果我们谈论这个方便的部分,我会投票给一个非常明确的否,永远不要使用它.
它会导致混乱,众所周知,混乱是敌人.