27

我喜欢那些简短的 js oneliners。我想知道是否有一些合乎逻辑和优雅的东西:

  • 如果未定义,则将变量初始化为零
  • 否则加一。

最好比这个短;)

var obj = {} ; 

//some iterative called function
obj.prop = obj.prop===undefined?0:obj.prop++;
4

6 回答 6

51

这将导致NaN第一个增量,默认为0.

obj.prop = ++obj.prop || 0;
于 2012-11-08T21:38:04.940 回答
39

一种更清洁的方法很简单

obj.prop = obj.prop + 1 || 0;

使用增量运算符是错误的或矫枉过正。后缀运算符 , x++(问题中的示例)根本不应该工作。前缀 ,++x导致分配两次(比如说x = x = x+1

于 2014-12-10T14:43:45.413 回答
1

更短的解决方案:obj.prop = -~obj.prop

于 2016-12-10T21:30:45.700 回答
1

无法直接将变量传递给函数 inc(obj.prop),因为在 javascript 中变量是按值传递的,但您可以传递对象本身以及要递增的变量的名称。

Object.prototype.inc = function(n){ this[n]? this[n]++ : this[n] = 1; }

let obj = {};

obj.inc("prop");

// obj.prop == 1

您还可以在之前将必填字段添加到对象中

Object.prototype.has_fields = function(obj2){
    for(let p of Object.keys(obj2)){
        if(obj2[p].constructor == Object){
            if(!this[p]) this[p] = {};
            this[p].has_fields(obj2[p]);
        }else{
            if(!this[p]) this[p] = obj2[p];
        }
    }
    return this;
}

let obj = {};

    obj.has_fields({a:{b:{c:{d:{prop:0}}}}});
    obj.a.b.c.d.prop++;
    // obj.a.b.c.d.prop == 1

    obj.has_fields({a:{b:{c:{d:{prop:0}}}}});
    obj.a.b.c.d.prop++;
    // obj.a.b.c.d.prop == 2
于 2018-05-16T05:03:24.250 回答
1

这适用于普通 JS 和 TypeScript:

obj.prop = (obj.prop ?? 0) + 1;
于 2021-09-30T09:53:16.823 回答
0

类似于我讨厌懒惰的答案,但避免了Bodgan指出的双重分配

++obj.prop || (obj.prop=0)

在全球范围内

++window.foo || (window.foo=0)
于 2017-03-14T21:11:53.780 回答