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)

相关推荐

  • ECMAScript中的函数

    有 3 种定义函数的方式 函数声明 函数表达式 Function 构造函数(很少使用) 函数声明 function 关键字后需要指定函数名 function sum(num1, num2) { ret ...

  • javascript 笔记

    学习总结,顺带记录一点知识点,知识点来源于<javascript高级程序设计>, 渣渣博主正努力成为半渣渣. <script>标签 1.使用了src属性的<script& ...

  • javascript工厂模式,调用的方法

    function obj(){ var o={}; o.name="jim"; o.age=29; o.func=function(){ console.log(this.name ...

  • JavaScript 之 作用域

    学习目标:能够说出Javascript的两种作用域 能够区分全局变量和局部变量 能够说出如何在作用域链中查找变量的值 1.作用域 <script> //1.javaScript作用域:就是 ...

  • JavaScript this 关键字详解

    一.前言 this关键字是JavaScript中最复杂的机制之一.它是一个很特别的关键字,被自动定义在所有函数的作用域中.对于那些没有投入时间学习this机制的JavaScript开发者来说,this ...

  • 如何将二维数组作为函数的参数传递

    今天写程序的时候要用到二维数组作参数传给一个函数,我发现将二维数组作参数进行传递还不是想象得那么简单里,但是最后我也解决了遇到的问题,所以这篇文章主要介绍如何处理二维数组当作参数传递的情况,希望大家不 ...

  • 报告:JavaScript 开发者达1380 万,C#超越 PHP,Rust 增长最快

    出品|开源中国 文|白开水 研究公司 SlashData 最新发布的"State of the Developer Nation"第 20 版报告指出,全球开发者社区在过去六个月中 ...

  • javascript中的闭包这一篇就够了

    前端技术优选 今天 以下文章来源于程序员成长指北 ,作者koala 程序员成长指北专注 Node.js 技术栈分享,从 前端 到 Node.js 再到 后端数据库,祝您成为优秀的高级 Node.js ...

  • JavaScript 事件循环:从起源到浏览器再到 Node.js

    冰森 前端技术优选 今天 很多文章都在讨论事件循环 (Event Loop) 是什么,而几乎没有人讨论为什么 JavaScript 中会有事件循环.博主认为这是为什么很多人都不能很好理解事件循环的一个 ...

  • 用JavaScript打造AI应用-从Nodejs SDK 看DuerOS的技能开发

    为什么要掌握JavaScript呢? 使用JavaScript能能否开发AI应用么? 答案是肯定的. 全栈语言JavaScript 就全栈编程语言而言,与python 并驾齐驱的要算是JavaScri ...

  • 全栈必备JavaScript基础

    1995年,诞生了JavaScript语言,那一年,我刚刚从大学毕业.在今年RedMonk 推出的2017 年第一季度编程语言排行榜中,JavaScript 排第一,Java 第二,Python 反超 ...

  • Python和JavaScript哪个简单?Python入门!

    在编程界,Python和JavaScript都是非常具有影响力的编程语言,占据着主导性的地位,而且简单易学.通俗易懂,非常适合0基础小白.那么Python和JavaScript哪个更容易上手呢?我们通 ...

  • 如何使用原生的 JavaScript 代码,触发 SAP UI5 按钮控件的点击事件处理函数

    我的技术交流群里,有朋友提问: 我有个 UI5 按钮,想用原生 js 去触发 click 事件.在 dom 上检测到 click 已经触发了,但是按按钮的动作响应没有发生.请问如何解决,谢谢. 解决这 ...

  • 使用上下文数据安全地评估JavaScript

    eval()从一开始就在JavaScript中提供了该功能,作为从动态输入运行代码的一种方式.但是,它存在有据可查的问题,并且一般的建议是,如果有第三方将内容放入表达式中的任何可能性,则不应使用它. ...