【问题标题】:Declaring variables without a value声明没有值的变量
【发布时间】:2013-03-20 12:31:53
【问题描述】:

我希望创建一个带有嵌套变量的 Javascript 对象,其中一些变量没有指定默认值。

我目前有这个:

var globalVarA = "foo";
var globalVarB = "bar";
var globalVarC;

function myFunction(){
  //do something
}

我希望将其更改为:

var myObject = {
  GlobalVars: {
     globalVarA: "foo",
     globalVarB: "bar",
     globalVarC
  },
  myFunction: function(){
     //do something
  }
}

但是我得到以下错误:

预期的':'

如何在没有值的情况下声明这个变量?

这是最佳做法还是有其他更好的解决方案?

【问题讨论】:

    标签: javascript variables global-variables


    【解决方案1】:

    如果您想将变量定义为 GlobalVars 的属性,您必须明确地将 undefined 分配给它们

    GlobalVars: {
         globalVarA: "foo",
         globalVarB: "bar",
         globalVarC: undefined
      },
    

    您的代码包含无效的符号,当使用对象文字符号时,您必须为每个变量指定一个值。这与 XML 或 formParams 等其他表示法不同,您可以在不设置的情况下声明属性/属性。

    请注意,在我的解决方案中,未定义的变量确实有一个默认值 - 该值只是原始值 undefined,这是未定义变量默认返回的值。

    但是,如果您执行globalVarC: undefined

    ,您的变量确实会被定义
    GlobalVars.globalVarC;//undefined
    GlobalVars.globalVarX;//undefined
    GlobalVars.hasOwnProperty("globalVarC");//true
    GlobalVars.hasOwnProperty("globalVarX");//false
    

    来自spec

    4.3.9 未定义值:

    当变量没有被赋值时使用的原始值。

    【讨论】:

    • 只是旁注。在需要之前不声明 globalVarC 会有什么缺点?由于您可以设置 `GlobalVars.globalVarC = "whatever";'即使没有声明。
    • @TimBJames 这是一个很好的问题。例如,差异可能在hasOwnProperty 检查中表示。就个人而言,如果它只是用于该函数,在我自己的代码中我会做GlobalVars.globalVarC 而不是明确地将其设置为未定义。
    • 是的,我可能也会选择,因为如果您要检查变量是否存在,您会检查if ( GlobalVars.globalVarC != undefined),无论哪种方式都是如此。
    【解决方案2】:

    您需要为 globalVarC 指定一个值,否则 json 的 javascript 语法将是错误的,因为您没有任何要初始化的值,您可以指定值 undefined

    undefined 是一个具有原始值undefined的全局变量。

    var myObject = {
      GlobalVars: {
         globalVarA: "foo",
         globalVarB: "bar",
         globalVarC: undefined
      },
      myFunction: function(){
         //do something
      }
    }
    

    【讨论】:

      【解决方案3】:

      您希望undefined 原始值成为默认值:

      var myObject = {
        GlobalVars: {
           globalVarA: "foo",
           globalVarB: "bar",
           globalVarC: void 0
        },
        myFunction: function(){
           //do something
        }
      }
      

      void 0 表达式给出了undefined 的值,无论undefined 是否被“重新路由”。

      【讨论】:

      • 只是想知道.. 这不是在值 0 上调用 JS 编译器吗?我从来没有真正明白为什么你会改变 undefined 的值。按照同样的思路,可以更改 Function.prototype.call 的值。您会自己在生产代码中执行此操作吗?它提供了哪些优势?我希望这不会显得咄咄逼人,我真的很想知道你为什么要这样做。
      • @BenjaminGruenbaum “在值 0 上调用编译器”是什么意思?至于更改undefined,肯定没有人有任何理由这样做;-)
      • void 运算符在以下表达式上调用 JavaScript 编译器(在本例中,0 被强制转换为 "0" 并返回 undefined)。 developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/… 。在这种情况下,调用编译器似乎有点极端。即使globalVarC: (function(){var a;return a;})() 看起来更干净。我会做一个表演:)
      • @BenjaminGruenbaum (function(a) { return a; }()); 更短,但我怀疑使用 void 会出现任何性能问题:)
      • 令我惊讶的是,void 实际上比 chrome 中的匿名函数要快 :) 我想告诉你
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多