我可以在 JavaScript 中将新数组重新分配给数组变量吗?

2023-12-13

我对 JavaScript 中的数组以及在函数内操作它们有疑问。
这是书上的练习雄辩的 JavaScript。它涉及两个功能:

  • reverseArray():返回一个new与参数数组相反的数组。
  • reverseArrayInPlace(): 只是反转参数数组本身。

Inside reverseArrayInPlace(),我刚刚打电话reverseArray()创建一个新数组并重新分配给参数reverserArrayInPlace()。但是,当我显示传递的数组时,重新分配不会反映到传递的数组。
我认为 JavaScript 中的数组总是通过引用传递?

我还尝试将一个数组变量重新分配给另一个数组,如果在函数外部完成,则成功。可能是什么问题呢?
顺便说一句,该练习禁止使用reverse()JavaScript 中的方法。

function reverseArray(array) {
  var new_array = [];
  for (var i = array.length-1; i >= 0; i--)
    new_array.push(array[i]);
  return new_array;
}

function reverseArrayInPlace(array) {
  array = reverseArray(array);
}
	
var r1 = [1,2,3,4,5,6,7,8,9,10];

console.log("r1 ", r1.join(",")); 
// → 1,2,3,4,5,6,7,8,9,10

console.log("reverse of r1 ", reverseArray(r1).join(","));
// → 10,9,8,7,6,5,4,3,2,1

console.log("r1 ", r1.join(","));
// → 1,2,3,4,5,6,7,8,9,10

reverseArrayInPlace(r1);
// the changes are not reflected here

console.log("r1 reversed in place ", r1.join(",")); 
// → still 1,2,3,4,5,6,7,8,9,10;
// this should display r1 = 10,9,8,7,6,5,4,3,2,1

变量array你的职能reverseArrayInPlace是该函数的本地函数。因此,分配给它只会使范围忘记之前的值这是数组r1.

考虑以下 :

var a = 5;
function change(a) {
  // Inner 'a'
  a = 0;
  console.log("inside change : ", a);
}

// Outer 'a'
change(a); // → 0
console.log("outside change : ", a); // → 5

您可以看到,虽然全局范围和change的范围使用相同的名称a,它们不是相同的变量。分配给a inside change 永远不会影响外层a.

HOWEVER
对于一个对象(或所有属于Object.prototype,就像一个数组),更改函数内部的属性将有效地更改其外部。

要充分理解这一点,请仔细查看以下内容:

var o = {
  arr1: [1, 2, 3],
  arr2: [1, 2, 3],
  str: "foo",
  num: 1
};

console.log("before changing : ", o);

function change(a) {
  // Reassigning to properties of 'a'
  a.arr1[0] = 0;
  a.arr2 = [ "destroyed" ];
  a.str += " bar";
  a.num = a.num * 15;
  
  // Reassigning to 'a'
  a = { change: "Destroyed !" };
  
  console.log("inside change : ", a);
}


change(o); // → { change: "Destroyed !" }
console.log("outside change : ", o); // → initial 'o' with modified properties.

分配给a = { change: "Destroyed !" };还是没有影响o。但所有的改变o的属性被应用。

可以看到,最终的改变结果o gives :

