var hello = 'hello';
Array.prototype.unshift.call(hello, '11') // gives error
Array.prototype.join.call(hello, ', ') // works, why??
有人可以向我解释为什么 .join 有效以及为什么 .unshift 没有
答案 0 :(得分:3)
因为字符串是不可变的,并且unshift
尝试分配给字符串的索引(属性),如
"hello"[4] = '1'
参考:http://www.ecma-international.org/ecma-262/6.0/#sec-string-exotic-objects:
String对象是一个奇特的对象,它封装了一个String值,并公开了与String值的各个代码单元元素对应的虚拟整数索引数据属性。 Exotic String对象始终具有名为" length"的数据属性。其值是封装的String值中的代码单元元素的数量。 代码单元数据属性和"长度"属性是不可写且不可配置的。
join
不会分配任何内容,只会读取属性,因此它适用于任何具有.length
的对象。
答案 1 :(得分:1)
试试这个:
String.prototype.unshift = function(el) {
let arr = [this];
arr.unshift(el);
return arr.join("");
}
var s = "BCD";
s = s.unshift("A");
console.log(s); // ABCD