javascript - 列表赋值在 JavaScript 中是如何工作的?

标签 javascript list parameters variadic-functions

我正在阅读 Eloquent JavaScript练习部分,我在本书中遇到了以下代码的问题:

function arrayToList(array) {
  let list = null;
  for (let i = array.length - 1; i >= 0; i--) {
    list = {value: array[i], rest: list};
  }
  return list;
}
console.log(arrayToList([10, 20]));
// → {value: 10, rest: {value: 20, rest: null}}

首先,我不明白 console.log 怎么会有那个输出。我对 list = {value: array[i], rest: list}; 部分特别困惑。我知道在第一次迭代中,array[i] 等于 20,因此列表现在是 {value: 20, rest: null}。在第二次迭代中,array[i]10,因此列表现在是 {value: 10, rest: list}list 指的是 {value: 20, rest: null},因此我们有 list = {value: 10, rest: {value: 20, rest: null}} 。我的理解正确吗?如果是,我发现 list 在被分配时如何仍然记得它之前包含的值,即 {value: 20, rest: null},这让我非常困惑。有人可以解释一下吗?

其次,我不明白为什么会提到:

'Building up a list is easier when done back to front. So arrayToList could iterate over the array backwards (see the previous exercise) and, for each element, add an object to the list. You can use a local binding to hold the part of the list that was built so far and use an assignment like list = {value: X, rest: list} to add an element.'

为什么从前到后更容易建立列表?但是,是否可以在前后完成时构建一个列表?

第三,当我尝试将上面的代码更改为以下内容时:

function arrayToList(...array) { //Only change is from array to ...array
  let list = null;
  for (let i = array.length - 1; i >= 0; i--) {
    list = {value: array[i], rest: list};
  }
  return list;
}
console.log(arrayToList([10, 20]));
// → {value: [10, 20], rest: null} Why did the output change?

最佳答案

当您在第二个版本中使用扩展语法时,您是在说您希望将函数的所有参数收集到一个数组(称为“数组”)中。当您实际调用 函数时,您传递一个单个 参数:数组[10, 20]。因此,在函数中,array 将是 [[10, 20]] — 一个以该数组作为其单个元素的数组。因此,循环只会经历一次迭代。

如果您要调用第二个版本函数

console.log(arrayToList(10, 20))

您会得到更像您在第一个代码示例中得到的结果。函数中的“数组”参数将是一个包含两个 值的数组,1020

关于“表达式”是什么的问题,这是一种语法结构,很容易直观地“获得”,但(尤其是在 JavaScript 中)在细节上非常复杂。基本上,类似于数学(代数)构造或比较,甚至单个变量引用或函数调用之类的东西都是表达式。 语句 只能包含一个(可能很大)表达式,但语句也可以是 for 循环、varlet 声明、return 语句和各种其他内容。 JavaScript 语法通常会引入带有特定关键字的语句,except 表达式语句。

关于javascript - 列表赋值在 JavaScript 中是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51868919/

相关文章:

javascript - 使用 coffeescript 的 Rails 进度作业

javascript - 使函数能够采用不同的参数集

datetime - 如何在 PowerShell 中将 DateTime 作为参数传递?

javascript - 检查数组是否包含一个值[以有效的方式]

javascript - 单击一个组件中的按钮不会改变 React.js 中其他组件的值

应用于数据框中列表的 R 函数

list - 在 SML 中查找列表中的最大元素

javascript - JQuery 从 datepicker 获取可用日期对象列表

java - 枚举与其他枚举作为类型

javascript - 使用 jQUery UI 库的拆分器