当前位置: 首页 > news >正文

循环数组赋值给对象并push到数组中

var a = {b:[]};
var c = {
    name:'',
    age:'7'
};
var d = ['bj','sh','sz','gz']
for(var i in d){
    c.name = d[i];
    a.b.push(c)
}复制代码

如上图所示:

循环遍历数组d 并把每一项赋值给c.name 然后在push到a.b中

代码感觉没有问题但是经打印得出结果:

0:{name: "gz", age: "7"}

1:{name: "gz", age: "7"}

2:{name: "gz", age: "7"}

3:{name: "gz", age: "7"}

正确写法为:

var a = {b:[]};
var d = ['bj','sh','sz','gz']
for(var i in d){
    var c = {
        name:d[i],
        age:'7'
    };
    a.b.push(c)
}复制代码

得出正确结论:

0:{name: "bj", age: "7"}

1:{name: "sh", age: "7"}

2:{name: "sz", age: "7"}

3:{name: "gz", age: "7"}

解析:

object为引用数据类型,以上错误代码中只是操作了同一个地址中的name,c.name的值是一直在改变,a.b.push()的值为最后所得数据'gz'。

扩展 js基本数据类型和引用数据类型

基本数据类型:

Number、String 、Boolean、Null和Undefined。基本数据类型是按值访问的,因为可以直接操作保存在变量中的实际值。示例:

  var a = 10;

  var b = a;

  b = 20;

  console.log(a); // 10值

  上面,b获取的是a值得一份拷贝,虽然,两个变量的值相等,但是两个变量保存了两个不同的基本数据类型值。

  b只是保存了a复制的一个副本。所以,b的改变,对a没有影响。

  下图演示了这种基本数据类型赋值的过程:

引用数据类型:

也就是对象类型Object type,比如:Object 、Array 、Function 、Data等。

  javascript的引用数据类型是保存在堆内存中的对象。

  与其他语言的不同是,你不可以直接访问堆内存空间中的位置和操作堆内存空间。只能操作对象在栈内存中的引用地址。

  所以,引用类型数据在栈内存中保存的实际上是对象在堆内存中的引用地址。通过这个引用地址可以快速查找到保存中堆内存中的对象。

  var obj1 = new Object();

  var obj2 = obj1;

  obj2.name = "我有名字了";

  console.log(obj1.name); // 我有名字了

  说明这两个引用数据类型指向了同一个堆内存对象。obj1赋值给onj2,实际上这个堆内存对象在栈内存的引用地址复制了一份给了obj2,

  但是实际上他们共同指向了同一个堆内存对象。实际上改变的是堆内存对象。

  下面我们来演示这个引用数据类型赋值过程:







转载于:https://juejin.im/post/5afafa4051882542ac7d6836

相关文章:

  • spring源码解析bean初始化与依赖注入四
  • linux根分区满了如何处理,查找大文件方法
  • 机器中的灵魂会是量子比特么?
  • Android lrucache 实现与使用(Android内存优化)
  • 趣谈网络协议:像小说一样的网络协议入门课
  • 5.16 Stacks and Queues
  • iBatis和MyBatis在使用ResultMap对应关系时的区别
  • Java 架构师眼中的 HTTP 协议
  • Java多线程干货系列—(四)volatile关键字
  • first
  • Linux Swap扩容
  • 函数的默认参数:可有可无
  • os模块注意事项
  • 腾讯云全面开放,联手千万开发者共建超级大脑
  • 【51Nod】1920 空间统计学 状压DP
  • angular学习第一篇-----环境搭建
  • CentOS6 编译安装 redis-3.2.3
  • Django 博客开发教程 8 - 博客文章详情页
  • Rancher-k8s加速安装文档
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • tweak 支持第三方库
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 计算机常识 - 收藏集 - 掘金
  • 今年的LC3大会没了?
  • 前端面试之CSS3新特性
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 实现菜单下拉伸展折叠效果demo
  • 一个完整Java Web项目背后的密码
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 正则与JS中的正则
  • 7行Python代码的人脸识别
  • JavaScript 新语法详解:Class 的私有属性与私有方法 ...
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • 仓管云——企业云erp功能有哪些?
  • ​LeetCode解法汇总1276. 不浪费原料的汉堡制作方案
  • #laravel 通过手动安装依赖PHPExcel#
  • (12)Hive调优——count distinct去重优化
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (待修改)PyG安装步骤
  • (删)Java线程同步实现一:synchronzied和wait()/notify()
  • (五)MySQL的备份及恢复
  • (一)Dubbo快速入门、介绍、使用
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)Scala的“=”符号简介
  • .NET CF命令行调试器MDbg入门(二) 设备模拟器
  • .NET Core 项目指定SDK版本
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • /etc/sudoers (root权限管理)
  • /usr/bin/env: node: No such file or directory
  • @JoinTable会自动删除关联表的数据
  • @KafkaListener注解详解(一)| 常用参数详解
  • @require_PUTNameError: name ‘require_PUT‘ is not defined 解决方法
  • @selector(..)警告提示