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 值和引用的更多相关文章

  1. js 参数的 引用与值传递

    js中arr的赋值不影响原数组,赋值和引用的区别 1.赋值 var a = 1; var b = a;   //赋的是a的复制值 b ++; alert(a);   //"1"   ...

  2. c#代码 天气接口 一分钟搞懂你的博客为什么没人看 看完python这段爬虫代码,java流泪了c#沉默了 图片二进制转换与存入数据库相关 C#7.0--引用返回值和引用局部变量 JS直接调用C#后台方法(ajax调用) Linq To Json SqlServer 递归查询

    天气预报的程序.程序并不难. 看到这个需求第一个想法就是只要找到合适天气预报接口一切都是小意思,说干就干,立马跟学生沟通价格. ​ ​不过谈报价的过程中,差点没让我一口老血喷键盘上,话说我们程序猿的人 ...

  3. Js 中的原始值和引用值

    最近遇写 node.js 时到一个问题,把对象当赋值给数组成员时总是出错,比如下面的代码, var Arr = new Array(); var Obj = new Object(); for(var ...

  4. JS中原始值和引用值分析

    JS中变量中两种类型的值:原始值,引用值 原始值是存储在栈(stack)中的简单数据段,也就是说,它们的值直接存储在变量访问的位置. var x = 1; //1就是一个原始值,变量x中存放的就是原始 ...

  5. JS中原始值和引用值的储存方式

    在ECMAscript中,变量可以存放两种类型的值,即原始值和引用值 原始值指的是代表原始数据类型的值,也叫基本数据类型,包括:Number.Stirng.Boolean.Null.Underfine ...

  6. PHP javascript 值互相引用(不用刷新页面)

    PHP javascript 值互相引用的问题   昨天通过EMAIL给一些公司投了简历,希望他们能给我一份工作,今天其中一家公司的人给我打电话,大意是要我做一点东西(与AJAX有关) 给他们看,我听 ...

  7. Javascript参数传递中值和引用的一种理解

    值(value)和引用(reference)是各种编程语言老生常谈的话题,js也不例外. 我将剖析一个例子的实际运行过程,跟大家分享我对js参数传递中的值和引用的理解. 参考官网数据类型的两种分类,本 ...

  8. javascript原始值和引用值类型及区别

    原始值和引用值类型及区别 首先,原始值和引用值类型都是js中的数据类型,为了充分利用存储空间,定义了不同的数据类型,而且js是弱类型,动态语言,数据类型可变. 原始值(简单数据类型) 存储在栈中的简单 ...

  9. JavaScript数据操作--原始值和引用值的操作本质

    我的一句话总结:原始值不管是变量赋值还是函数传递都不会改变原值,引用值不管是变量赋值还是函数传递,如果新变量重新赋值,则不会影响原引用值,如新变量是直接操作,就会影响原引用值. 首先明确,值和类型是两 ...

随机推荐

  1. springboot idea 配置热加载

    在idea 配置springboot的热加载,只需要三步: 第一步.引用jar包 <dependency> <groupId>org.springframework.boot& ...

  2. centos mysql忘记密码

    1.停止mysql 服务:service mysqld stop; 2.vim命令打开mysql配置文件my.cnf(位置一般为:/etc/my.cnf) 3.在mysqld进程配置文件中添加skip ...

  3. Spring MVC 实践笔记

    1.了解 Maven 的用法:http://spring.io/guides/gs/maven/ .这篇英文非常详细的演示了 Maven 的用法,在命令行下执行.注意,运行Maven的时候,Maven ...

  4. 一切从Trade开始(转)

    taobao.trades.sold.get 取得交易列表 从店铺取得时间 taobao.shop.get (nick,field)shop.created 循环读取从开店时间到当前时间的所有交易 t ...

  5. 解决mac上matplotlib中文无法显示问题

    系统:mac os, high sierra; python3.7(by brew installed)   在网上找了很多基本上都是让下载SimHei字体,然后放到mac的matplotlib的字体 ...

  6. vue2.0--vue-router路由

    一.vue-router如何进行参数传递 1.name  $route.name 通过在路由router/index.js中配置路由时定义的name属性来传递 ① 有一个页面components/he ...

  7. Oracle归档的开启和关闭

    --1.开启归档 [步骤] a.一致性关闭数据库(shutdown [immediate | transactional |normal]) b.启动到mount阶段(startup mount) c ...

  8. 如何使用POST 方法调用服务

    一.WCF REST专用POST方法 1.1.        建立WCF REST 方法 [ServiceContract] public interface IBookingBizService { ...

  9. bzoj1002: [FJOI2007]轮状病毒 生成树计数

    轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下图所示 N轮状病毒的产生规 ...

  10. 1-10 RHLE7 系统进程管理

    1.1-Linux进程管理 程序.进程.线程 程序:一组指令的集合    QQ 进程:程序的执行就是进程.也可以把进程看成一个独立的程序,在内存中有其对应的代码空间和数据空间,一个进程所拥有的数据和代 ...