我有一个JS示例,我正在玩原始类型。我开始尝试理解Javascript何时将原语转换为对象,但转向将其他原型函数替换为原始函数。在我的例子中,您可以看到我用Join替换charAt函数。我希望它只是将数组加入一个字符串并将其返回给我。相反,它在输出中添加了1。如果1对应于每个char的数组索引是有意义的,如果它们根本就在那里(a0l1e2r3t4(516)7),而是它产生:a1l1e1r1t1(111)我没有&#39期待。额外的1来自哪里?
String.prototype.getVal= function() {
return this;
}
var a = "alert(1)";
var b = a.getVal();
console.log(a); //"alert(1)"
console.log(typeof a); //"string" (still a primitive)
console.log(b); //"String {0: "a", 1: "l", 2: "e", 3: "r", 4: "t", 5: "(", 6: "1", 7: ")", length: 8, [[PrimitiveValue]]: "alert(1)"}"
console.log(typeof b); //"object"
a.constructor.prototype.charAt = [].join;
console.log("CharAt using Join:", b.charAt(1));//a1l1e1r1t1(111)?
答案 0 :(得分:2)
JavaScript join方法接受一个参数,即分隔符。自您传入1
后,它将使用该分隔符加入字符串alert(1)
的所有字符。
a + 1
l + 1
e + 1
r + 1
t + 1
( + 1
1 + 1
)
我们预计会出现8次1
,根据您的输出,这是正确的。
参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/join
要获得更好的视觉效果,请使用逗号或空格调用新的charAt
。