js的map与console.log结合遇到的一个坑。

739 阅读1分钟

首先

这里讲讲,我为什么会遇到这个坑,在遇到这个坑之前,我在学习vue3,看一个大佬封装的框架也需要过,那时我还以为是ts的某些知识。问了些人,也没搞懂就放在不管了,这次在自己项目vue2的js也遇到了。 console.log()会展示引用数据类型会呈现最终内存地址的值,没有按照同步走。

代码

let a = [
    {
        b: [
            {c: 1}
        ]
    },
    {
        b: [
            {c: 2}
        ]
    },
    {
        b: [
            {c: 3}
        ]
    }
]
console.log(a);
a.map(item => {
item.b = Object.assign([], [{c: 4}]);
})
console.log(a);

这里需要放在浏览器中执行,会看待第一个 console.log()和第二打印的值是相同的,下面的c都是为4。

第一个误区

var obj = {};
console.log(obj);
obj.foo = 'bar'; 

这里我们会以为console.log()会按照同步来执行。在node环境中是这样的。但是在chrome中不是。

image.png

这是结果。console.log()还是会展示出最终内存上面的值。

image.png

在webkit的console.log()只是存了,该引用数据类型的内存地址。当代码执行完了才去拿值。所以会展示出后面的值。

第二个误区

image.png

这个是有误解的,当数组是一个原始值的时候,是不能够改变,但是当数组是引用数据类型还是能够改变的。就像前面的对象 改变了下面属性的值。

最后

祝大家都有光明的未来,啊哈哈!!!!