简短的javascript代码:初始化为零或增量

时间:2012-11-08 21:36:07

标签: javascript

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

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

比此更短;)

var obj = {} ; 

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

5 个答案:

答案 0 :(得分:40)

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

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

答案 1 :(得分:30)

更简洁的方法就是

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

使用增量运算符是错误的或过度的。后缀运算符x++(问题中的示例)根本不起作用。带有前缀的++x会导致分配两次(比如说x = x = x+1

答案 2 :(得分:2)

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

答案 3 :(得分:1)

不可能直接将变量传递给函数inc(obj.prop),因为javascript变量是按值传递的,但是您可以传递对象本身以及要增加的变量的名称。 / p>

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

答案 4 :(得分:0)

I Hate Lazy's answer类似,但避免双重赋值Bodgan指出

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

在全球范围内

++window.foo || (window.foo=0)