[].valueOf()
方法重新调整数组本身。据此
document.write([["a"]],["b"])
应该返回 ['a']b 不是吗?但这并没有发生,它只是写ab
。我只是想知道这背后的原因。
对于字符串元素 .toString() 方法返回 this,
["a","b"].toString()//a,b
但是对于带有数组的元素,它应该返回
[["a"],"b"].toString()//[a],b
[].valueOf()
方法重新调整数组本身。据此
document.write([["a"]],["b"])
应该返回 ['a']b 不是吗?但这并没有发生,它只是写ab
。我只是想知道这背后的原因。
对于字符串元素 .toString() 方法返回 this,
["a","b"].toString()//a,b
但是对于带有数组的元素,它应该返回
[["a"],"b"].toString()//[a],b
当您将对象传递给 document.write 时,Javascript 使用 .toString() 将对象转换为字符串。在这种情况下,Array.toString()将展平并用逗号连接数组,并将其作为字符串返回。
["this", "is", "an", "array!"].toString(); // "this,is,an,array!"
[["a",["b"]], ["c"]].toString() // "a,b,c"
我们可以展开document.write([["a",["b"]], ["c"]])
如下:
var input = [["a",["b"]], ["c"], "d"];
Array.prototype.verboseToString = function verboseToString() {
// Make a copy of the array, so we don't destroy the original
var copy = this.slice(), i;
for (i = 0; i < copy.length; i++) {
// If this is an Array, call verboseToString() on it, and go deeper
if (copy[i] instanceof Array === true) {
copy[i] = copy[i].verboseToString();
}
}
// copy contains non-arrays and we're ignoring other types' toString() output
return copy.join(',');
}
document.write(input.verboseToString()); // "a,b,c,d"
document.write([["a"]]",",["b"])
写得到无限的参数,用逗号分隔,所以它实际上是预期的行为
为了打印您想要使用的内容:
document.write(["a","b"])
这样您将打印一个数组而不是数组列表
来自文档
您编写的文本将被解析为文档的结构模型。
因此,您发送一个数组,它只会将数组值评估为字符串,以创建一个文档结构,该结构[["a"]],["b"]
只有文本值。
如果你这样做:
document.write(["<a>a</a>", "<a>b</a>"])
你可以看到它创建了 2 个锚元素,,
因此它只是array.join(',')
或者只是提供这个:
document.write(["<a>a</a>"], ["<a>b</a>"])
这一次它将创建 2 个锚点,您不再看到逗号。