Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/375.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 什么决定了节点是打印“[object]”还是打印完整对象?_Javascript_Node.js - Fatal编程技术网

Javascript 什么决定了节点是打印“[object]”还是打印完整对象?

Javascript 什么决定了节点是打印“[object]”还是打印完整对象?,javascript,node.js,Javascript,Node.js,次要说明:我非常熟悉console.log(),JSON.stringify(),Object.prototype.toString(),util.inspect()等-这个问题不是问如何显示对象的内容,而是问为什么节点的行为会在不同的情况下发生变化 我知道我可以console.log(someObject)节点将打印: [object Object] { foo: 'bar' } 有一些关于这方面的好消息 我知道[object object]来自object.prototype.toS

次要说明:我非常熟悉
console.log()
JSON.stringify()
Object.prototype.toString()
util.inspect()
等-这个问题不是问如何显示对象的内容,而是问为什么节点的行为会在不同的情况下发生变化

我知道我可以
console.log(someObject)
节点将打印:

[object Object]
{
  foo: 'bar'
}
有一些关于这方面的好消息

我知道
[object object]
来自
object.prototype.toString()

我知道我可以
console.log(JSON.stringify(someObject,null,2)
节点将打印:

[object Object]
{
  foo: 'bar'
}
或者使用
util.inspect()
等。请参阅

但是,似乎有时节点会实际打印对象内容

如果我创建一个名为
runme.js
的新文件,其内容如下:

console.log({foo:'bar})

然后运行
node runme.js
node将打印

{foo:'bar'}

[对象对象]

为什么节点不打印
[object object]

编辑:根据Keith的问题,
[object object]
将在我运行时出现:

console.log(`Check me out ${{foo: 'bar'}}`)
日志
[对象对象]


是什么决定了node是否使用
对象.prototype.toString()
(又称
[Object Object]
)而不是打印对象的内容?

根据我的经验,
控制台.log
会检测何时传递对象,并像您展示的示例那样打印整个对象

console.log({foo:'bar})
//=>{foo:'bar'}
但是,当对象连接到字符串时,它将使用
.toString()
方法转换为字符串,然后传递到
控制台.log
方法

例如:

console.log(''+{foo:'bar'})
//=>[对象]
这是因为在传递到console.log方法之前,表达式的计算结果是
'+{foo:'bar'}.toString()

这就是我对其工作原理的理解。尽管内部工作可能更复杂。

控制台日志记录将输出
[object]
用于在作为参数传递给控制台方法之前转换为字符串的对象值,或者如果使用了对象值参数并将其插入作为第一个参数传递的格式字符串中

如果格式字符串中包含使用下一个未使用参数并将其嵌入格式字符串的类C百分比前缀转换序列,则会出现后一种情况

如果使用了格式字符串,并且传递给方法的(对象)参数多于格式字符串使用的参数,则作为对象的剩余未使用参数将记录为对象值,而不转换为字符串

因此,一些预期值和实际日志输出:

constsomeobject={a:“a”};
//预期输出:“字符串[对象]”
log(“字符串”+someObject);
//预期输出:“相同交易:[对象]”
console.log(“相同的交易:%s”,someObject);//按格式字符串转换
//预期输出:'someObject={a:“a”}'

console.log(“someObject=,someObject)//someObject未被format string使用!
如已计算出的,模板文本将使用.toString框住参数

但是,如果您发现在调试时经常使用模板文本,并且希望改用JSON.stringify

下面是一个简单的例子

函数tagJSON(字符串,…args){
常量输出=[];
设nextString=0;
设nextArg=0;
//循环所有字符串和参数(&A)
while(nextArg<参数长度){
push(字符串[nextString]);
push(JSON.stringify(args[nextArg]);
nextArg+=1;
下一个字符串+=1;
} 
//可能是结尾处留下的字符串。。
if(nextStringlog(tagJSON`strings将双引号${'hello world'}`);
有这样一个对象的示例,可能会有所帮助。例如
{foo:'bar'}
在不使用stringify的情况下仍然可以正常工作。@Keith添加了一个例子。根据答案,似乎ES6字符串文字在
控制台之前运行了
toString()
。log
可以做任何事情,@VLAZ不,它没有。不过这是个好问题!是的,这说明了为什么它是[object],理论上,虽然您可以创建自己的模板文字解析器来以不同的方式显示它。。谢谢@traktor53!我做了一个小编辑,因为
aa={a:'a'}
有点难读,但除此之外,这是完美的。这也正是发生的事情-请参阅问题中的编辑。一个ES6字符串文字正在运行
toString()
console.log()之前的
可以完成它的工作。