Javascript 为什么记录此对象属性会得到与记录对象本身并查看属性不同的结果?

Javascript 为什么记录此对象属性会得到与记录对象本身并查看属性不同的结果?,javascript,Javascript,我现在正试图用react-redux设置socket io,我似乎遇到了一个奇怪的名称空间问题 console.log(socket); console.log(socket.disconnected); console.log(socket.id); console.log(socket); 第一个日志返回一个大对象,下面是两个属性 disconnected: false; id: PuAi01tcCcZgmJaAACM 然而,第二个和第三个日志返回的内容与对象最初所说的完全不同。Logg

我现在正试图用react-redux设置socket io,我似乎遇到了一个奇怪的名称空间问题

console.log(socket);
console.log(socket.disconnected);
console.log(socket.id);
console.log(socket);
第一个日志返回一个大对象,下面是两个属性

disconnected: false;
id: PuAi01tcCcZgmJaAACM
然而,第二个和第三个日志返回的内容与对象最初所说的完全不同。Logging socket.disconnected返回true,Logging socket.id返回undefined

万一套接字在两个日志之间发生了某种变化,我会放下最后一个日志。它返回原始日志,其中disconnected为false,id存在


这似乎是一些奇怪的名称空间问题?我不知道这是怎么发生的,但似乎有两个不同的套接字名称,访问名称为socket的属性似乎以其中一个为目标

解决方案

如果不希望对象的日志在现代浏览器中实时更新,请在记录对象之前将其解析为字符串:

const example = { foo: 'bar' };
console.log(JSON.stringify(example));
// or with pretty printing: 
console.log(JSON.stringify(example, null, 2));  
解释

在现代浏览器中,
console.log
不会记录字符串,而是记录对内存中实际javascript对象的引用。因此,当您查看记录的对象时,您的所有javascript都已运行,并且对象已发生了变化

const example = { foo: 'bar' };
console.log(example);
example.foo = 'baz';
// log will say { foo: 'baz' } (usually with a note that the value is live)
记录对象的属性时,如果该属性是不可变的(如字符串、布尔值或数字),它将记录对象的值,而不是引用。因此,如果您在记录字符串后对其进行更改,则原始字符串在控制台中不会更改

let example = 'foo';
console.log(example);
example = 'bar';
// log will say 'foo'