# javascript基础之数据传输原理

javascript基础之数据传输原理

js的数据类型可以划分为两种:
一种
javascript的原始数据类型:undefined、null、number、string、boolean、symbol。
另一种是:
javascript的引用数据类型:

数据存放位置以及方式

原始数据类型存放在栈(stack)中,直接存储在变量访问的位置。(是他是他就是他),栈中包含 变量的标识和值。
引用数据类型 可以说是堆区和栈区的结合。栈区存放对象的标识符和指针。堆区存放该对象。
我们声明的变量存放在栈中,而后面所跟的数据类型,决定的这个变量的数据类型。

按值传递

按值传递其实就对栈中值的拷贝
在函数里面改变传递的值不会影响到外面

var a = 10;
var b = a
b++
console.log('b is' + b)  // 11
console.log('a is' + a) // 10

也就是说b其实是a的副本,b的变动并不会影响a。

引用传递

引用传值,正如其名:引用。他修改的是指向对象所在位置的指针。当指向发生变化,变量也会相应的发生变化:
在函数里面改变传递的值会影响到外面

var  a = [1,2,3]
var b = a
a.push[4]
console.log('a is' + a) // [1,2,3,4]
console.log('b is' + b) // [1,2,3,4]

在这里,a是应用类型的值,他指向了数组[1,2,3,4]所在堆内存的位置。然后她将指针赋值给了b,这时候b的指针也指向数组[1,2,3,4]。当数组放生变化的时候,a、b也会跟着变化。

var  a = [1,2,3]
var b = a
a = [1,2,3,4]
console.log('a is' + a) // [1,2,3,4]
console.log('b is' + b) // [1,2,3]



function someFun (num, obj1, obj2) {
    num *= 20;
    obj1.name = "李四";
    obj2 = 123;
}

let num = 10;
let person1 = {name: "张三"};
let person2 = {age: 24};

someFun(num, person1, person2);
console.log(num, person1, person2)

在这里呢,跟上面不一样。因为a = [1,2,3,4]代表堆内存中重新开辟一处空间存放该数组,而指针重新赋给了a,a、b此时的指针指向是不一样的。

共享传参

js中基本类型是按值传递,对象类型按共享传递。调用函数传参时,函数接受对象实参引用的副本。
对于传递到函数参数的对象类型,如果直接改变了拷贝的引用,那是不会影响到原来的那个对象;如果是通过拷贝的引用,去进行内部的值的操作,那么就会改变到原来的对象的。

let setArray = function (arr) {
    var b = [1, 2, 3];
    arr = b;
};
var arr = [4,5,6]
setArray(arr)
console.log(arr) //[4,5,6]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值