JS 基础知识2 传值和传址

要知道传址跟传址,首先我们先了解下数据值的操作。

1复制:可以把它赋值给一个新的变量

2传递:可以将他传递给一个函数或者方法

3比较:可以与另外一个值比较,判断是否相等

简要介绍下传值:

当一个数据是通过值被操作的,那么关系到的是数据的值,在赋值的过程中,是对实际值进行了COPY,储存在一个变量或者属性或数组中,copy的值与原数据是相互独立的。

当数据通过值传递给一个函数时,数据的一份传递给这个函数,如果函数体修改了这个值,只在函数体受影响,函数外的原数据不受影响。

当一个数据通过值和另外一个数据做比较,它们是相对独立的存在,仅仅就是值的比较。

传址:

原数据只有一份真实的COPY,操作全部都是针对于该值的引用。

这样的话,在赋值的操作中,只是这个地址被赋值,而不是一个值的COPY,赋值以后,新变量所指的值与原始变量一样。两个地址都是有效的,都可以操作这个值。

同样在传递的时候也是传递的是这个地址,而不是值,然而在函数内部,通过地址来修改值的本身,在外部同样的改变。

在比较的时候,它们比较的是引用地址,而不是具体的值,所以就算值相同,还是不相等。

具体参阅对比表:

  传值 传址
复制 实际复制的是值,存在于两个不同的独立拷贝 复制的只是对数值的引用,即地址,如果通过这个新的引用修改了数值,这个改变对最初的引用也是可见的
传递 传递给函数的值是一个独立的拷贝,对它的改变函数外没有影响 传递给函数的是对数值的一个引用。如果通过这个新的引用修改了数值,这个改变对最初的引用也是可见的
比较 比较两个独立的值,判断是否相同 比较的是两个的引用,判断引用是否是同一个数值。对两个不同数值的引用不相等,即使这两个数值相等

基础类型和引用类型

基础类型是通过传值来操作,而引用类型则是通过传址来操作的

数字和布尔类型是基础类型,因为它们是由很小的,固定数目字节组成。

对象是引用类型。数组和函数,是对象的特殊类型,也是引用类型。由于对象的没有固定大小,所以无法通过传值。

具体看实例:

这是一个传值。(基础类型)

 1         var a = 1;
 2         var b = a;            //将a复制给b
 3         function add1(x,y) {     //函数修改参数的值
 4             x = x + y;              //虽然这个里面将值进行相加,但是仅仅是值的独立拷贝,进行相加,在函数外面没有影响
 5         }
 6         add1(a,b);                //数字类型为传值
 7
 8         alert("a:" + a + "\n" + "b:" + b);      //a为1,b为1
 9         (a == b) ? c = "true" : c = "false";
10         alert(c);         //c="true"

这是一个传址

 1    var a = ["a", "b", "c", "d"];      //定义数组,引用类型
 2         var b = a;                           //将a复制给b
 3         function add(x) {           //函数修改参数的值
 4             x[0] = "tt";
 5         }
 6         add(b);             //数组对象为传址
 7         alert("a:" + a[0] + a[1] + a[2] + a[3] + "\n" + "b:" + b[0] + b[1] + b[2] + b[3]);     //b对象修改,则a也会修改,传址
 8       //  (a == b) ? q = "true" : q = "false";    //判断 a=b  ,返回true
 9       //  alert(q);
10
11         var a = ["a", "b", "c", "d"];
12         var b = ["a", "b", "c", "d"];
13         (a == b) ? q = "true" : q = "false";     //这里定义了两个对象,虽然值一样,但是不是同样的地址,所以为false
14         alert(q);    //输出"false"

需要注意的是,如果函数用新的一个对象或者数组覆盖这个引用,那么这一修改在外部是不可见的。或者说,对象和数组是用传值的方式来传递的,只不过这个值是一个引用,而不是本身。

 1  var a1 = [1, 2, 3];
 2         function add(a, b) {
 3             var newa = Array();
 4             newa[0] = a[0] + b;
 5             newa[1] = a[1] + b;
 6             newa[2] = a[2] + b;
 7             a = newa;     //重新覆盖了引用,所以外部是不可见的
 8             alert(a[0]);  //11
 9         }
10         add(a1, 10);
11         alert(a1[0]);     //1

字符串类型

前面看了这么多类型,一直都没有介绍字符串类型,它不好直接分为基础类型和引用类型,因为字符串是一种任意的长度,看上去应该是引用类型,可是他却不是对象,所以也不可作为引用类型。

