资讯专栏INFORMATION COLUMN

深究JavaScript——参数传递与变量复制

jzman / 1434人阅读

摘要:在操作对象时,实际上是在操作对象的引用而不是实际的对象。任一变量值操作互不影响。访问变量有按值和按引用两种方式,而参数只能按值传递。基本类型参数传递传给函数的是数值的一个复制,函数中对其的修改外部不可见。

   ECMAScript 变量可能包含两种不同数据类型的值:基本类型值和引用类型值。 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。

  5 种基本数据类型: Undefined、 Null、 Boolean、 Number 和 String。这 5 种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值。ES6有多出一种Symbol类型。

访问变量

  引用类型的值是保存在内存中的对象,JavaScript 不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象。为此,引用类型的值是按引用访问的。

复制变量值

【复制变量值】复制基本类型变量的值,会在该变量对象上创建一个新值,然后把该值复制到新变量分配的位置上。任一变量值操作互不影响。

【复制引用指针】复制引用类型变量的值,同样会将存储在变量对象中的值复制一份放到新变量分配的空间中,不同的是这个值的副本实际上一个指针,而这个指针指向存储在堆中的一个对象。复制后,两个变量实际上将引用同一个对象。因此,改变任意变量,都会影响另一个变量。

参数传递

  ECMAScript 中所有函数的参数都是按值传递的。访问变量有按值和按引用两种方式,而参数只能按值传递。
  

基本类型参数传递:传给函数的是数值的一个复制,函数中对其的修改外部不可见。

var a = 1;
var b = 2;
function change(a, b) {
    var c = a;
    a = b;
    b = c;
    console.log(a);    //2
    console.log(b);    //1
}
change(a, b);
console.log(a);    //1
console.log(b);    //2

引用类型参数传递:传给函数的是数值的一个引用,函数中对其属性的修改外部可见,但用新引用覆盖其则在外部不可见

var a = [1, 2, 3];
var b = [5, 6];
function change(a,b) {
  a[0] = 4;    //对其属性的修改外部可见 
  var c = a;
  a = b;      //用新引用覆盖
  b = c;
  console.log(a);  //"5,6"        
  console.log(b);  //"4,2,3"
}
change(a,b);
console.log(a);    //"4,2,3"
console.log(b);    //"5,6"

  a,b是change函数中的变量,在调用函数时传递了a,b的引用赋给了这两个变量,但是并不能改变全局中的a,b。因为用新引用覆盖在外部不可见,因为函数只是拿到了引用 并没有权力更改引用。

var a = [1, 2, 3];
var b = [5, 6];
function change() {
  var c = a;
  a[0] = 4;    //对其属性的修改外部可见 
  a = b;      //用新引用覆盖
  b = c;
}
change(a,b);
console.log(a);  //"5,6" 
console.log(b);  //"4,2,3"

  因为js没有块级作用域,所以它在change里找不到变量a,b就会自觉的到上层去找,所以这里的a,b是全局变量的引用。

☞☞☞深究JavaScript系列☜☜☜

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89325.html

相关文章

  • 深究JavaScript——函数调用this详解

    摘要:构造器的目的是要创建一个新对象并对其进行设置,然后将其作为构造器的返回值进行返回,是通过函数调用初始化创建新对象。或方法进行调用通过或调用函数,被调用的函数的指向第一个参数指向的。 this   JavaScript的this总是指向一个对象,而这个对象是基于函数运行时动态绑定的,并非函数声明时绑定。 函数调用方式 作为对象的方法调用 作为普通函数进行调用 作为构造器进行调用 通过a...

    PiscesYE 评论0 收藏0
  • 你不知道的JavaScript中卷 第一、二章

    摘要:表达式没有返回值,因此返回结果是。并不改变表达式的结果,只要让表达式不返回值按惯例我们用来获得这主要源自语言,当然使用或其他表达式也是可以的。不是数字的数字如果数学运算的操作数不是数字类型,就无法返回一个有效的数字,这种情况下返回值为。 这里的内容是读书笔记,仅供自己学习所用,有欠缺的地方欢迎留言提示。 第一部分 类型和语法 第1章 类型ECMAScript语言类型包括Undefin...

    levy9527 评论0 收藏0
  • Javascript数组系列一之栈队列

    摘要:所谓数组英语,是有序的元素序列。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。在栈中添加数据和删除数据也被称为推入和弹出,而且推入和弹出只会发生在栈的顶部。栈是一种数据结构,而队列则是一种的数据结构,即先进先出。 所谓数组(英语:Array),是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。 组成数组的各个变量称为数组的分量,也称...

    sunsmell 评论0 收藏0
  • 深究JavaScript——执行上下文

    摘要:一系列活动的执行上下文从逻辑上形成一个栈。堆栈中的上下文就会被依次执行并且弹出堆栈,直到回到全局的上下文。确定上下文中的指向对象确定指向或当前对象。 定义 执行上下文(也称执行环境execution context)(简称:EC)是个抽象的概念,是在函数被调用时,但是在函数体被真正执行以前所创建的。每个执行上下文都有一个变量对象(variable object),保存着当前环境中所有的...

    netScorpion 评论0 收藏0
  • 深究JavaScript——原型:prototype、constructor、__proto__

    摘要:是构造函数的属性,而不是实例对象的属性,指向原型对象。这个连接存在于实例与构造函数的原型对象而不是构造函数之间,也就是说实例对象与构造函数没有直接关系。 prototype、constructor、__proto__   prototype是站在构造函数的角度讨论原型对象的,用来实现基于原型的继承与属性的共享。__proto__是站在实例对象的角度讨论原型对象,构成原型链,同样用于实现...

    jeffrey_up 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<