【问题标题】:Why are my variables different depending on whether they're an array or an integer?为什么我的变量会根据它们是数组还是整数而有所不同?
【发布时间】:2016-11-29 16:36:28
【问题描述】:

在互联网上阅读有关 Javascript 数组及其方法的信息,我发现了一些东西,但我不明白发生了什么。我专门阅读了 Array.reverse() 方法:

var numbers = [60, 50, 20, 30];
var value = numbers.reverse();

console.log(numbers); // [30, 20, 50, 60]
console.log(value); // [30, 20, 50, 60]

让我感到困惑的是,为什么这里的变量“numbers”的值发生了变化?

我很困惑,因为这里不一样:

var number = 3;
var value = number * 2;

console.log(number); // 3
console.log(value); // 6

我意识到在第一个示例中我正在处理数组,而在第二个示例中只是整数。我不明白为什么在对变量“value”执行函数时会修改变量“number”的值。但是在第二个示例中它没有被修改。这里有什么区别?

【问题讨论】:

  • reverse() 改变数组
  • 这里的关键是,根据规范,reverse 在原地运行并返回对源数组的引用。虽然我觉得这是一个不幸的设计选择,但其根源在于您有两个变量引用了一个数组对象。

标签: javascript arrays function variables methods


【解决方案1】:

Array.prototype.reverse() 将数组原地反转,即在此过程中修改原始数组。

来自 MDN:

reverse() 方法将数组反转就地。第一个数组 元素成为最后一个,最后一个数组元素成为 首先。

var a = ['one', 'two', 'three'];
a.reverse(); 

console.log(a); // ['three', 'two', 'one']

在第二种情况下,您正在使用primitives 进行简单计算。这不会改变计算中使用的原语。

【讨论】:

    【解决方案2】:

    让我感到困惑的是为什么变量的值是 这里的“数字”变了吗?

    因为变量numbers是对内存中数组的引用,当reverse被调用时,它会修改这个数组。

    在这里你正在使用原语

    var number = 3;
    var value = number * 2;
    

    在 JS 中原语是不可变的

    【讨论】:

    • 感谢@Maximus,这与蒂莫的回答相结合。现在一切都说得通了。谢谢。
    • @Fabian,没问题,如果你觉得有帮助,你可以投票 :)
    猜你喜欢
    • 2023-03-16
    • 2015-02-25
    • 2021-09-05
    • 2020-09-10
    • 2010-09-28
    • 2018-04-05
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多