我应该使用一个空的财产关键?

我已经testing过这只在Firefox中,但显然你可以使用一个空string作为对象的属性的关键。 例如,请参阅这里的第一个属性:

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

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

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

看起来如此简单和优雅,在查看数据时我可以很容易地知道空白string的含义。 它也使得代码效率更高一些,因为空string将是没有状态的项目中状态的精确值。

但同时,我的直觉告诉我,这是错的。 我的意思是,除了一些浏览器可能不支持这个的机会之外,我觉得我已经遇到了JavaScript中的一个错误,有一天会被修复。 但与此同时,我也曾经对我现在每天使用的其他JavaScriptfunction有过同样的感觉(例如,当我发现&&和||返回其中一个操作数的值,而不是对或错)。

一个对象的键必须是一个string,空string( ''一个string。 没有跨浏览器的问题,我曾经遇到空string,虽然有很less的情况下,我认为这是可以接受的使用空string作为关键名称。

我会劝阻一般用法作为一个关键,但对于一个简单的查找,它会工作得很好,听起来是合理的。 这是一个很好的地方,添加评论注意到特殊情况。

另外,在查找过程中,可能会将值转换为string:

 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 || ''; 

如果您可能传入了非string值,则也必须执行以下操作:

 key = key || ''; key = '' + key; 

请注意,值0将变成'' ,而值'0'将保持为'0'


在大多数情况下,我发现我select了一个预定义的值 哈希表 目的。 要检查对象上存在的值是否有多个选项:

 //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)) {...} 

从技术上讲,没有什么错,你可以在任何js引擎(我知道)中保存使用它。 由于ECMAscripts规范说任何对象键是一个string ,它当然也可以是一个空string。

唯一的警告是,你将永远无法用点符号访问该属性

 countsByStatus.; 

当然会导致语法错误,所以总是需要

 countsByStatus['']; 

这很多关于技术部分。 如果我们谈论这个方便的部分,我会投赞成票,否决权。

这会导致混乱,众所周知, 混乱是敌人

问题是由于状态是用户可定义的,所以没有任何东西阻止用户使用空string作为状态,从而破坏了你的逻辑。 从这个angular度来看,你正在做的是没有什么不同,然后只使用一个丑陋的自定义名称,如__$$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 } }; 

我认为没关系。 ""在您的应用程序中具有语义,并且其有效的JavaScript。 所以有它。

注意

x."" = 2;

会出错,所以你需要使用类似的语法

x[""] = 2;

“未知状态”为空值还是您的状态字段为“非空”?

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