我正在开发一个dojo项目,偶然发现下面的代码:
format: function ( /*Date*/ value, /*locale.__FormatOptions*/ constraints) {
....
},
"parse": function ( /*String*/ value, /*locale.__FormatOptions*/ constraints) {
.....
},
如您所见,解析方法名称是一个字符串。我之前没见过这样的东西。这样做有什么理由吗?
答案 0 :(得分:1)
根据JavaScript / ECMAScript标准,对象属性(或函数)标识符(在示例中的冒号:
之前使用)可以是任何有效 标识符(例如format
没有引号),任何字符串(如"parse"
)甚至任何数字。
在这种情况下使用"parse"
与使用parse
完全等效,但在"parse that value"
的情况下会有所不同,myObject.parse
是对象的有效字符串标识符属性,即使它有空格!
然后,您可以使用myObject["parse"]
或myObject["parse that value"]
来访问您的媒体资源,而在我的上一个示例中,您别无选择,只能使用for (var i in myObject) {
if (i === "parse") { // if i is replaced by the minifier, you will never execute the block below
// do something...
}
}
来访问它。
我认为我们还应该提到一个特定的情况,即使用对象键的引号与不带引号不同:如果您在ADVANCED_OPTIMIZATIONS模式下使用Google Closure minifier,它将替换< / strong>任何未引用的标识符可以尝试节省空间,而它会保留完整的带引号的标识符,因为Google团队将此作为指示符,您将尝试稍后使用方括号方法和字符串访问它,或者如果您检查实际的密钥名称,如下所示:
var httpHeadersToAdd= {
'User-Agent': 'whatever',
Date: new Date()
};
这种特殊性迫使您有时使用带引号的标识符(但并非总是如果您不需要保留原始名称)是推动人们不使用此高级优化模式的原因之一。
答案 1 :(得分:0)
我认为没有理由使用额外的报价。
JSON需要它,但你的对象文字不是JSON。 ES3对关键字要求此项,但parse
从未成为关键字。
答案 2 :(得分:0)
在这种特殊情况下,没有理由这样做,但我遇到了需要使用引号来定义元素的场景。例如:
User
如果没有引号,解释器会理解您正在尝试使用变量Agent
和SyntaxError: Unexpected token -
进行减法运算,并抛出语法错误var obj= {
'my-function': function (){}
}
obj['my-function']();
。可以使用函数进行相同的操作,然后必须使用括号调用它们:
public static class SpanNearQueryDescriptorExtensions
{
public static void SpanTermClauses<T>(this SpanNearQueryDescriptor<T> descriptor, Expression<Func<T, object>> field, string[] terms)
where T : class
{
descriptor.Clauses(terms
.Select(t => new Func<SpanQuery<T>, SpanQuery<T>>(query => query.SpanTerm(field, t)))
.ToArray());
}
}
回到你链接的代码,也许有人用JSON-ish的方式写了这个,因为这就是JSON字符串的样子(双引号在JSON中是强制性的,单引号不起作用)