一个非常简单的代码来说明差异。
var x = [0, 3, 1, 2];
console.debug('debug', x);
console.log('log', x);
// above display the same result
x.splice(1, 2);
// below display kind of a different result
console.debug('debug', x);
console.log('log', x);
alt text http://sixbytesunder.com/stuff/firebug_console.png
javascript值完全相同,但console.log()显示的方式与应用splice()
方法之前略有不同。正因为如此,我失去了几个小时,因为我认为拼接行为很有趣,使我的阵列多维或类似。
我只是想知道为什么这样的工作。有人知道吗? :)
答案 0 :(得分:9)
如果您查看文档it says:
控制台知道四种不同的类型 消息,如下所述 [...]
有关更多信息,另请参阅Console API 关于不同的信息 命令。
在console.log
处的shows页面上查看:
如果记录了对象,它们将是 不是作为静态文本写的,而是作为 可以的交互式超链接 单击以检查对象 Firebug的HTML,CSS,脚本或DOM 标签。
所以,我认为在splice
之前,数组在内部仍然是Array(我知道,是一种对象),但在操作之后,你得到一个普通的对象,至少在内部。我知道这是一个很弱的解释,但Firebug在控制台中有更多奇怪的行为。
BTW,ECMAScript specification没有任何用处,但我们可以在关于Array.prototype.splice
(第15.4.4.12节)的部分中阅读:
splice
功能是故意的 通用的;它不需要它this
值是一个Array对象。 因此可以转移到 其他类型的物体用作 方法。是否splice
功能 可以成功应用于主机 对象依赖于实现。
答案 1 :(得分:1)
在Firebug 1.6a12中我得到了
debug [0, 3, 1, 2] blog.php (line 80)
log [0, 3, 1, 2]
debug [0, 2] blog.php (line 85)
log [0, 2]
debug()
行包含指向console.debug()
行的源行的链接。