请问这个JavaScript的去重代码怎么理解?

function unique(arr){
var obj={};
var uniAfter=[];
for(var i=0;i<arr.length;i++){
if(!obj[arr[i]]){ //()里不理解
uniAfter.push(arr[i]);
obj[arr[i]]=1; //这里不理解
}

}
return uniAfter;
}



function unique(arr){
var obj={};
var uniAfter=[];
for(var i=0;i<arr.length;i++){
if(!obj[arr[i]]){ //对象没有属性arr[i]时if(!obj[arr[i]])相当于if(!(undefined))为true,uniAfter.push(arr[i]);obj[arr[i]]=1;下次数组中有相同值时if(!obj[arr[i]])相当于if(!(1))为false,就进不来了
uniAfter.push(arr[i]);
obj[arr[i]]=1;
}

}
return uniAfter;
}

var obj={};
var uniAfter=[];
for(var i=0;i<arr.length;i++){
if(!obj[arr[i]]){ //()里不理解
uniAfter.push(arr[i]);
obj[arr[i]]=1; //这里不理解

这里{}表示创建Object对象
[]表示创建一个Array数组
if(!obj[arr[i]])
如果obj里有arr[i]这个属性对象的话,程序就跳过,表示是重复的
否则,uniAfter.push(arr[i]);意思是往数组放arr[i]
而obj[arr[i]]=1; 这里就是设置属性对象的值 了,因为{}中都是key/value一一对应 的,所以要给它设值

这段代码的思路就是把数据放入hashtable,以数据为key索引。
之所以你不理解,是push这个函数,在别的地方定义的,而下标根据hash索引,也是别的代码实现的。

javascript代码就是这点非常迷惑,任何代码都可以随便给任何对象添加功能。

obj[arr[i]]=true;

改成这样你也许要理解点,javascript除了true/false可以当if判断条件外,对象,0,null,undefined这种都可以当做判断条

JavaScript中有 6 个值为“假”,这六个值是

false
null
undefined
0
'' (空字符串)
NaN

打开浏览器的调试功能,跟踪一下变量的值,思路就更清析了。

obj[arr[i]]=true;

也就是 对真假的判断