Javascript 为什么不能将.prototype.pop.call()数组作为字符串?

Javascript 为什么不能将.prototype.pop.call()数组作为字符串?,javascript,arrays,string,prototype,Javascript,Arrays,String,Prototype,据我所知,通过使用 方法。在回答这个问题时: 我遇到了一个意想不到的问题。如果没有收到此错误,我无法对字符串使用pop.apply() “消息”:“未捕获的TypeError:无法删除[object]的属性“39” 字符串]” 为什么这会失败,为什么只有一些数组方法可以工作 let href=$('.anchor').prop('href'); Array.prototype.pop.call(href); console.log(href) 并非所有数组方法都可以在数组上使用。那些试图改

据我所知,通过使用 方法。在回答这个问题时:

我遇到了一个意想不到的问题。如果没有收到此错误,我无法对字符串使用
pop.apply()

“消息”:“未捕获的TypeError:无法删除[object]的属性“39” 字符串]”

为什么这会失败,为什么只有一些数组方法可以工作

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


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

因为字符串是不可变的。您应该改用
href=href.slice(0,-1)
=href.replace(/.$/s,”)
。它在错误中指出:
无法删除[object String]
的属性“39”。当您对数组调用'pop'时,它可能会找到数组的最终索引,获取返回它的值,并使用类似于
delete arr[39]
的内容删除该索引。但是试着对一个包含40个字符的字符串调用
delete str[39]
,看看会发生什么。某些数组方法之所以有效,是因为它们只调用同样存在于字符串上的函数。这个特殊的数组方法不起作用,因为您不能删除字符串的索引。@Bergi谢谢,这很有意义。我将做一些研究:)有趣的是,你不能让它返回一个新的字符串,而不是试图改变现有的字符串。我想我需要弄清楚
pop()
在引擎盖下做了什么(可能是TKoL说的)。