JavaScript是按引用传递or值传递?

今遇js基础类型等问题,已经有点模糊,遂做总结。javascript

 

前言:java

JavaScript原始类型:Undefined、Null、Boolean、Number、String、Symbol JavaScript引用类型:Object;函数

原始类型又被称为基本类型,原始类型保存的变量和值直接保存在栈内存(Stack)中,且空间相互独立,经过值来访问;虽然原始类型的值是储存在相对独立空间,可是它们之间的比较是按值比较的;ui

引用类型即Object 类型,再往下细分,还能够分为:Object 类型、Array 类型、Date 类型、Function 类型 等。与原始类型不一样的是,引用类型的内容是保存在堆内存中,而栈内存(Heap)中会有一个堆内存地址,经过这个地址变量被指向堆内存。spa

1.JavaScript中的基本类型传递

一个咱们常常遇到的问题:“JS中的值是按值传递,仍是按引用传递呢?”code

因为js中存在复杂类型和基本类型,对于基本类型而言,是按值传递的.对象

var a = 1; function test(x) { x = 10; console.log(x); } test(a); // 10 console.log(a); // 1

虽然在函数testa被修改,并无有影响到 外部a的值,基本类型是按值传递的.ip


2.复杂类型按引用传递?

咱们将外部a做为一个对象传入test函数.内存

var a = { a: 1, b: 2 }; function test(x) { x.a = 10; console.log(x); } test(a); // { a: 10, b: 2 } console.log(a); // { a: 10, b: 2 }

能够看到,在函数体内被修改的a对象也同时影响到了外部的a对象,可见复杂类型是按引用传递的.it

但是若是再作一个实验:

var a = { a: 1, b: 2 }; function test(x) { x = 10; console.log(x); } test(a); // 10 console.log(a); // { a: 1, b: 2 }

外部的a并无被修改,若是是按引用传递的话,因为共享同一个堆内存,a在外部也会表现为10才对.
此时的复杂类型同时表现出了按值传递按引用传递的特性.


3.按共享传递

复杂类型之因此会产生这种特性,缘由就是在传递过程当中,对象a先产生了一个副本a,这个副本a并非深克隆获得的副本a,副本a地址一样指向对象a指向的堆内存.

所以在函数体中修改x=10只是修改了副本a,a对象没有变化. 可是若是修改了x.a=10是修改了二者指向的同一堆内存,此时对象a也会受到影响.

有人讲这种特性叫作传递引用,也有一种说法叫作按共享传递.

相关文章
相关标签/搜索