首页 > javascript为什么不能这样赋值?

javascript为什么不能这样赋值?

window.cc = 1

window.cc = !window.cc
console.log(window.cc)
data[0].show = window.cc
console.log(data)

上面的代码运行的时候window.cc的值是一直在变化的,可将window.cc中的值给data(一个对象)console.log(data中被赋值的部分是不会变化的为什么),我知道js有引用,可是想不通这个不管是赋值还是引用都改变了data里面的值了,可是为什么log打印出来的还是不能发生变化


    'use strict';
    window.cc = {
        isClick: false
    };
    var data = [{
        show: null
    }];
    data[0].show = window.cc;
    // before cc change, data[0].show:  Object {isClick: false}
    console.log('before cc change, data[0].show: ', data[0].show);
    window.cc.isClick = !window.cc.isClick;
    // before cc change, data[0].show:  Object {isClick: true}
    console.log('after cc change, data[0].show: ', data[0].show);
    window.cc.isClick = !window.cc.isClick;
    // before cc change, data[0].show:  Object {isClick: false}
    console.log('after cc change, data[0].show: ', data[0].show);
    window.cc.isClick = !window.cc.isClick;
    // before cc change, data[0].show:  Object {isClick: true}
    console.log('after cc change, data[0].show: ', data[0].show);

JavaScript 中有两种不同的数据类型值,如下:

你这里,window.cc 先是一个数字,后来是一个布尔值,都是简单类型,所以赋值给 data[0].show 的时候,是直接复制值,不是传递引用对象。

如果你用下面的代码:

var data = [];
window.cc = {name: 'Sid'};
data[0] = {};
data[0].show = window.cc;
window.cc.name = 'Zoe';
console.log('data[0].show:', data[0].show, ', window.cc:', window.cc);

就会发现,修改 window.cc.namedata[0].show 的值同样会变化。


楼主你没有给出你的所有代码和控制台信息,所以我只是猜你可能对console.log的理解和我之前的一样,直接用代码说话

var x = {a:1,b:[1,2,3,4,5,6,7]};
//b只是为了chrome控制台中能出现展开对象的按钮,如果没有的话,你可以再添加点属性让它出现展开按钮
//毕竟平时工作时查看的大部分对象都是展开后才能看全的
console.log(x);
x.a=2;
console.log(x);

chrome控制台截图:

接下来再废话一下console.log,console.log能提供非常详细的对象的信息,这是它无与伦比的优势,但是你要知道,console.log不会阻塞程序的运行,它所打印出来的对象不是即时的,不是即时的,不是即时的。重要的事情说三便。不过呢,console.log打印出来的第一行(也就是没有展开显示时的数据)是即时的,是调用console.log的一瞬间的数据状态,但是展开后的部分不是。所以你可以在我的例子中看到两次console.log显示了a:2,而事实上,第一次调用console.log是,x.a===1。
通常对于console.log我会多留心一下,他可能让你认为你的某些函数天生具备异步特性(虽然他们并没有),在你对console.log打印出来的数据产生怀疑时,应该再测试一些,通常可以用alert或者congsole.log(一个非应用类型),在我的例子中,我很可能就会在console.log(x.a)看一下x.a的变化

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