为啥定义带或不带引号的 JavaScript 对象字面量会有所不同? [复制]

Posted

技术标签:

【中文标题】为啥定义带或不带引号的 JavaScript 对象字面量会有所不同? [复制]【英文标题】:Why is there a difference in defining a JavaScript object literal with or without quotations marks? [duplicate]为什么定义带或不带引号的 JavaScript 对象字面量会有所不同? [复制] 【发布时间】:2013-09-14 09:49:32 【问题描述】:

在纯 javascript 中,MDN 和 Google JavaScript style guide 表明以下两个 sn-ps 是等效的:

// Snippet one
var myObject = 
  "test":"test"


// Snippet two
var myObject = 
  test:"test"

但是,JSON 规范要求使用引号。

在定义对象字面量时何时使用引号是正确的(如果有的话)?它是否暗示/对口译员有任何影响?

我编写了一个测试函数,它使用performance.now() (MDN) 来测量创建一百万个简单对象所需的时间:

function test(iterations) 
  var withQuotes = [];
  var withoutQuotes = [];

  function testQuotes() 
      var objects = [];
      var startTime, endTime, elapsedTimeWithQuotes, elapsedTimeWithoutQuotes;

      // With quotes
      startTime = window.performance.now();

      for (var i = 0; i < 1000000; i++) 
          objects[objects.length] = 
              "test": "test"
          ;
      

      endTime = window.performance.now();
      elapsedTimeWithQuotes = endTime - startTime;

      // reset
      objects = undefined;
      startTime = undefined;
      endTime = undefined;
      objects = [];

      // Without quotes
      startTime = window.performance.now();

      for (var i = 0; i < 1000000; i++) 
          objects[objects.length] = 
              test: "test"
          ;
      

      endTime = window.performance.now();
      elapsedTimeWithoutQuotes = endTime - startTime;

      return 
          withQuotes: elapsedTimeWithQuotes,
          withoutQuotes: elapsedTimeWithoutQuotes
      ;
    

  for (var y = 0; y < iterations; y++) 
      var result = testQuotes();
      withQuotes[withQuotes.length] = result.withQuotes;
      withoutQuotes[withoutQuotes.length] = result.withoutQuotes;

      console.log("Iteration ", y);
      console.log("With quotes: ", result.withQuotes);
      console.log("Without quotes: ", result.withoutQuotes);
  

  console.log("\n\n==========================\n\n");
  console.log("With quotes average: ", (eval(withQuotes.join("+")) / withQuotes.length));
  console.log("Without quotes average: ", (eval(withoutQuotes.join("+")) / withoutQuotes.length));


test(300);

我得到的结果表明使用引号(略微)更快。为什么会这样?

在我的浏览器上,我从我的测试函数中得到这些结果,(平均超过 300 次迭代):

带引号:167.6750966666926ms不带引号:187.5536800000494ms

当然,我的测试功能很可能也很糟糕......

【问题讨论】:

好吧,如果您查看单个结果,它们是完全随机的,所以是的,这是测试功能损坏 【参考方案1】:

属性的名称可以是任何字符串,包括空字符串。这 对象文字中属性名称的引号是可选的,如果 该名称将是合法的 JavaScript 名称,而不是保留字。所以 "first-name" 周围需要引号,但周围是可选的 名字

来源:Douglas Crockford 的“JavaScript:好的部分”。

【讨论】:

以上是关于为啥定义带或不带引号的 JavaScript 对象字面量会有所不同? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用带或不带 cognito 的 aws api 网关的联合身份的轻量级 rbac

带或不带`.min`的样式表参考

使用带或不带括号的 python 装饰器

带或不带存储库的 NHibernate

-XX:MaxPermSize 带或不带 -XX:PermSize

使用参考值作为参数,带或不带“ref”? [复制]