1

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)。

4

6 回答 6

4

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

for (i=0; i<10; i++) {
    a.test = a.test || 0;
    ++a.test
}
于 2012-05-01T09:05:49.547 回答
3

对于任意未定义的属性,没有办法做到这一点。

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

Object.prototype.test = 0;

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

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

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

于 2012-05-01T09:06:43.573 回答
1

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

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

 

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

 

> b = new Demo()
> b.x
0
于 2012-05-01T09:07:26.060 回答
0

在第一个代码中,你不能。添加到非数字或 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
}
于 2012-05-01T09:03:41.120 回答
0

我认为这样做可以:

var a = {"test":0};
a.test += 1; 
于 2012-05-01T09:16:41.913 回答
-1

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

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

希望有帮助

于 2012-05-01T09:07:09.977 回答