用join替换charAt会导致奇怪的输出

时间:2016-07-05 00:07:52

标签: javascript

我有一个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)?

1 个答案:

答案 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