扫码关注官方订阅号
或许在大神眼里挺简单的一个问题。但是我不太明白为什么。
我变量a是在console后面添加内容,为什么在前面的输出中会输出完整的数组。不应该输出undefined吗?
首先,在JS中,数组和对象都是引用类型,引用是在操作堆内存,他们指向的是内存里同一个数据,当b.push(a)的时候,实际上b内的元素a数组和a指向的是同一个地址,所以操作a的时候,b内的元素a数组也在改变。
另外浏览器的控制台是延迟加载(lazy loading),是在你展开那个 Object 的时候,才会去枚举该对象中的每一个属性,并把它显示出来的。
不信你可以把你的console.log(b)改为console.log(JSON.stringify(b))结果是[]。
因为所有的b都是指向同一个数组对象
var a; b = []; for (var i = 0; i < 20; i++) { b.push(a = []); //这里已经对a进行了赋值操作,a肯定不是undefined console.log(b); console.log(b.length); //可以看到b的length在不断增加 console.log(b[i]); //一直都[]也就是a现在的值 a.push(i); console.log('-----------------------------'); }
至于在开发都工具中点开每次log的b都是
个人猜测显示的是b现在内存中的数据,也就是for执行过后的b
基本类型:指的是简单的数据段。在JavaScript中有五种基本数据类型:undefined、null、boolean、number和string。基本类型都是按值访问的,就是说可以操作保存在变量中的实际值引用类型:对象、数组、函数。对象是属性和方法的集合。引用类型可以拥有属性和方法,属性又可以包含基本类型和引用类型。引用类型的值保存在内存中的对象,JavaScript不能直接操作对象的内存空间,操作对象时,实际上是操作对象的引用而不是实际的对象。引用类型的值是按引用访问的。
参考:http://www.w3cplus.com/javasc...
这本书叫做《Async javascript》,不是数组的问题,是以为console.log是异步的,会放到事件队列里。等for执行完再执行,所以每次都是完整的数组
console.log
完整的数组
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
首先,在JS中,数组和对象都是引用类型,引用是在操作堆内存,他们指向的是内存里同一个数据,当b.push(a)的时候,实际上b内的元素a数组和a指向的是同一个地址,所以操作a的时候,b内的元素a数组也在改变。
另外浏览器的控制台是延迟加载(lazy loading),是在你展开那个 Object 的时候,才会去枚举该对象中的每一个属性,并把它显示出来的。
不信你可以把你的console.log(b)改为console.log(JSON.stringify(b))结果是[]。
因为所有的b都是指向同一个数组对象
至于在开发都工具中点开每次log的b都是
个人猜测显示的是b现在内存中的数据,也就是for执行过后的b
基本类型:指的是简单的数据段。在JavaScript中有五种基本数据类型:undefined、null、boolean、number和string。基本类型都是按值访问的,就是说可以操作保存在变量中的实际值
引用类型:对象、数组、函数。对象是属性和方法的集合。引用类型可以拥有属性和方法,属性又可以包含基本类型和引用类型。引用类型的值保存在内存中的对象,JavaScript不能直接操作对象的内存空间,操作对象时,实际上是操作对象的引用而不是实际的对象。引用类型的值是按引用访问的。
参考:
http://www.w3cplus.com/javasc...
这本书叫做《Async javascript》,不是数组的问题,是以为
console.log是异步的,会放到事件队列里。等for执行完再执行,所以每次都是完整的数组