在javascript操作Array和Object对象的时候有一些误区是很容易走入的,尤其是那些指针问题,虽然说javascript中并没有像C语言那样的指针操作,但是这并不代表了javascript中就根本没有用到指针,其实在javascript中是有指针的,只是内部被封装好了,不用程序员自己再去手动敲写罢了。
容易犯的错误1:
以下面的例子为例来说明,下面的例子是用javascript中的Array与Object对象来模仿Java中的list与map容器。
var map=new Object();
var list=new Array();
map.id=0;
map.text='node1';
list.push(map);
map.id=1;
map.text='node2';
list.push(map);
map.id=2;
map.text='node3';
list.push(map);
上面的代码从思想上看,应该是想将node1,node2,node3包括各自的id分别放入对应的map中,然后再放入list中,但是实际上得到的结果却是:
很遗憾的是,得到的结果都是最后一个map中的节点信息,why?究其原因那就是它们放入list中的并不是map对象,而是对map对象的引用,换言之,我们放入的是对于map对象引用的指针,所以说每次的map修改操作,最后都会影响到list中所有的map值,最后结果就变成了上面的情况。
容易犯的错误2:
var map=new Object();
var list=new Array();
map.id=0;
map.text='node1';
var map1=new Object();
map1=map;
list.push(map1);
map.id=1;
map.text='node2';
var map2=new Object();
map2=map;
list.push(map2);
map.id=2;
map.text='node3';
var map3=new Object();
map3=map;
list.push(map3);
在上面的代码中,我们确实是new了一个对象,但是该对象放入的是map的指针,然后我们再将该对象放入list中,由于map中的修改,造成的我们new出来的对象的值发生了变化,进而导致list中放入的还是最后一个map中的内容。
真正的解法是:
我们应该在创建对象之后进行赋值,每创建一次对象,赋一次值,如下:
var list=new Array();
var map1=new Object();
map1.id=0;
map1.text='node1';
list.push(map1);
var map2=new Object();
map2.id=1;
map2.text='node2';
list.push(map2);
var map3=new Object();
map3.id=2;
map3.text='node3';
list.push(map3);
此时得到的结果如下: