JavaScript 值类型和引用类型的初次研究

今天遇到一个坑,具体的不多说,直接上代码

var a = [ [],[],[1,2,3] ]

var b = [‘颜色‘,‘大小‘,‘尺寸‘]

var arr = []
for(let i = 0; i < a.length; i ++){
    let obj = {}
    for(let j = 0; j < a[i].length; j ++){
        obj[b[i]] = a[i][j]
        arr.push(obj)
        console.log(arr)
        console.log(obj)
    }

}
console.log(arr)

我预期的 arr 的结果应该是

[ { ‘尺寸‘: 1 }, { ‘尺寸‘: 2 }, { ‘尺寸‘: 3 } ]

最后arr的结果居然是这样的

[ { ‘尺寸‘: 3 }, { ‘尺寸‘: 3 }, { ‘尺寸‘: 3 } ]

在一个基友群里问,最后终于自己得出结论了——这是因为值类型和引用类型不同的原因。

在JavaScript里的值大概分为两种,一种是值类型,一种是引用类型。

值类型:数值、布尔值、null、undefined

引用类型:对象、数组、函数

我们例子中的obj虽然每次打印出来都是不同的,但是因为是引用类型,arr也是引用类型,即使obj  push到arr里面了,也只是push进去了一个内存地址而已,所以最后obj变成3了,arr里面引用的obj也会全部变成3。很神奇吧,最后解决的办法也很简单

var a = [ [],[],[1,2,3] ]

var b = [‘颜色‘,‘大小‘,‘尺寸‘]

var arr = []
for(let i = 0; i < a.length; i ++){
    for(let j = 0; j < a[i].length; j ++){
    let obj = {}
        obj[b[i]] = a[i][j]
        arr.push(obj)
    }

}
console.log(arr)

只要把obj的声明放在最内层的循环里面,每次循环都会是单独的一个内存地址,这样最后的obj即使变成了3,前面的obj也不会被影响到,因为他们的内存地址根部不同。

时间: 2024-08-04 18:18:07

JavaScript 值类型和引用类型的初次研究的相关文章

Javascript 值类型和引用类型

本篇文章由:http://xinpure.com/javascript-value-types-and-reference-types/ Javascript变量类型 值类型: 字符串.数字.布尔.Null.Undefined 引用类型: 数组.对象.函数 值类型与引用类型的比较 通过两个实例来比较这两种类型 (调试环境: Chrome 开发者工具 Console) 值类型实例 var a = 'hello'; var b = a; b; /* hello */ a = 'world'; b;

javascript值类型和引用类型

一.引言 ECMAScript包含两个不同类型的值:基本类型值和引用类型值.基本类型值指的是简单的数据段:引用类型值指由多个值构成的对象.当我们把变量赋值给一个变量时,解析器首先要做的就是确认这个值是基本类型值还是引用类型值.(<javascript高级程序设计(第3版)>) 二.基本类型值和引用类型值 (1)基本类型值   包括Undefined.Null.Boolean.Number和String.这5种基本数据类型是按值访问的,操作保存在变量中的实际的值.   例子: var aa =

JavaScript基本数据类型及值类型和引用类型

在JavaScript中四种基本的数据类型:数值(整数和实数).字符串型(用“”号或‘'括起来的字符或数值).布尔型(使True或 False表示)和空值.在JavaScript的基本类型中的数据可以是常量,也可以变量.由于JavaScript采用弱类型的形式,因而一个数据的 变量或常量不必首先作声明,而是在使用或赋值时确定其数据的类型的.当然也可以先声明该数据的类型,它是通过在赋值时自动说明其数据类型的. javascript中的变量 javascript中的变量只是一个占位符,前言已经说过了

js值类型与引用类型

JavaScript值类型和引用类型有哪些 (1)值类型:数值.布尔值.null.undefined. (2)引用类型:对象.数组.函数. 三.如何理解值类型和引用类型及举例 我们可以用"连锁店"和"连锁店钥匙"来理解,不知道以下比喻合不合适,^-^. (1)值类型理解:变量的交换等于在一个新的地方按照连锁店的规范标准(统一店面理解为相同的变量内容)新开一个分店,这样新开的店与其它旧店互不相关.各自运营. [值类型例子] 代码如下: function chainSt

JavaScript中的值类型和引用类型

先抛出一个题目,阿里的笔试面试题(很基础,但确实是阿里的笔试题) var a = {"x": 1}; var b = a; a.x = 2; a = {"x": 3}; console.log(b.x); 大家觉得最后在控制台输出的结果是多少? 如果你答案是2,那你就没必要接下去看了.如果不是.那你就接着看下去来解决你的疑惑吧! JavaScript中的值类型和引用类型 在javascript里面有两种变量类型,一种是值类型,一种是引用类型. 值类型:数值.布尔型.

探索C#中的值类型和引用类型

记得大三上学期上C#课程的时候,老师第一堂课就重点给我们讲了一下C#中的数据类型.我们都知道,C#是一门强类型的高级编程语言,了解它的数据类型是非常有必要的.老师当时给我们列举了很多数据类型,然后问我们哪些是值类型,那些是引用类型.说实话,当时对于这个问题还真是回答不上来,或许可以说是自己没有多少底气回答.虽然大一学C++的时候接触过值类型和引用类型,但是因为没有深究,或者根本没有真正了解他们的区别,以至于在自己写代码时无形当中用到了却还是不了解它们之间的具体区别. 现在大四了,也到了快紧张面试

C# 类型基础 值类型和引用类型

引言 本文之初的目的是讲述设计模式中的 Prototype(原型)模式,但是如果想较清楚地弄明白这个模式,需要了解对象克隆(Object Clone),Clone其实也就是对象复制.复制又分为了浅度复制(Shallow Copy)和深度复制(Deep Copy),浅度复制和深度复制又是以如何复制引用类型成员来划分的.由此又引出了引用类型和值类型,以及相关的对象判等.装箱.拆箱等基础知识.索性从最基础的类型开始自底向上写起. 值类型和引用类型 先简单回顾一下C#中的类型系统.C# 中的类型一共分为

值类型和引用类型深入理解

引言 山重水复疑无路,柳暗花明又一村,越探究越接近事物的本质.最近在学习原型模式(Prototype)时,发现原型模式本质就是对一个类原始数据的克隆,但在学习深拷贝和浅拷贝时又发现与值类型和引用类型有着千丝万缕的联系.回想好久都没有温习基础,于是就整理了值类型和引用类型的随笔,本文内容比较基础,对于想继续深入研究的同学可以查看IL更深入探究. 1.值类型(ValueType) 值类型包括:数值类型,结构体,bool型,用户定义的结构体,枚举,可空类型. 值类型的变量直接存储数据,分配在托管栈中.

数据类型(1) - 值类型和引用类型

和javascript等脚本语言不同,C#基本上可以说是强类型的编程语言.这意味着,任何变量在编译时(而不是运行时)就必须要有一个类型.直到c#4.0,引入了动态类型为止.c#的弱类型体现在其类型object中.任何变量都可以是object类型的,也就是说他们在编译时没有类型,肯定能通过编译.但错误将会在运行时才发生. 强类型的好处有很多,例如可以保证类型安全(否则将会发生运行时错误),可以享受IDE带来的智能提示等,不容易出错(出错可以在编译的时候就知道).c#有很多数据类型,而他们可以分为两