node js为什么在与字符串一起记录时会折叠对象?

时间:2017-03-02 11:07:30

标签: javascript node.js

我正在做一些基本的JSON解析,并想知道为什么节点js在与字符串一起记录时折叠对象

所以例如在下面的代码中,如果我去console.log(processedData)它不会折叠对象并显示整个字符串但是如果我去console.log('Body: ' + processedData)它会折叠对象然后去[对象]对象] [对象] ....我知道如何使用util再次扩展它们,但我很好奇它背后的逻辑,因为我对节点很新。我想我可能会错过任何事情。

const http = require('http');
const util = require('util');

var options = {
host: 'http://nodejs.org/dist/index.json'
// host: 'en.wikipedia.org',
// path: '/w/api.php?action=query&list=allpages&apfrom=Imperial&aplimit=500&format=json'
};

var req = http.get('http://nodejs.org/dist/index.json', function(res) {
console.log('STATUS: ' + res.statusCode);
console.log('HEADERS: ' + JSON.stringify(res.headers));

let body = '';
res.on('data', function(chunk) {
    body += chunk;
}).on('end', function() {
    let processedData = JSON.parse(body);
    console.log('Body : ' + processedData);
    console.log(typeof body);
})
});

req.on('error', function(e) {
console.log('ERROR: ' + e.message);
});

3 个答案:

答案 0 :(得分:3)

致电时

console.log(processedData)

您将整个对象传递给console.log,以便它可以做到这一点。但是,当你打电话

console.log('Body: ' + processedData)

您将'Body: ' + processedData的结果传递给console.log。对此表达式的求值会导致processedData转换为其字符串表示形式,如果您未在对象上定义toString,则只需[object Object],因此您会看到{{1}被记录。

实现目标的最简单方法是简单地将它们作为单独的参数传递:

Body: [object Object]

答案 1 :(得分:1)

也许我们应该回答以下问题:"如果您按照以下方式进行操作 - 预期会出现什么样的结果?"

var myVar = "Body : " +  processData;

当js引擎尝试评估这样的表达式时,它知道表达式的第一个参数是' string',因此它尝试将字符串与另一个字符串连接起来。 processData如何成为字符串?通过调用' toString()'在processData上。

为了达到您期望的结果,尝试以这种方式使用console.log:

console.log("Body:", processData);

答案 2 :(得分:0)

这是因为JS类型强制。

在第一种情况下,您将其打印为对象,但在第二种情况下,将其添加到字符串('Body: ' + processedData) - 并根据JS类型强制规则将其转换为字符串(它将其连接到字符串) 您可以按照建议使用util模块,也可以使用console.dir({body:processedData},{colors:true,depth:4});