类型
复制
传递
比较
数字 传值 传值 传值
布尔 传值 传值 传值
字符串 不可变 不可变 传值
对象 传址 传址 传址

JS 基础知识2 传值和传址,布布扣,bubuko.com

时间: 2024-12-12 04:38:16

JS 基础知识2 传值和传址的相关文章

JS基础知识大全

JS基础知识 基本语法*switch循环(设置表达式 x(通常是一个变量) 随后表达式的值会与结构中的每个 case 的值做比较.如果存在匹配,则与该 case 关联的代码块会被执行.请使用 break 来阻止代码自动地向下一个 case 运行) 不进行类型转换 var x; switch(x){ case true:console.log("x类型转换") ; default:console.log("x没有发生类型转换"); }//case没有发生类型转换 sw

JS基础知识回顾:引用类型(一)

在ECMAScript中引用类型是一种数据结构,用于将数据和功能组织在一起,而对象时引用类型的一个实例. 尽管ECMAScript从技术上讲是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和接口等基本结构,所以虽然说引用类型与类看起来想死,但他们并不是相同的概念. 不过引用类型有的时候也可以被称为对象定义,因为他们描述的是一类对象所具有的属性和方法. 新对象是使用new操作符后跟一个构造函数来实现的,构造函数本身就是一个函数,只不过该函数时处于创建新对象的目的而定义的. ECMASc

javascript . 05 json的组成、for...in 遍历对象、简单数据类型与复杂数据类型的传值与传址、内置对象

对象字面量  JSON var obj = { aaa :999}; var json={"aaa":999,"bbb":888}; "kay":value 对象字面2??定义方法和json很像,只有一点不同,json的key 必须加"" : 对象,数组也可以作为键值 JSON的组成 Javascript Object Notation 对象字面量的一种表现形式 : 键名必须有双引号""包围 : 为什么用J

JS基础知识回顾:引用类型(四)

每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法. 由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定. 函数的声明有以下三种形式: function sum(num1,num2){return num1+num2;}//利用函数声明语法定义 var sum=function(num1,num2){return num1+num2;}//利用函数表达式定义 var sum=new Function("num1","nu

JS基础知识回顾:引用类型(二)

ECMAScript中的Date类型是在早期Java中的java.util.Date类基础上构建的. 因此,Date类型使用自UTC(Coordinated Universal Time,国际协调时间)1970年1月1日午夜零点开始经过的毫秒数来保存日期. 在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日或之后的285616年. 要创建一个日期对象,使用new操作符和Date构造函数即可:var now=new Date(); 在调用Date构造函数而不传递参数

JS基础知识回顾:引用类型(三)

ECMAScript通过RegExp类型来支持正则表达式. 使用类似Perl的语法就可以创建一个正则表达式:var expression=/pattern/flags; 其中模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类.限定符.分组.向前查找以及反向引用. 每个正则表达式都可以带有一个或多个标志(flags),用以标注正则表达式的行为. 正则表达式的匹配模式只是下列三个标志: g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即

Java传值和传址

调用函数时,传的参数过去可能是传值,也可能是传址.如果是传值,函数内部的操作对参数的值没有影响:如果是传址,函数内部的操作是对参数指向的内存进行操作,会影响参数的值. Java到底是传值还是传址?用下面这个例子可以实验一下: package test; import java.util.ArrayList; import java.util.List; public class ValueAndAddress { public static void f1(int x){ x = x + 5;

javascript的变量,传值和传址,参数之间关系

先把收获晾一下: 1.javascrip变量包含两种类型的值,一种为引用类型的值,一种是基本类型的值.引用类型包括:Array,Object,Function(可以这么理解,非基本类型的都是引用类型);5种基本类型包括:undefined,null,string,boolean,number 2.函数的参数的传递的机制是复制变量值. 书上说:”把函数外部的值复制给函数内部的参数,就和把值从一个变量复制给另一个变量一样.基本类型的传递如同基本类型变量的复制一样,而引用类型的则如同引用类型变量的复制

NodeJs>------->>第三章:Node.js基础知识

第三章:Node.js基础知识 一:Node.js中的控制台 1:console.log.console.info  方法 1 console.log("this is a test string."); 1 node app1.js 1> info.log 1 console.log("This is a test String ."); 2 3 //从第二个参数开始,依序输出所有的字符串 4 console.log("%s","