Javascript数组valueOf方法

时间:2013-06-22 03:42:54

标签: javascript

[].valueOf()方法返回数组本身。根据这个

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

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

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

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

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

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

3 个答案:

答案 0 :(得分: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"

答案 1 :(得分:1)

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

用逗号分隔写的get无限参数,这实际上是预期的行为

为了打印你想要的东西:

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

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

答案 2 :(得分:1)

来自 docs

  

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

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

如果你这样做:

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

您可以看到它创建了两个由,分隔的锚元素,因此它只是array.join(',')

或者只是提供:

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

这次它会创建2个你不再看到逗号的锚点。