JavaScript 通过引用与通过值 [重复]

2024-04-07

我正在寻找一些很好的综合阅读材料,了解 JavaScript 何时按值传递内容、何时通过引用传递内容、何时修改传递的项目影响函数外部的值以及何时不影响函数外部的值。我还感兴趣的是,何时通过引用与通过值分配给另一个变量,以及是否遵循与作为函数参数传递不同的规则。

我已经做了很多搜索并找到了很多具体的例子(其中很多都是关于SO的),从中我可以开始拼凑出真正的规则,但我还没有找到一个单独的、写得好的文档描述了这一切。

另外,语言中是否有方法可以控制某些内容是按引用传递还是按值传递?

以下是我想了解的一些问题类型。这些只是示例 - 我实际上是想了解语言所遵循的规则,而不仅仅是特定示例的答案。但是,这里有一些例子:

function f(a,b,c) {
   a = 3;
   b.push("foo");
   c.first = false;
}

var x = 4;
var y = ["eeny", "miny", "mo"];
var z = {first: true};
f(x,y,z);

对于所有不同类型,x、y 和 z 的内容何时在 f 范围之外更改?

function f() {
    var a = ["1", "2", "3"];
    var b = a[1];
    a[1] = "4";
    // what is the value of b now for all possible data types that the array in "a" might hold?
}

function f() {
    var a = [{yellow: "blue"}, {red: "cyan"}, {green: "magenta"}];
    var b = a[1];
    a[1].red = "tan";
    // what is the value of b now and why?
    b.red = "black";
    // did the value of a[1].red change when I assigned to b.red?
}

如果我想制作一个对象的完全独立的副本(没有任何引用),那么最佳实践方法是什么?


我的理解是,这其实很简单:

  • JavaScript 是always按值传递,但是当变量引用对象(包括数组)时,“值”是对该对象的引用。
  • 更改变量的值never更改底层基元或对象,它只是将变量指向新的基元或对象。
  • 然而,改变一个property变量引用的对象的变化确实会更改底层对象。

因此,要完成一些示例:

function f(a,b,c) {
    // Argument a is re-assigned to a new value.
    // The object or primitive referenced by the original a is unchanged.
    a = 3;
    // Calling b.push changes its properties - it adds
    // a new property b[b.length] with the value "foo".
    // So the object referenced by b has been changed.
    b.push("foo");
    // The "first" property of argument c has been changed.
    // So the object referenced by c has been changed (unless c is a primitive)
    c.first = false;
}

var x = 4;
var y = ["eeny", "miny", "mo"];
var z = {first: true};
f(x,y,z);
console.log(x, y, z.first); // 4, ["eeny", "miny", "mo", "foo"], false

示例2:

var a = ["1", "2", {foo:"bar"}];
var b = a[1]; // b is now "2";
var c = a[2]; // c now references {foo:"bar"}
a[1] = "4";   // a is now ["1", "4", {foo:"bar"}]; b still has the value
              // it had at the time of assignment
a[2] = "5";   // a is now ["1", "4", "5"]; c still has the value
              // it had at the time of assignment, i.e. a reference to
              // the object {foo:"bar"}
console.log(b, c.foo); // "2" "bar"
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 通过引用与通过值 [重复] 的相关文章

