【问题标题】:When taking values from an object, does unshift() change the source object?从对象获取值时, unshift() 会更改源对象吗?
【发布时间】:2020-08-06 05:12:45
【问题描述】:

当我设置以下代码的基本情况时引发了这个问题:

function withoutReverse(str, arrayFor = []){
    arrayFor.unshift(str[0]);
    if (str.length === 1) 
    return arrayFor.join("");
    else return withoutReverse(str.slice(1), arrayFor)  }

  let hola = "hello";  
  withoutReverse(hola);//-->olleh

我认为基础应该是str.length === 0,因为我假设 unshift 从字面上将源对象中的每个元素放入arrayFor。然后,我意识到这就是我使用 slice 的目的。

我在 mdn 中没有找到确凿的信息。我对吗? unshift() 并没有真正获取这些值(当存储在对象中时)?如果是这样,它是如何在内存中处理的?

谢谢

【问题讨论】:

  • 正如您可能已经尝试过的那样,unshift 与原始数组没有关联,它所做的只是获取一个对象并将其放在调用它的数组的开头并返回新数组size.当您使用 str[0] 时,它仅从数组 str 中获取对象,与添加任何其他字符串相同。 arrayFor.unshift("myobject")
  • unshift() 不影响“源对象”。这是不可能的,因为 Javascript 是 pass-by-value。这是一个语言特性,不是 unshift() 特有的任何东西,所以这可能就是你在 MDN 上找不到任何确凿信息的原因。它在内存中的处理方式是将str[0] 中的值复制并作为参数传递给unshift()
  • String 是 JS 中的原始类型,它是不可变的。尝试s = "foo"; s[0] = "b" 并看到s 仍然是"foo"unshift 确实改变了它的接收者,即方法正在操作的对象,它是 arrayFor 而不是 str

标签: javascript recursion functional-programming


【解决方案1】:

当您接到第 5 个电话时:

console.log(str) // "o"
arrayFor.unshift(str[0]); // str[0] === "o" 
console.log(str.length) // "1" because accessing the property here does not change it.

因此,您的退出条件现在为真。

对于 JS 中的函数:

  • 数字/字符串/布尔值作为值传递
  • 数组/对象作为引用传递

关于字符串的额外信息:

与某些编程语言(例如 C)不同,JavaScript 字符串是不可变的。这意味着一旦创建了字符串,就无法修改它。

Source MDN

return 'cat'[1] // 返回 "a"

当使用括号表示法进行字符访问时,尝试删除这些属性或为这些属性赋值将不会成功。所涉及的属性既不是 可写也不可配置。 (有关详细信息,请参阅 Object.defineProperty()。)

Source MDN

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多