我有这个功能:
function addToArray() {
var thesesArrays = []; // an empty array
var sometheses = ["With I/O Speech, Larry Page Reminds Us Why Google Rules Tech", "Tech", "myID_xGr52srsiwi"];
thesesArrays.push(sometheses); // the empty array gains one array
Logger.log("thesesArrays[0][1] = " + thesesArrays[0]);
Logger.log("thesesArrays = " + thesesArrays);
}
我是JS编程(以及一般编程)的新手,所以它看起来像一个非常新手的问题。为什么thesesArrays[0][1]
和thesesArrays
的日志完全相同?
thesesArrays
日志不应该是这样的:[["With I/O Speech, Larry Page Reminds Us Why Google Rules Tech", "Tech", "myID_xGr52srsiwi"]]
?
答案 0 :(得分:2)
您对它们应该如何理解是正确的。
在JavaScript中,扩展本机Object类型的对象具有toString()
方法,该方法旨在将该实例表示为String
。碰巧的是,当您在数组上调用toString()
时,您将获得数组元素的所有toString()
值,并在它们之间放置逗号。
在您第一次打电话给Logger.log()
时,您将其传递给内存中的内容:
["With I/O Speech, Larry Page Reminds Us Why Google Rules Tech", "Tech", "myID_xGr52srsiwi"]
如果您在此阵列上调用toString()
,则会收到字符串:
"With I/O Speech, Larry Page Reminds Us Why Google Rules Tech,Tech,myID_xGr52srsiwi"
在所有元素上调用toString()
的结果是什么(因为是字符串而自行返回),然后在其间添加,
。
在第二次调用中,您提供包含数组thesesArrays
。这里适用相同的逻辑,因为它递归地遵循与上述相同的逻辑,但因为Array
中只有一个元素(它本身是Array
),所以不需要分隔逗号。 / p>
为了证明这一点,让我们将另一个数组添加到父数组thesesArrays
:
thesesArrays.push('my second array'.split(' '))
现在,如果您在toString()
上致电thesesArrays
,您会看到我们的新数组已添加到最后,以逗号分隔:
"With I/O Speech, Larry Page Reminds Us Why Google Rules Tech,Tech,myID_xGr52srsiwi,my,second,array"
供参考:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toString
答案 1 :(得分:1)
阵列不相等。 Example。在我的示例中,如果您查看javascript控制台,您将看到一个记录一个数组的Array [1]。另一个记录了3个字符串的数组[3]。
当您将数组添加到日志中预先存在的字符串时,您似乎正在将数组转换为字符串。这两个阵列转换为字符串是相同的。
答案 2 :(得分:1)
数组不一样,但是它们的字符串表示是。当一个数组在Javascript中转换为一个String时,'['和']'(反直觉地)不包括在内。
请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/toString
答案 3 :(得分:0)
您没有将theseArrays[0]
与theseArrays
进行比较,而是查看记录器中输出的字符串。通过在对象之前添加一些标签来创建字符串。
这不是比较对象的可靠方法。至少尝试比较运算符,你会发现对象是不同的。
问题源于+
试图变得聪明的事实,如果要向数组中添加字符串,Javascript会将数组转换为字符串:
var tab = ["a", "b"];
console.log( tab );
console.log( "a" + tab );
输出
["a", "b"]
aa,b