【问题标题】:exercise from eloquent javascript listTo Array: why isn't the value of list null globally从雄辩的javascript listTo Array练习:为什么列表的值不是全局null
【发布时间】:2018-09-11 12:41:22
【问题描述】:

为什么list的值全局不变?不应该为空吗?

let list = {value: 1, rest: { value: 2, rest: null}};

function listToArray(list){
    let array = [];
    while( list != null)
    {
        array.push(list.value);
        list = list.rest;
    }
    return array;
}

为什么全局array1通过下面的函数后改变了, 如果用函数中的局部变量数组来引用呢?

让数组1 = [1,2,3];

函数 reverseArrayInPlace(数组){

for(let i = 0; i

  let temp = array[i];

  array[i] = array[array.length - i - 1];

  array[array.length - i - 1] = temp;

}

}

【问题讨论】:

  • 你到底想做什么?列表应该是什么?
  • Javascript 没有列表对象,所以如果你有一个列表,你应该已经在使用数组了。什么是list,什么是list.restlist.value?为什么您希望 list 为空?除非list 在传入时为空,否则您将陷入无限循环。
  • 这是一个来自文本 eloquent JavaScript 的练习,它将嵌套对象转换为数组。练习在本章 - 数据结构:对象和数组中。该列表是嵌套对象,键为“value”和“rest”。 rest 保存嵌套对象,其键也是 value 和 rest,直到 rest 为 null
  • 在方法中访问或更改list变量时,使用局部变量list代替全局变量。
  • @pseudobbs 不,你没有。如果列表为空,则返回一个空数组

标签: javascript


【解决方案1】:

具有value和rest的变量列表对象与函数中使用的参数列表不同。如果我删除参数,你会得到你所期望的。

let list = {value: 1, rest: { value: 2, rest: null}};

function listToArray () {
  let array = [];
  while( list != null)
  {
    array.push(list.value);
    list = list.rest;
  }
  return array;
}

let array = listToArray();

console.log( 'list : ', list );

这是你的第二个例子:

let array1 = [1,2,3];

function reverseArrayInPlace (array) {
  
  // Here array is pointing to array1
  
  for(let i = 0; i < Math.floor(array.length/2); i++){
   
    let temp = array[i];
    
    // What is happening here is that you are modifying directly whats in array
    // by affecting something to an index of it => array[ i ].
    // Since array is pointing on array1, array1 is getting modified
    array[i] = array[array.length - i - 1];

    array[array.length - i - 1] = temp;
    
  }

}

reverseArrayInPlace ( array1 );

console.log( array1 );

如果我在做任何事情之前使用 slice,array1 将保持不变:

let array1 = [1,2,3];

function reverseArray ( array ) {
  
  // array.slice() is used to copy the array, array is now pointing to a copy of array1
  array = array.slice();
  
  for(let i = 0; i < Math.floor(array.length/2); i++){
   
    let temp = array[i];
    
    // Since array is now a copy of array, it is not modifying the original one
    array[i] = array[array.length - i - 1];

    array[array.length - i - 1] = temp;
    
  }

}

reverseArray ( array1 );

console.log( array1 );

【讨论】:

  • 查看我的编辑并告诉我为什么 array1 在通过函数 reverseArrayinPlace 后会全局更改?
  • 因为你正在“原地”做相反的事情。这意味着您不会在反转数组之前创建数组的副本。该函数正在使用一个临时变量来让您就地执行此操作。这就是为什么原始数组正在改变的原因。我将编辑以添加您的示例。
猜你喜欢
  • 1970-01-01
  • 2021-10-28
  • 2015-03-31
  • 2018-05-31
  • 2015-07-25
  • 2021-05-23
  • 2018-03-09
  • 2017-07-29
  • 2018-05-17
相关资源
最近更新 更多