我应该使用空的属性键吗?

时间:2011-12-01 15:34:29

标签: javascript

我仅在Firefox中对此进行了测试,但显然您可以使用空字符串作为对象中属性的键。例如,请在此处查看第一个属性:

var countsByStatus = { 
  "": 23, //unknown status
  "started": 45,
  "draft": 3,
  "accepted": 23,
  "hold": 2345,
  "fixed": 2,
  "published": 345
}

在浏览EcmaScript规范时,似乎(至少在5中),属性键被定义为字符串,字符串被定义为0或更多字符。这意味着根据规范,空字符串是有效的属性名称。

无论如何,我很想在一段代码中使用它,我会根据数据项的状态计算一些计数的摘要(类似于我上面所示)。有些项目可能没有状态,我需要一个占位符。由于状态是用户可定义的,我不想冒险使用可能存在冲突的虚拟词。

看起来如此简单和优雅,在查看数据时,我可以很容易地判断出空白字符串的含义。它还使代码更有效,因为空字符串将是没有状态的项目中状态的确切值。

但与此同时,我的直觉告诉我它出了问题。我的意思是,除了某些浏览器可能不支持这种情况的机会之外,我觉得我在JavaScript中遇到了一个将在某天修复的错误。但是,与此同时,我曾经对我现在每天使用的许多其他JavaScript功能产生了同样的感觉(例如我发现&&和||返回其中一个操作数的值的时间,不仅仅是真或假。)

5 个答案:

答案 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']

如果您希望nullundefined使用''密钥,则可能需要使用后备:

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)

“未知状态”是否为空值,或者您的状态字段是“非空”?

在第一种情况下,我会说你将不得不使用一个单独的计数器,在第二种情况下我会说“空”是一个完全有效的状态 - 只需使用“未知”这个词来代替“” 。当您的用户使用相同的单词作为状态类型时,这可能只会导致混淆,但是为了防止您只能使用不同的视觉样式来处理“未知状态”输出文本。