我仅在Firefox中对此进行了测试,但显然您可以使用空字符串作为对象中属性的键。例如,请在此处查看第一个属性:
var countsByStatus = {
"": 23, //unknown status
"started": 45,
"draft": 3,
"accepted": 23,
"hold": 2345,
"fixed": 2,
"published": 345
}
在浏览EcmaScript规范时,似乎(至少在5中),属性键被定义为字符串,字符串被定义为0或更多字符。这意味着根据规范,空字符串是有效的属性名称。
无论如何,我很想在一段代码中使用它,我会根据数据项的状态计算一些计数的摘要(类似于我上面所示)。有些项目可能没有状态,我需要一个占位符。由于状态是用户可定义的,我不想冒险使用可能存在冲突的虚拟词。
看起来如此简单和优雅,在查看数据时,我可以很容易地判断出空白字符串的含义。它还使代码更有效,因为空字符串将是没有状态的项目中状态的确切值。
但与此同时,我的直觉告诉我它出了问题。我的意思是,除了某些浏览器可能不支持这种情况的机会之外,我觉得我在JavaScript中遇到了一个将在某天修复的错误。但是,与此同时,我曾经对我现在每天使用的许多其他JavaScript功能产生了同样的感觉(例如我发现&&和||返回其中一个操作数的值的时间,不仅仅是真或假。)
答案 0 :(得分:23)
对象的键必须是字符串,空字符串(''
)是字符串。没有跨浏览器问题,我曾经遇到空字符串,尽管很少有人认为使用空字符串作为键名是可以接受的。
我会阻止 ''
作为键的一般用法,但对于简单的查找,它会工作得很好,听起来很合理。这是一个添加注释的好地方,注意到特殊情况。
此外,在查找过程中,您可能会遇到强制转换为字符串的值的问题:
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'
。
在大多数情况下,我发现我从散列表对象中选择了一个预定义的值。要检查对象上是否存在该值,有许多选项:
//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)) {...}
答案 1 :(得分:12)
从技术上讲,没有任何问题,你可以在任何js引擎上保存它(我知道)。由于ECMAscripts规范说任何对象键都是字符串,它当然也可以是一个空字符串。
唯一需要注意的是,您将永远无法使用点符号
访问该属性countsByStatus.;
当然会导致语法错误,所以它总是需要
countsByStatus[''];
关于技术部分。如果我们谈论这个方便的部分,我会投票给一个非常明确的不,从不使用它。
这会导致混乱,众所周知,混淆是敌人。
答案 2 :(得分:3)
问题在于,由于状态是用户可定义的,因此没有任何东西可以阻止用户使用空字符串作为状态 ,从而破坏了您的逻辑。从这个角度来看,你所做的事情与使用像__$$unknown_status
这样丑陋的自定义名称没有区别。 (好吧,我会说丑陋的自定义名称更具描述性,但每个人都有自己的......)
如果你想确定“未知”属性不会发生碰撞,你需要将它分开:
var counts = {
unknownStatus: 23,
byStatus: {
"": 17, //actual status with no name, (if this makes sense)
"started": 45,
"draft": 3,
"accepted": 23,
"hold": 2345,
"fixed": 2,
"published": 345
}
};
答案 3 :(得分:2)
我认为没关系。 ""
在您的应用程序中具有语义及其有效的javascript。就这样了。
请注意
x."" = 2;
会出错,所以你需要使用像
这样的语法 x[""] = 2;
答案 4 :(得分:0)
“未知状态”是否为空值,或者您的状态字段是“非空”?
在第一种情况下,我会说你将不得不使用一个单独的计数器,在第二种情况下我会说“空”是一个完全有效的状态 - 只需使用“未知”这个词来代替“” 。当您的用户使用相同的单词作为状态类型时,这可能只会导致混淆,但是为了防止您只能使用不同的视觉样式来处理“未知状态”输出文本。