{
  arr1: [0, 1, 3],     // First item changed.
  arr2: ["destroyed"], // It's a completely new array.
  str: "foo bar",      // " bar" was added.
  num: 15              // 1 * 15
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我可以在 JavaScript 中将新数组重新分配给数组变量吗? 的相关文章

随机推荐

  • MySQL:何时真正需要 MySQL 中的刷新权限?

    创建新表和用户时 我通常只调用以下命令 CREATE DATABASE mydb GRANT ALL PRIVILEGES ON mydb TO myuser localhost IDENTIFIED BY mypassword 我从来没有
  • 尝试在 React 中导入组件时出现问题

    我在尝试使用 React 导入组件时遇到问题 app js 1 Uncaught ReferenceError 未定义 require 于 5 12 在我 babel min js 24 在 r babel min js 24 在 e sr
  • 在 Windows 7 上安装 Python 并分发会出现“写入失败...权限被拒绝”

    我使用的是 Windows 7 我完全承认我不了解其权限模型 我正在其他选项卡中阅读相关内容 我的用户是管理员 当我尝试运行 python allocate setup py 时 出现 写入失败 权限被拒绝 错误 然后出现 错误 无法在安装
  • 调用并行化 foreach 时出现问题

    我在使用 System Threading Tasks Parallel ForEach 时遇到问题 每个要更新的进度条的主体 但Invoke方法有时会冻结 我将代码附加到进度条和按钮的表单中 private void button1 Cl
  • 如何显示MySQL中未完成的事务

    我做了一些没有提交的查询 然后应用程序被停止 如何显示这些未结交易并提交或取消它们 如何显示这些未结交易并提交或取消它们 没有打开的事务 MySQL 将在断开连接时回滚事务 您无法提交事务 IFAIK 您使用显示线程 SHOW FULL P
  • C# 中根据空格分割字符串

    我有一个字符串 dexter 是好是坏 我想通过根据空格分割该字符串来创建一个列表 我使用以下代码实现了这一点 string ss dexter is good annd bad var s string IsNullOrEmpty ss
  • 从 Nunit 获取失败测试列表

    我有一个包含超过 8000 个测试的测试套件 并且很难看出哪些测试在代码更改之间中断 这些测试用例是从某些日志文件中自动提取的查询 有没有一种简单的方法来获取 NUnit 运行的失败测试列表 理想情况下 我想比较运行之间哪些测试受到影响 您
  • Protobuf-net 对 Dictionary/KeyValuePair 的支持是如何工作的?

    我试图了解 protobuf net 的 Dictionary KeyValuePair 支持 我们希望使用底层二进制流和从 java 生成的 proto 文件 但生成的 proto 文件包含看起来像名为 Pair String Int32
  • iOS 应用程序捆绑包 ID 错误和 iTunesConnect

    如本文所述SO entry 我在 iOS 应用程序应用程序上传器中遇到错误 这些是我的价值观 在钥匙串中我有这个证书 iPhone Distribution ExampleCompany DistCertificateID 在我的devel
  • 获取Linux中每个进程的堆和堆栈的大小

    我想知道Linux中每个进程的堆和堆栈的大小 有什么办法可以找到吗 我发现 sbrk 0 会给我堆的结尾 但是如何找到堆的起始位置来获取堆大小呢 另外 关于堆栈大小 是否有任何方法可以通过任何库调用或系统调用找到每个进程的堆栈开头和当前堆栈
  • Spring 4 i18n & l10n(无法更改 HTTP 接受标头)

    我需要帮助来解决此错误消息 我正在使用 spring 4 我想在我的项目中实现 i18n 和 l10n 当我尝试更改语言时 会出现此消息 下面是我的代码 请问 有人可以帮我解决这个问题吗 https i stack imgur com tK
  • didReceiveData 未获取所有数据

    我正在尝试使用 NSURLConnection 下载 JSON 但除非我强制应用程序暂停几秒钟 否则我获得的数据并不完整 它总是在 2600 字节左右 而我的响应应该在 70000 左右 任何线索为什么会发生这种情况 谢谢 void con
  • 未检测到文档的语法约束(DTD 或 XML 模式)

    我有这个 dtd http fast code sourceforge net template dtd但是当我包含在 xml 中时 我收到警告 未检测到文档的语法约束 DTD 或 XML 模式 xml 是
  • 使用正则表达式捕获 html 标签内的内容

    首先 我知道这是一种不好的做法 我已经回答了很多问题 甚至这么说 但需要澄清一下我被迫使用正则表达式 因为该应用程序将正则表达式存储在数据库中并且只能以这种方式运行 我绝对不能改变功能 现在我们已经解决了这个问题 因为我总是使用 DOM 方
  • 无法使 PubNub WebRTC 教程正常工作

    我正在尝试按照 PubNub 教程构建我的第一个 WebRTC 应用程序 https www pubnub com blog 2015 08 25 webrtc video chat app in 20 lines of javascrip
  • 使用 FluentFTP 以最大值同时从 FTP 下载多个文件

    我想从 FTP 目录递归下载多个下载文件 为此我使用 FluentFTP 库 我的代码是这样的 private async Task downloadRecursively string src string dest FtpClient
  • 在本地使用 mpi 安装 fftw-2.1.5

    我正在尝试使用 enable mpi 标志在带有 linux 的 IBM 集群上安装 fftw 2 1 5 库 但此后我一直未能这样做 我需要 fftw 版本 2 1 5 因为 GADGET2 代码需要该版本 并且具有 mpi 支持 首先
  • Python - BeautifulSoup html解析处理gbk编码不佳 - 中文网页抓取问题

    我一直在修改以下脚本 coding utf8 import codecs from BeautifulSoup import BeautifulSoup NavigableString UnicodeDammit import urllib
  • 字典、哈希集的访问时间

    访问时间是多少 在字典中查找值 检查HashSet是否有值 是像C 0x的unordered map那样O 1 吗 是的 当您使用 Contains 方法或字典的索引器时 来自文档 Dictionary Of TKey TValue 泛型类
  • 我可以在 JavaScript 中将新数组重新分配给数组变量吗?

    我对 JavaScript 中的数组以及在函数内操作它们有疑问 这是书上的练习雄辩的 JavaScript 它涉及两个功能 reverseArray 返回一个new与参数数组相反的数组 reverseArrayInPlace 只是反转参数数