【发布时间】:2019-05-01 21:38:52
【问题描述】:
据我了解,一些 Array 方法可以通过使用 call 方法。在想出这个问题的答案时:
我遇到了一个我没有预料到的问题。如果没有收到此错误,我无法在字符串上使用 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