js 值和引用
js对值和引用的赋值/传递在语法上没有区别,完全根据值得类型决定
简单值(即标量基本类型值),总是通过值复制的方式来赋值/传递,包括null,undefined,字符串,数字,布尔值和ES6中的symbol。
复合值——对象(包括数组和封装对象)和函数,则总是通过引用复制的方式来赋值/传递。
__________________________________
简单值
var a0=2;
var b0=a0;
b0++;
console.log(a0);//2
console.log(b0);//3
简单值注意
虽然传递的是指向数字对象的引用复本,但我们并不能通过它来更改其中的基本类型值
function foo(x){
x=x+1;
console.log(x);//3
}
var a=2;
var b= new Number(a);//Object(a)也一样
foo(b);
console.log(b);//2
__________________________________
数组
var a=[1,2,3];
var b=a;
b.push(4);
console.log(a); //[1,2,3,4]
console.log(b); //[1,2,3,4]
var c=[1,2,3];
var d=c;
d=[4,5,6];
console.log(c);//[1,2,3]
console.log(d);//[4,5,6]
__________________________________
对象
var obj={a:2};
function foo(weapper){
wrapper.a=42;
}
foo(obj);
console.log(obj.a);// 42
_________________________________________________
注意函数参数
function foo(x){
x.push(4);
console.log(x);//[1,2,3,4]
x=[4,5,6];
x.push(7);
console.log(x);//[4,5,6,7]
}
var e=[1,2,3];
foo(e);
console.log(e);//[1,2,3,4]而非[4,5,6,7]
我们像函数传递e的时候,实际是将引用e的一个复本赋值给x,而a仍然指向[1,2,3].在函数中我们可以通过引用x来更改数组的值(push(4)之后变为[1,2,3,4]).但x=[4,5,6]并不影响e的指向,所以e仍然指向[1,2,3,4].
不能通过引用x来更改引用e的指向,只能更改e和x的共同指向的值。
如果要将e的值变为[4,5,6,7],必须更改x指向的数组,而不是为x赋值一个新的数组
function foo(x){
x.push(4);
console.log(x);//[1,2,3,4]
x.length=0;
x.push(4,5,6,7);
console.log(x);//[4,5,6,7]
}
var e=[1,2,3];
foo(e);
console.log(e);//[4,5,6,7]
js 值和引用的更多相关文章
- js 参数的 引用与值传递
js中arr的赋值不影响原数组,赋值和引用的区别 1.赋值 var a = 1; var b = a; //赋的是a的复制值 b ++; alert(a); //"1" ...
- c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询
天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. 不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...
- Js 中的原始值和引用值
最近遇写 node.js 时到一个问题,把对象当赋值给数组成员时总是出错,比如下面的代码, var Arr = new Array(); var Obj = new Object(); for(var ...
- JS中原始值和引用值分析
JS中变量中两种类型的值:原始值,引用值 原始值是存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. var x = 1; //1就是一个原始值,变量x中存放的就是原始 ...
- JS中原始值和引用值的储存方式
在ECMAscript中,变量可以存放两种类型的值,即原始值和引用值 原始值指的是代表原始数据类型的值,也叫基本数据类型,包括:Number.Stirng.Boolean.Null.Underfine ...
- PHP javascript 值互相引用(不用刷新页面)
PHP javascript 值互相引用的问题 昨天通过EMAIL给一些公司投了简历,希望他们能给我一份工作,今天其中一家公司的人给我打电话,大意是要我做一点东西(与AJAX有关) 给他们看,我听 ...
- Javascript参数传递中值和引用的一种理解
值(value)和引用(reference)是各种编程语言老生常谈的话题,js也不例外. 我将剖析一个例子的实际运行过程,跟大家分享我对js参数传递中的值和引用的理解. 参考官网数据类型的两种分类,本 ...
- javascript原始值和引用值类型及区别
原始值和引用值类型及区别 首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变. 原始值(简单数据类型) 存储在栈中的简单 ...
- JavaScript数据操作--原始值和引用值的操作本质
我的一句话总结:原始值不管是变量赋值还是函数传递都不会改变原值,引用值不管是变量赋值还是函数传递,如果新变量重新赋值,则不会影响原引用值,如新变量是直接操作,就会影响原引用值. 首先明确,值和类型是两 ...
随机推荐
- Gym - 100712B Rock-Paper-Scissors
https://vjudge.net/problem/Gym-100712B 题意: 石头剪刀布游戏. 给出一个玩家n局的出的顺序,现在另一个是这样出的,X+Y+Z=n,在前X轮出石头,中间Y轮出布, ...
- Android -- ContentProvider, 读取和保存系统 联系人
1. 示例代码 需要的读写联系人的权限 <uses-permission android:name="android.permission.WRITE_CONTACTS"/& ...
- GEO--工具 ScanGEO
http://scangeo.dartmouth.edu/ScanGEO/ ScanGEO - parallel mining of high-throughput gene expression d ...
- Struts 2 + Hibernate + Spring 整合要点
Struts 2 和 Spring 的功能有重合,因此有必要说明下,整合中分别使用了两种框架的哪些技术. Struts 2 使用功能点: 1.拦截器.一处是对非登录用户购物进行拦截,一处是对文件上传的 ...
- SVN 与Eclipse 关联 || 安装beyond 插件
1.让本地svn代码与库建立联系 右击项目名称,Team - share project 2.本地svn版本一般与Eaclipse svn插件 版本一致!http://subclipse.tig ...
- phpstorm 右下角显示updating indices,一直有任务卡着
其实就是生成的这个node_modules目录内文件太多了,选中node_modules这个目录右键,选择Excluded 一直在加载忽略掉这个文件就可以了
- [spring]xml配置文件中bean属性的两种写法(p:configLocation <=> <property name="configLocation"/>)
1.当作bean节点的属性:p:configLocation: <!-- mybatis文件配置,扫描所有mapper文件 --> <bean id="sqlSession ...
- http协议报头详解
目录: 1. http协议简介 2. http报头举例 3. http报头详解 4. 几个字段的说明 5. 总结 6. 参考文章 1. http协议简介 HTTP是Hyper Text Transfe ...
- Opentsdb简介(一)
原文:http://www.jianshu.com/p/0bafd0168647 1.OpenTSDB介绍 1.1.OpenTSDB是什么?主要用途是什么? 官方文档这样描述:OpenTSDB is ...
- 51nod-1179-最大的gcd(数学)
1179 最大的最大公约数 题目来源: SGU 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注 给出N个正整数,找出N个数两两之间最大公约数的最大 ...