欢迎光临
我的个人博客网站

javascript深入参数传递

我们都知道javascript的基础数据类型有: UndefinedNullBooleanNumberString
如果从一个变量向另一个变量复制基本类型的值,会在变量对象上创建一个新值,然后把值复制到为新变量分配的位置上。

  • code
var num1 = 1; var num2 = num1; // 1 num2 = 5; // 5  console.log(num1) // 1 

此后,这两个变量可以参与任何操作而不会相互影响。

  • 函数传参有有区别吗?
var a = 5  function b(num) {     num = 4     return num } b(a); //4 a; //5 
  • 注意这只是基本数据类型, 如果改成引用类型会怎么样?
var p1 = {     name: "Tom" }  function b(obj) {     obj.name = "Jerry"     return obj } b(p1) // { name : "Jerry"} p1.name // Jerry 
栈内存 堆内存
p1, obj 指针地址 { name :”Tom” }
 obj.name = "Jerry" 

obj修改了堆内存里的name值, p1还是指向那个地址. 所以p1跟着变了.

  • 这样会怎么样?
var p1 = {     name: "Tom" }  function b(obj) {     obj.name = "Jerry"     obj = {}     obj.name = "Jack"     return obj } b(p1) // { name : "Jack"} p1; // { name: "Jerry" } 

看到结果按照上面的意思应该p1也是{ name : "Jack"}但是为什么不同呢?

1 . 先修改了共同指向的堆内存里的name值

  • 第一步
栈内存 堆内存
p1, obj 指针地址 { name :”Tom” }
  • 第二步
栈内存 堆内存
p1, obj 指针地址 { name :”Jerry” }

2 . obj重新赋值引用类型,其实就是改变了obj的指针,并没有改变p1的指针指向的地址里的值

  • 第三步
栈内存 堆内存
p1 指针地址 { name :”Jerry” }
obj 指针地址 { }
  • 第四步
栈内存 堆内存
p1 指针地址 { name :”Jerry” }
obj 指针地址 { name: “Jack” }
赞(0) 打赏
未经允许不得转载:张拓的天空 » javascript深入参数传递
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

专业的IT技术经验分享 更专业 更方便

联系我们本站主机

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