【发布时间】:2015-10-05 13:07:13
【问题描述】:
我很好奇 Node.js 通过 console.log(object) 打印对象的方式。
我在文件constructor.js下有以下代码(来自Learning Javascript Design Patterns book)
var defineProp = function(obj, key, value){
var config = {
value: value,
writable: true,
configurable: true
};
Object.defineProperty(obj, key, config );
}
var person = Object.create(Object.prototype);
defineProp(person, "car", "Delorean");
defineProp(person, "dateOfBirth", "1981");
defineProp(person, "hasBeard", false);
console.log(person); //This prints {} in Node.js
使用带有>node constructor.js 的代码运行会打印一个空对象。但是,如果我在 HTML 文件中运行代码,Chrome 会打印出我所期望的内容。
console.log(person); //Chrome prints Object {car: "Delorean", dateOfBirth: "1981", hasBeard: false}
注意:我仍然可以打印Node下的属性(例如console.log(person.car)),只是不能打印对象本身(例如console.log(person))
这是为什么? Chrome 和 Node 是否对控制台对象使用不同的原型,即使它们共享相同的 javascript 引擎?
【问题讨论】:
-
不确定它们为何不同,但如果将
enumerable: true添加到config对象,属性将在 node.js 中打印。 -
默认情况下,使用
defineProperty()创建的属性不可枚举。因此,也许 node.js 只向您显示可枚举属性,而 Chrome 显示不可枚举属性。console.log()不是标准中指定的东西,它是一个宿主对象,不是 Javascript 语言的官方部分,因此不同的环境可能有不同的行为。 -
node 中的 console.log 与 Chrome 中的非常不同。首先,节点打印到标准输出,因此必须重写其 console.log 以支持流。这意味着从一开始节点就没有使用与 Chrome 相同的 console.log。其次,从 0.6 版开始,节点的 console.log 是同步的(相对于 Chrome 的异步),因为人们希望在服务器崩溃之前看到他们打印的最后一个 console.log。不同步使得调试崩溃的服务器变得非常困难,因为在节点退出之前不会记录崩溃的原因
-
@slebetman 节点的
console.log()仅在 stdout 重定向到文件时同步。否则它在所有平台上总是异步的。 node 的 github 问题跟踪器上已经有几个关于此的问题。
标签: javascript node.js