Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么可以';在字符串上调用'Array.prototype.splice?_Javascript_Arrays - Fatal编程技术网

Javascript 为什么可以';在字符串上调用'Array.prototype.splice?

Javascript 为什么可以';在字符串上调用'Array.prototype.splice?,javascript,arrays,Javascript,Arrays,我知道我可以而且可能应该使用子字符串:) 出于教育方面的原因,我想知道为什么不能使用call对字符串执行拼接操作,据我所知,字符串是类似数组的对象。看来这应该行得通: Array.prototype.splice.call('filename.jpg', -3, 3).join(''); // return the last three chars 抛出errorTypeError:Object.isSealed在V8中对非对象调用。您需要先将其转换为数组对象 Array.prototype.

我知道我可以而且可能应该使用
子字符串
:)

出于教育方面的原因,我想知道为什么不能使用
call
对字符串执行拼接操作,据我所知,字符串是类似数组的对象。看来这应该行得通:

Array.prototype.splice.call('filename.jpg', -3, 3).join(''); // return the last three chars

抛出error
TypeError:Object.isSealed在V8中对非对象
调用。

您需要先将其转换为数组对象

Array.prototype.splice.call('filename.jpg'.split(''), -3, 3).join('');

在Javascript中,字符串是不可变的;它们创建后无法更改。所以没有“set char”或“splice”方法,因为字符串不能更改。但是,您可以对它们调用
split(“”)
将它们转换为数组,因此您可以使用
'filename.jpg'.split(“”).splice(-3,3).join(“”)
实现相同的效果。

可能是因为字符串是不可变的。“我理解它是一个类似数组的对象。”原语值确实可以转换为对应的对象,但它们仍然是不可变的。尽管我不确定错误来自何处。Firefox抛出
TypeError:property Array.prototype.splice.call(…)是不可配置的,无法删除
,这一点更加模糊(因为它看起来不像我们正在删除
Array.prototype.splice.call
).Array.prototype.splice.call(新字符串('filename.jpg'),-3,3.join(“”)@丹达维斯:怎么样?FWIW,
.splice
已经将
值转换为一个对象,因此这相当于传递一个基本字符串。@FelixKling:除了一个基本字符串错误,所以有些东西是不等价的……感谢您的解释,这是有意义的。还解释了为什么我可以直接使用
slice
,因为它不会修改原始对象。如果转换它,就没有任何理由再使用
Array.prototype.splice.call