我喜欢那些简短的js oneliners。我想知道是否有符合逻辑和优雅的东西:
比此更短;)
var obj = {} ;
//some iterative called function
obj.prop = obj.prop===undefined?0:obj.prop++;
答案 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)