首页 > 变量的赋值之想不开

变量的赋值之想不开

事情是酱紫的:
有一个数组arr非空,
有一个对象obj中有一个supplier属性,
现在代码是这样的

arr =[{"name":"aa","age":"23"},{"name":"bb","age":"24"}];
obj.supplier = arr;
console.log(obj.supplier);
//这里有时候可以打印出来数组,但是长度是对的,可惜里面每个元素都是空的;有时候直接打出来的是个空数组
//然后这里执行了其他的代码,其中包含一个ajax请求,
//在ajax请求的回调always中我清空了数组arr
$.ajax({
    ...
}).always(function (){
arr =[];
});

我不理解的是js顺序执行的时候 我曾经在console.log前放debugger,一步一步执行的时候是没有问题的,并且打印出来的数据也是没问题的,一旦中间不间断的执行结果总是不对,
求指教~~
另外 我也考虑过是不是跟数组是引用类型有关系,引用类型的值是按照引用访问的,所以在下面把数组清空的时候上面的obj.supplier也受到了影响呢?但是js 不是顺序执行么,那console.log的时候打印也应该是正确的 而不应该是现在这样的结果.
求指教~~


恭喜你,碰到了关于 console.log 惰性求值的问题!

先说结论:console.log 是不靠谱的(当考察代码的执行顺序以及依赖关系的时候),所以你的代码要想让它运行起来“没有意外”,那就把 arr 复制一下。比如说用 lodash:

obj.supplier = _.clone(arr)

这样就没事了。

至于 console.log 的问题,由于它并非标准里确定的 API,所以浏览器的实现是没有标准可言的。有时候会出现同步的 console.log 与异步的 console.log 的困惑,也有立刻求值的 console.log 和惰性求值的 console.log 的差异。你遇到的是后者。


补充参考:http://stackoverflow.com/questions/4057440/is-chromes-javascript-console-lazy-about-evaluating-arrays


其实你的问题并不是问题.

console.log输出一个对象的时候,如果这个对象里有数组,
那么它输出的内容是当前代码执行时数组的信息.

而当你后面对这个数组进行操作时, 比如 添加/删除 之后,
再用鼠标去点开 之前 console.log 输出的那条信息时,
你会看到很神奇的事情,就是这个时候显示的数组与外面的是不对应的,
这个原因,我猜应该是控制台在显示某个对象的值的时候,
是取的目前这个变量的状态, 而不是 之前输出它的时候的状态.

另外在你点开 之前输出的那段数据的时候, 在它的旁边会有一个 i 的标记.

如果你有尝试把你的鼠标移到那个i上面的话,就会看到上面这句话了.

下面为重现楼主的情况的代码:

在你没下断点时, console.log 输出了 对象的当前状态, 但并没有展开显示具体的信息.
然后在后面把它重置之后, 当你再用鼠标点开 看数据的时候,就会发现, 上面显示的明明有数据(数组长度), 但展开却是空的.

所以在控制台中输出 js 里的对象时,可以使用下面这种方法(有DOM对象的不要这么玩 =,=):

【热门文章】
【热门文章】