我喜欢那些简短的 js oneliners。我想知道是否有一些合乎逻辑和优雅的东西:
- 如果未定义,则将变量初始化为零
- 否则加一。
最好比这个短;)
var obj = {} ;
//some iterative called function
obj.prop = obj.prop===undefined?0:obj.prop++;
我喜欢那些简短的 js oneliners。我想知道是否有一些合乎逻辑和优雅的东西:
最好比这个短;)
var obj = {} ;
//some iterative called function
obj.prop = obj.prop===undefined?0:obj.prop++;
这将导致NaN
第一个增量,默认为0
.
obj.prop = ++obj.prop || 0;
一种更清洁的方法很简单
obj.prop = obj.prop + 1 || 0;
使用增量运算符是错误的或矫枉过正。后缀运算符 , x++
(问题中的示例)根本不应该工作。前缀 ,++x
导致分配两次(比如说x = x = x+1
)
更短的解决方案:obj.prop = -~obj.prop
无法直接将变量传递给函数 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
这适用于普通 JS 和 TypeScript:
obj.prop = (obj.prop ?? 0) + 1;