之前看《javascript高级程序设计》时就遇到过一个问题,就是函数传参的问题,书上说是按值传递,而非按引用传递。很多人都会认为js里面有两种传值方式,一种是复制,另一种是数组、对象等按引用传递,后来看到知乎上面一道题后才发现不是那么简单。我个人理解就是,js中全部是按值传递。

这个是高级程序设计里面的例子:

也许很多人会迷惑,person.name不该是Greg吗?为什么输出Nicholas?

因为setName函数里面其实相当于把person对象的地址复制了一份,然后赋值给了obj,但是obj=new Object()这句将另外一个地址赋值给了obj,所以下面obj不管怎么修改都不会影响person。

这里还有另外一个例子:
var a=[1,2,3];
var b=a;
a=[1,2,3,4];
console.log(b); //1,2,3

按照正常的想法,a和b是引用的同一个数组对象,当a改变的时候,b也会改变,可是这里面b却没有改变,难道这个是单纯的复制a的值给b?

这个和上面的例子差不多,也是把a指向对象的地址复制给了b,然后a=[4,5,6]相当于a指向了另外一个数组,所以b还指向原来的数组,并不会发生变化。

这里还有一个例子:
var a=[1,2,3];
var b=a;
a.push(4);
console.log(b); //[1,2,3,4]

这里面因为a改变的还是原来数组,所以b也会跟着变化。

最后奉上一道自己笔试做错的题。
var test1=new Boolean("false");
console.log(test1); //true

注意:如果逻辑对象无初始值或者其值为 0、-0、null、""、false、undefined 或者 NaN,那么对象的值为 false。否则,其值为 true(即使当自变量为字符串 "false" 时)!

JS传值和传引用的更多相关文章

  1. JavaScript系列----数据类型以及传值和传引用

    1.简单数据类型 在JavaScript中简单数据类型分为5种.分别为 Undefined, Null,Boolean,Number,String. Undefined类型Undefined类型只有一 ...

  2. java集合中的传值和传引用

    在学习java集合过程中发现了传值和传引用的区别: 我们来看下面两句话 ●java集合就像一种容器,我们可以把多个对象(实际上是对象的引用),丢进该容器.(来自疯狂java讲义) ●当使用Iterat ...

  3. Go语言的传值与传引用

    Go语言里的传值与传引用大致与C语言中一致,但有2个特例,map和channel默认传引用,也就是说可以直接修改传入的参数,其他的情况如果不用指针的话,传入的都是参数的副本,在函数中修改不会改变调用者 ...

  4. java中的传值与传引用

    java函数中的传值和传引用问题一直是个比较“邪门”的问题,其实java函数中的参数都是传递值的,所不同的是对于基本数据类型传递的是参数的一份拷贝,对于类类型传递的是该类参数的引用的拷贝,当在函数体中 ...

  5. python函数传参是传值还是传引用?

    首先还是应该科普下函数参数传递机制,传值和传引用是什么意思? 函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题.基本的参数传递机制有两种:值传递和引用传 ...

  6. java 函数形参传值和传引用的区别

    java方法中传值和传引用的问题是个基本问题,但是也有很多人一时弄不清. (一)基本数据类型:传值,方法不会改变实参的值. public class TestFun { public static v ...

  7. Go 参数传递是传值还是传引用

    什么是传值(值传递)? 传值的意思是:函数传递的总是原来这个东西的一个副本.一个副拷贝.比如我们传递一个 int 类型的参数,传递 的其实这个参数的一个副本:传递一个指针类型的参数,其实传递的是这个指 ...

  8. C++ 参数传值 与 传引用

    参数传值 在 C++ 中,函数参数的传递有两种方式:传值和传引用.在函数的形参不是引用的情况下,参数传递方式是传值的.传引用的方式要求函数的形参是引用.“传值”是指,函数的形参是实参的一个拷贝,在函数 ...

  9. Java内存管理-Stackoverflow问答-Java是传值还是传引用?(十一)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 本文导图: 一.由一个提问引发的思考 在Stack Overflow 看到这样一个问题 ...

随机推荐

  1. 安装 mrtg

    http://blog.csdn.net/cnbird2008/article/details/2072627

  2. C++第四天学习

    回顾: 1.初始化表 2.this指针 3.拷贝构造 Test(const Test& rt) { //1.分配新空间 //2.给新空间赋值 } 4.static成员 类::函数(): 类型 ...

  3. Android EditText获取焦点和失去焦点监听事件

    实现方法也很简单.那就是绑定OnFocusChangeListener事件.实现onFocusChange(View v, boolean hasFocus) 方法.第二个参数就是判断得到焦点或失去焦 ...

  4. android 快捷技巧

    快捷方式 <!--[if !supportLists]-->0. Ctrl + 1 (快速修复) <!--[if !supportLists]-->1. Ctrl + D (删 ...

  5. DNS没有生效的几个原因

    1.记录没有正确添加 请确认你的域名记录是否完全正确的添加.线路类型正确,记录类型正确 2.域名还没有生效 这个情况还会有另外一个现象,就是域名有时候可以ping,有时候不能ping. 这是因为你当地 ...

  6. IEcss样式,行高的问题

    input的文本内容显示一定要用line-height,不然会出现内容错位的问题

  7. 冒泡排序 - vb.net

    Imports System.ThreadingModule Module1    Sub Main()        Dim int_array(9) As Integer        Dim r ...

  8. Java各种工具下载

    http://yunpan.cn/cyUzqFTu8pEER  提取码 355c  myeclipse2013 http://yunpan.cn/cyUzPi7nC8Z9S  提取码 fc4b  my ...

  9. MySQL插入数据中文乱码问题的解决

    一.使用语句 show variables like 'character%'; 来查看当前数据库的相关编码集. 1.启动cmd,登录mysql ①cd C:\Program Files\MySQL\ ...

  10. 源码(09) -- java.util.Arrays

    java.util.Arrays 源码分析 ------------------------------------------------------------------------------ ...