关于js对象值的传递
结合红宝书和网上的一些文章,记录下自己对关于js对象的值的传递的一些理解。
js对象是保存在堆内存中的,当把对象赋值给变量时,是把对象在堆内存的引用(地址)赋值给了变量,变量通过地址来访问对象。下面来看两个例子,一个是自己想的,一个是红包书上的。
第一个是自己的例子:
var a = [1,3];var b = a; b= [3,4]; //先将对象[1,3]的地址赋值给了a,a又将自己的地址副本赋值给了b,a和b引用的是同一个对象[1,3]。然后又将[3,4]的地址赋值给了b
[3, 4] //但a的地址并未改变,引用的还是对象[1,3]的地址,所以a的值也不会变化
a
[1, 3]
var a = [1,3];var b = a; b.push(4); //但如果不是赋值,而是操作,如向数组[1,3]推入一个元素4,由于此时a和b的地址相同,引用的是同一个对象,b通过引用(地址)操作
3 //堆内存中的对象数组[1,3],向其推入新的元素4,导致对象发生了变化,那么此时a的值也会发生变化,和b一样。
a
[1, 3, 4]
然后这个是红宝书的例子,说的是在给函数传参数的时候,对象也是按值传递的(对象按引用传递,我现在理解为是按引用的值即地址传递来理解,不知道对不对)。
1 function setName(obj) { //person对象把自己的地址引用传递给了函数setName的局部变量obj
2 obj.name = "bob"; //局部变量obj通过地址引用操作person对象,给它添加了一个name属性,并赋值bob
obj = new Object(); //又将一个新对象的引用地址赋值给了obj局部变量,obj局部变量与person对象的关系切断了
obj.name = "nick"; //obj局部变量对新对象进行操作,添加了name属性,并赋值为nick,全局变量person的值并未发生改变,然后函数运行结束,局部变量也被销毁
} var person = new Object();
setName(person);
alert(person.name); // "bob"
以上就是我对js对象值传递的理解,如有不对之处,欢迎指正。第一次写这么长,文字还是很少,也不知道自己是否表达的很清楚。
关于js对象值的传递的更多相关文章
- js 对象的值传递
一.变量赋值的不同 1.原始值 在将一个保存着原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量,此后这两个变量是完全独立的. 2.引用值: 在将一个保存着对象内存地址的变量复制给另一个变量 ...
- js对象的复制,传递,新增,删除和比较
当我们把一个某个对象拷贝或者传递给某个函数时,往往传递的是该对象的引用. 因此我们在引用上做的任何改动,都将会影响到它所引用的原对象. 复制,拷贝 var o = { add: 'Changdao ...
- php 数组 类对象 值传递 引用传递 区别
一般的数据类型(int, float, bool)不做这方面的解说了 这里详细介绍一下数组和的类的对象作为参数进行值传递的区别 数组值传递 实例代码: <?php function main() ...
- js对象中动态读取属性值 动态属性值 js正则表达式全局替换
$(document).ready(function(){ var exceptionMsg = '${exception.message }'; var exceptionstr = ''; //j ...
- js获取对象值的方式
js获取对象值的方式 var obj = {abc:"ss",nn:90}; var v1 = obj.abc;//使用点的方式 var v2 = obj["abc&qu ...
- js对象替换键值名称
js对象替换键值名称 将obj中的id和name字段替换分别替换成为“@id”,“@name” 代码如下: let obj = [{id:,name:,name:"李四"}].ma ...
- [转载]php 数组 类对象 值传递 引用传递 区别
一般的数据类型(int, float, bool)不做这方面的解说了 这里详细介绍一下数组和的类的对象作为参数进行值传递的区别 数组值传递 实例代码: <?php function main() ...
- C#在WinForm中使用WebKit传递js对象实现与网页交互的方法
这篇文章主要介绍了C#在WinForm中使用WebKit传递js对象实现与网页交互的方法,涉及针对WebBroswer控件及WebKit控件的相关使用技巧,需要的朋友可以参考下 本文实例讲述了C#在W ...
- js对象数组中的某属性值 拼接成字符串
js对象数组中的某属性值 拼接成字符串 var objs=[ {id:1,name:'张三'}, {id:2,name:'李四'}, {id:3,name:'王五'}, {id:4,name:'赵六' ...
随机推荐
- 【Android开发经验】LayoutInflater—— 你可能对它并不了解甚至错误使用
今天,看到了一篇文章讲LayoutInflater的使用方法.瞬间感觉自己对这个类确实不够了解,于是简单的看了下LayoutInflater类的源码.对这个类有了新的认识. 首先.LayoutInfl ...
- Sharepoint2010 通过 WebFeature 修改web.config
using System;using System.Runtime.InteropServices;using System.Security.Permissions;using Microsoft. ...
- 在EasyUI中统一判断是否有选中行,如果有则将选中行数据传入回调函数
function procossWithSeletedData(func) { var rowData = $("#tbGrid").datagrid("getSelec ...
- ios9基础知识总结(一)
I--load 类被加载时自动调用,只要类的项目中,运行时就会加载.类一加载,此方法就会调用 //类被加载时调用,只要类的项目中,运行时就会加载,类一加载,此方法就调用 + (void)load { ...
- IOS创建单例的两种方法
1.0 苹果官方写法: static AccountManager *DefaultManager = nil; + (AccountManager *)defaultManager { if ( ...
- 天坑 之 java web servlet+jsp项目 配置后 404 (MyEclipse转eclipse)
最近搞一个自己的博客系统玩,用了servlet+jsp,结果发现了两个大问题: 1.无法 Export 出 WAR文件: 2.生成WAR,放置到TOMCAT的 webapps目录后,http://lo ...
- [Linked List]Convert Sorted List to Binary Search Tree
Total Accepted: 57775 Total Submissions: 198972 Difficulty: Medium Given a singly linked list where ...
- Python中安装numpy,scipy,matplotlib安装方法
这个吧,说简单也简单,说难吧我捣鼓了两天才弄出来,真是头发都急白了.其实只要一个网址就搞定了,嘿嘿 http://www.lfd.uci.edu 这里面有你需要的任何东西,当你运行python imp ...
- 为什么JavaScript函数中的参数前面不能加var
首先这里是JavaScript的语法规则. 其次在调用function()函数的时候参数时外部传入的.在传入之前就已经被声明了.没必要在函数参数里声明. 如果想要在函数里用新的参数 function( ...
- Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class android.support.design.widget.TabLayout,TableLayout引起页面崩溃
在使用TableLayout的时候,运行引用程序直接Crash. FATAL EXCEPTION: main Process: com.edaixi.activity, PID: 9703 java. ...