【问题标题】:Why are you unable to Array.prototype.pop.call() a string?为什么你不能 Array.prototype.pop.call() 一个字符串?
【发布时间】:2019-05-01 21:38:52
【问题描述】:

据我了解,一些 Array 方法可以通过使用 call 方法。在想出这个问题的答案时:

Remove last forward slash from href anchor

我遇到了一个我没有预料到的问题。如果没有收到此错误,我无法在字符串上使用 pop.apply()

"message": "Uncaught TypeError: Cannot delete property '39' of [object 字符串]"

为什么会失败,为什么只有一些数组方法有效?

let href = $('.anchor').prop('href');
Array.prototype.pop.call(href);

console.log(href);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="https://example.com/my-account/#example/" class="anchor">...</a>

【问题讨论】:

  • 因为字符串是不可变的。您应该改用href = href.slice(0, -1)= href.replace(/.$/s, "")
  • 它在错误中说:Cannot delete property '39' of [object String]。当您在数组上调用“pop”时,它可能会找到数组的最终索引,获取要返回的值,并使用delete arr[39] 之类的内容删除该索引。但是尝试在 40 个字符的字符串上调用 delete str[39],看看会发生什么。
  • 一些数组方法起作用的原因是它们只调用字符串上也存在的函数。这个特定的数组方法不起作用,因为您不能删除字符串的索引。
  • @Bergi 谢谢,这是有道理的。我会做一些研究:) 有趣的是你不能让它返回一个新的字符串,而不是尝试改变现有的字符串。我想我需要弄清楚 pop() 在幕后做了什么(可能是 TKoL 所说的)。

标签: javascript arrays string prototype


【解决方案1】:

并非所有数组方法都可以用于数组。那些试图改变字符串的方法是行不通的。在 Javascript 中,字符串是不可变的。所以像pushpopshiftsplice 这样的方法不起作用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 2016-09-22
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    相关资源
    最近更新 更多