Jackiesteed

www.github.com/jackiesteed

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
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的输出函数, 把你自己想看的内容输出出来.

 

 

posted on 2014-01-23 16:41  Jackiesteed  阅读(1168)  评论(0编辑  收藏  举报