随机推荐

  • 动态元素与强类型元素

    我是一名 Web 开发人员 目前正在使用 mvc3 razor 和Umbraco https en wikipedia org wiki Umbraco创建网络应用程序 我从事这项工作的时间不长 已经从使用动态元素转向使用强类型元素来遵循标
  • 使用现有绘图创建闪亮的下拉菜单

    我对 R 很陌生 所以这可能是非常明显的 但我真的被困住了 我已经创建了五个现有的绘图图表 我希望能够从下拉列表中选择闪亮的它们 我无法使现有图表名称和下拉列表之间的链接正常工作 我最近的尝试 不起作用 ui lt shinyUI flui
  • 删除百分比轴中的小数 - R [重复]

    这个问题在这里已经有答案了 我有一个图 我需要从百分比数字中删除小数 数据已经四舍五入 两位小数 数据示例 gt head df X 1 0 05 0 28 0 08 0 19 0 33 然后我用它来绘制它scale x continuou
  • Java 版本号的正则表达式

    我有一个正则表达式如下 d d d 它将字符串验证为 1 0 0 软件版本 我如何编辑它才能使以下字符串也有效 1 0 0 SNAPSHOT 1 0 0 RC 1 0 0 RELEASE 版本号后面可以跟有字母数字字符串 但前提是有 or
  • 更改循环位置时的 tJavaFlex 行为

    工作中遇到一些问题 我怀疑是因为对tJavaFlex缺乏了解 我在此测试作业中生成 10 行 并在 tJavaFlex 内生成循环 因此有 10 行进入 并且 开始 和 结束 部分中有一个循环 我预计每输入一行 都会生成 10 个相同的行
  • 如何使用我现有的 Web 项目实现数字签名

    我正在开发一个项目 用户需要对文档进行数字签名 我检查了谷歌并了解 sinadura 这是一个桌面应用程序 但我需要将其调用到我的网络应用程序中 我在 Linux 服务器上安装了 alfresco 社区版 https www alfresc
  • ViewPager PageTransformer 与支持库 v13

    我的应用程序使用Android的ViewPager和FragmentStatePagerAdapter 它只需要支持Android 4 x或更高版本 我正在为 ViewPager 使用 v13 支持库 所以我不需要处理 SupportFra
  • UITabBar 背景图像的图像缩放

    我在我的应用程序中创建了 UITabBarController Then in viewDidLoad 我想更改 UITabBar 背景图像 这是我试图使其工作的代码 class MainTabBarController UITabBarC
  • Angular 路由器:忽略路径参数中的斜杠

    我有动态路线could参数内包含斜杠或反斜杠 例如 http localhost 4200 dashboard T64 27D我应该导航到带有路线的页面T64 27D 这是我的导航方式this router navigate dashboa
  • 使用 React 前端和 Rails 后端的带有 google calendar api 的客户端 OAuth

    所以我试图做 google oauth 来为我的用户获取刷新令牌 实际上并没有使用 google oauth 来保存用户 当我使用客户端 OAuth 进行 google api 时 一切正常 但当您进行握手时 它们不提供刷新令牌 仅提供 a
  • Swift 不支持 SDK“iPhoneSimulator8.4.sdk”

    刚刚更新到 Xcode 7 0 1 在 El Capitan GM 上运行且禁用了 SIP 现在每次我尝试编译 Swift 项目时都会收到此错误
  • Lua:“拖动”数组中的元素序列

    我正在尝试创建一个函数 将连续数量的元素 拖动 到数组中的新位置 并限制为数组的当前大小 其他项目应该围绕 拖动 的项目晃动 例如 如果我的数组有 7 个元素 并且我想拖动中间的三个 1 2 3 4 5 6 7 lt keys a b C
  • 如何使用Watin / IE9测试文件下载?

    我正在尝试使用 Watin 2 1 0 针对 IE9 测试文件下载 我使用了问题已接受答案中的建议代码在 IE9 中使用 Watin 下载文件 https stackoverflow com questions 6125285 downlo
  • 在 Hadoop MapReduce 中解析 PDF 文件

    我必须在 Hadoop 的 MapReduce 程序中解析 HDFS 中的 PDF 文件 所以我从 HDFS 获取 PDF 文件为输入分割它必须被解析并发送到 Mapper 类 为了实现这个输入格式我已经经历过这个link http cod
  • 属性错误“模块”对象没有属性“DateField”

    我试图在 Satchmo Django 中扩展管理定义 并在尝试向 ProductOptions 添加 formfield override 时收到错误 属性错误 模块 对象没有属性 DateField from django contri
  • quartz 默认线程数是多少

    我是新来的Quartz 我确实设法弄清楚调度程序配置的默认值是org quartz threadPool threadCount 1 但它没有在任何地方找到这意味着什么 这是否意味着只有一个线程或者有其他 数字 我正在使用quartz sc
  • 如何使用蓝图将 Flasgger 与 Flask 应用程序结合使用?

    我正在使用以下命令将 Swagger UI 添加到我的 Python Flask 应用程序中Flasgger https github com rochacbruno flasgger 互联网上最常见的示例是使用基本 Flask 风格 ap
  • 使用 VS2017 启动 asp.net core 应用程序会创建新的应用程序池

    每次当我在 VS2017 的本地 IIS 下启动 ASP net Core 应用程序的调试器时 都会创建一个新的应用程序池 我希望应用程序在 DefaultAppPool 身份 下保持稳定 而不是创建新的应用程序 这个设置在哪里会影响这个
  • Laravel 查询带有“if”条件?

    我正在尝试使用 Laravel 4 制作高级搜索表单 这是查询 result DB table users ads gt join ads users ads ad id ads id gt orderBy column method gt
  • JavaScript 通过引用与通过值 [重复]

    这个问题在这里已经有答案了 我正在寻找一些很好的综合阅读材料 了解 JavaScript 何时按值传递内容 何时通过引用传递内容 何时修改传递的项目影响函数外部的值以及何时不影响函数外部的值 我还感兴趣的是 何时通过引用与通过值分配给另一个