我应该使用一个空的财产关键?
我已经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']
如果你想有null
和undefined
使用''
键,你可能需要使用一个回退:
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时,这可能只会导致混淆,但是为了防止您只能使用不同的视觉样式作为“未知状态”输出文本。