如果你把测试数组简化为 [1, 2, "2", 2, 3],然后在每一步使用 console.log 输出,看得就清楚了
函数中使用 typeof 是为了区别 2 和 “2”(number 和 string)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
Array.prototype.del = function () {
var a = {}, c = [], l = this .length;
for ( var i = 0; i < l; i++) {
var b = this [i];
// for 循环第 1 次:1
// for 循环第 2 次:2
// for 循环第 3 次:"2"
// for 循环第 4 次:2
// for 循环第 5 次:3
alert(b); var d = ( typeof b) + b;
// for 循环第 1 次:number1
// for 循环第 2 次:number2 <--- 重复
// for 循环第 3 次:string2
// for 循环第 4 次:number2 <--- 重复
// for 循环第 5 次:number3
alert(d); // for 循环第 1 次:number1 为 undefined
// for 循环第 2 次:number2 为 undefined
// for 循环第 3 次:string2 为 undefined
// for 循环第 4 次:注意 {} 中已经有了 number2,所以不为 undefined
// for 循环第 5 次:number3 为 undefined
alert(a[d]);
// a[d] 代表将 d 设为 a 的属性,例如 a = {number2},但没有值
if (a[d] === undefined) {
// 1, 2, "2", 3 被 push
c.push(b);
// 这里 = 1 只是给此属性一个值,例如 a = {number2: 1}
a[d] = 1;
// for 循环第 1 次:{number1=1}
// for 循环第 2 次:{number1=1, number2=1}
// for 循环第 3 次:{number1=1, number2=1, string2=1}
// for 循环第 4 次:因为 number2 存在,此次被忽略
// for 循环第 5 次:
// {number1=1, number2=1, string2=1, number3=1}
alert(a);
}
}
return c;
} alert([1, 2, "2" , 2, 3].del());
|
- 追问
-
随着循环进行,a的属性是不断变化的还是包含了之前所有的属性?
- 回答
-
a 的属性是累加的,也就是变化的,会包含之前添加的属性
第 1 次添加属性 number1 第 2 次添加属性 number2 第 3 次添加属性 string2 第 4 次 因为 a 已经有了属性 number2,也就是重复的数字 2,所以被忽略 第 5 次添加属性 number3
循环结束的时候 a = {number1:1, number2:1, string2:1, number3:1} c = [1, 2, "2", 3];
a 的四个属性值都为1,这个 1 没有什么实际意义,只是为了完整对象,有属性,有值。
- 追问
-
也就是说a会有新的属性,但是之前的属性不会消失。还是说a为某个类型的变量,因为这个类型的变量曾经出现过(可能不是a),所以a就不是undefined?
- 回答
-
a 会有新属性,之前添加的属性不会消失
a 在函数最开始的时候被定义为了对象 var a = {},但里面没有属性
每次循环的时候会检查 a 对象中是否有此属性 例如第一次,检查 number1,因为 a 没有 number1 属性,也就是 a[d] === undefined,所以添加 循环到第三次的时候,a 有 3 个属性,分别为 number1, number2, string2 第四次循环的时候,因为 a 已经有了 number2 属性,也就是 a[d] !== undefined,所以忽略不添加。push 就不会被调用,b 就不会被添加到最终数组中。
- 追问
-
这些属性是怎么添加到a当中去的呢?最后一个问题,然后就给分了~谢谢你这么耐心的回答。
- 回答
-
没关系,有问题继续追问就可以
先定义了对象 a = {},然后 d 是类似 number1 这样的字符串。
之前说错了一个地方,a[d] === undefined 这里并没有添加属性,只是在验证 a 对象中是否已经有了属性 number1,如果没有,也就是 undefined,进入 if 中,然后
a[d] = 1; 就是在这里添加的属性,同时赋值 1。
对象[属性] = 值,这是 JavaScript 中向对象中添加属性,并赋值的方法。
在第四次循环的时候,因为之前已经添加过 number2,所以 a[d] !== undefined,不进入 if,这里就被忽略了,数组中第四个元素 2 不会被 push 到 c 中,也就是不会出现重复元素。