var myList =newObject();var item =newObject(); item.text ="item-1"; myList[3]= item; console.log(myList); console.log(myList[3].text);// Assign another object to the same entryvar item2 =newObject(); item2.text ="item-2"; myList[3]= item2; console.log(myList); console.log(myList[3].text);
[例子1]
上面这段代码中, 第一个log打印出的内容竟然携带item-2, 这和我们原本预期的值是不同的.
但是, 下面这段代码的结果又是对的.
var person ={'name':'Tom'}; console.log( person);//output the entire object variable person.name ='Thomas';
[例子2]
无论是对象还是数组, 都可以理解为对象. 而对象的属性(成员)也可以是对象.
console.log的行为其实是, 只会把对象的第一层给打印出来. 如果对象的属性是一个值, 那么会直接输出, 而如果仍然是一个对象, 那么只会输出一个引用.
而对于没有打印出来的那些引用, 它们会被懒惰求值.
对于懒惰求值的情况, 如果你在console.log后对引用对应的内容作了修改, 你点击展开的时候, 获取的内容也是修改之后的.
那么为什么会出现上面的情况呢? 因为一个对象可能会很大, 也可能存在循环引用, 所以不可能全部展开.
那么你可能会想, 能不能做一个临时备份呢? 太大的对象也会令临时备份过程很慢, 从而影响console.log的执行效率, 这是设计者不允许的, 因为console.log对于alert的一个优势就是对于代码的执行过程没有较大影响, 不会引起代码阻塞.
那么如果规避上面的问题呢? 因为这确实会令控制台上的调试很困扰.
答案是, 在console.log执行的时候, 直接求值. 自己想办法写一个对象的toString的输出函数, 把你自己想看的内容输出出来.