【问题标题】:Default values for objects in JavascriptJavascript 中对象的默认值
【发布时间】:2012-05-01 08:59:42
【问题描述】:

Javascript 代码

var a = {};
a.test += 1; //NaN
++a.test; //NaN

相反

var a = {};
a.test = 0;
++a.test; //1
a.test += 1; //2

我想知道是否有任何方法可以使第一个代码示例与第二个代码示例一样工作,即没有显式分配给 0。就像将对象的任何属性的默认值分配给 0 而不是 undefined。我正在尝试在 node.js 中执行此操作。所以,跨浏览器的东西和旧的 ECMA 规范没有问题。

var i;
for(i = 0; i<10; i++) {
   if(a.test) {
     ++a.test;
   } else {
     a.test = 0;
     ++a.test;
   }
   //a.test = a.test || 0; (1)
   //++a.test;
}

如果可能的话,上面代码中的内部if/else或者赋值语句(1)可以去掉。

【问题讨论】:

  • 有什么理由不能简单地使用var a = {test: 0};
  • @outis 属性是动态生成的。你甚至可以考虑 var a = [];一个[0]++;这里无法预先确定数组的大小
  • 如果a.test === false"" 会发生什么? a.hasOwnProperty("test") 如果您试图确定该属性是否存在,这样做会更安全

标签: javascript node.js object


【解决方案1】:

默认情况下,Javascript 将所有新变量定义为未定义(如果未明确定义),这与您尝试定义的 Number 对象不同。所以你应该像这样使用:

for (i=0; i<10; i++) {
    a.test = a.test || 0;
    ++a.test
}

【讨论】:

  • 我只在我的代码中提到了你的答案。见第 3 段代码 sn-p 中的注释
  • 如果您希望始终定义默认的 a.test,您应该使用原型/类对象,正如我提到的,如果某些东西没有明确定义为数字、字符串等。它是未定义的
【解决方案2】:

没有办法对任意未定义的属性执行此操作。

对于已知的属性名称,一种方法,但是不要使用它!! 1

Object.prototype.test = 0;

这将为每个对象提供一个隐含的.test属性,其中包含该值,并且当您第一次尝试修改它时,结果将存储在您自己的对象中:

> Object.prototype.test = 0
> a = {}
> a.test++
> a.test
1

1Object.prototype 添加内容会破坏内容,包括for (key in obj)

【讨论】:

    【解决方案3】:

    这就是原型在 javascript 中派上用场的地方:

    function Demo() {
    }
    Demo.prototype.x = 0;
    

     

    > a = new Demo();
    > a.x += 1
    > a.x
    1
    

     

    > b = new Demo()
    > b.x
    0
    

    【讨论】:

    • @mihai yup,就像我的回答一样,因为 如果您不知道房产名称,就没有办法
    【解决方案4】:

    在第一个代码中,你不能。添加到非数字或 NaN 值的任何数字将始终导致 NaN

    var a = {};
    a.test += 1; // undefined + 1 = NaN
    ++a.test;    // ++(undefined) = NaN
    

    内部if

    for(i = 0; i<10; i++) {
       a.test = a.test || 0; //use existing value, or if undefined, 0
       ++a.test;             //increment
    }
    

    【讨论】:

      【解决方案5】:

      我认为这样可以:

      var a = {"test":0};
      a.test += 1; 
      

      【讨论】:

      • OP 不想显式声明/初始化测试
      【解决方案6】:

      使用标准 JS 不可能做到你所要求的。除非你原型我猜?但我对 Prototype 没有经验。而且我认为原型设计不适用于 Node.js

      之所以会这样是因为js不是类型化语言(即我们只使用var来声明一个变量,而不是int a或string b),所以为了使用++运算符,需要给变量通过赋值的类型。

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2014-08-12
        • 1970-01-01
        • 2018-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-24
        • 2016-08-15
        相关资源
        最近更新 更多