在nodejs'检查'就像一个保留字

时间:2012-07-25 14:49:14

标签: javascript node.js

在node.js中,调用具有名为inspect的元素的对象上的console.log会打印undefined,即使它仍然作为对象运行。我假设这是因为节点在内部使用inspect来打印东西。

var thingTwo = {
  num: 1,
  func: function (x) { 2; },
  inspect: function (x) { "hi"; },
};

console.log(thingTwo);  // undefined

为了避免将来出现此陷阱,是否有其他单词列表会破坏标准功能?

2 个答案:

答案 0 :(得分:4)

很酷,这引起了我的好奇心,事实上,有一个没有记录的功能,其中一个对象可以提供它自己的inspect方法。 util.js中的相关代码:

function formatValue(ctx, value, recurseTimes) {
  // Provide a hook for user-specified inspect functions.
  // Check that value is an object with an inspect function on it
  if (value && typeof value.inspect === 'function' &&
      // Filter out the util module, it's inspect function is special
      value.inspect !== exports.inspect &&
      // Also filter out any prototype objects using the circular check.
      !(value.constructor && value.constructor.prototype === value)) {
    return String(value.inspect(recurseTimes));
  }

即,仅当inspect存在且是触发行为的函数时才会出现。

答案 1 :(得分:0)

如果某个对象具有inspect属性,则它是一个函数,console.log将打印其返回值。

$ node
> console.log({ inspect: function() { return 'hi'; } });
hi

如果我们查看the source,我们会发现无法避免此行为。如果对象的inspect是函数,console.log将打印其返回值。


请注意,在Node 0.6.x及之前,console.log实际上并不打印undefined,它只是打印一个空行。如果您在REPL中执行此操作,则只会看到undefined