5

[].valueOf()方法重新调整数组本身。据此

document.write([["a"]],["b"]) 

应该返回 ['a']b 不是吗?但这并没有发生,它只是写ab。我只是想知道这背后的原因。

对于字符串元素 .toString() 方法返回 this,

["a","b"].toString()//a,b

但是对于带有数组的元素,它应该返回

[["a"],"b"].toString()//[a],b
4

3 回答 3

4

当您将对象传递给 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"
于 2013-06-22T03:47:35.993 回答
1
document.write([["a"]]",",["b"]) 

写得到无限的参数,用逗号分隔,所以它实际上是预期的行为

为了打印您想要使用的内容:

document.write(["a","b"]) 

这样您将打印一个数组而不是数组列表

于 2013-06-22T03:46:21.973 回答
1

来自文档

您编写的文本将被解析为文档的结构模型。

因此,您发送一个数组,它只会将数组值评估为字符串,以创建一个文档结构,该结构[["a"]],["b"]只有文本值。

如果你这样做:

document.write(["<a>a</a>", "<a>b</a>"])

你可以看到它创建了 2 个锚元素,,因此它只是array.join(',')

或者只是提供这个:

document.write(["<a>a</a>"], ["<a>b</a>"])

这一次它将创建 2 个锚点,您不再看到逗号。

于 2013-06-22T03:57:46.003 回答