2017-05-06 33 views
1

我想有每个插座消息的控制台日志发送到服务器之间加空格,所以我很快就裹socket.iosocket.emit功能控制台日志中的每个字符

var self = this; 
    this.socket = io.connect(); 

    this.socket._emit = this.socket.emit; 
    this.socket.emit = function(){ 
     console.log(...arguments[0]); 
     self.socket._emit(...arguments); 
    }; 

它的工作原理,除了一些细微奇怪的控制台日志打印。这发生在Chrome和Firefox上。到底是怎么回事?

enter image description here


我没有用arguments[0]而不是...arguments[0]作为参数传递给一个函数调用中使用时解决这个问题,但我还是好奇..

+1

我怀疑你有一个编码为UTF-16的字符串 – Phrogz

+0

你能进一步解释在这种情况下的含义吗? – jozenbasin

+0

我的猜测是错误的。我不知道[扩展语法](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_operator)。全面解答。 – Phrogz

回答

3

spread syntax打破了单一的字符串值分成每个角色的参数。下面的例子应该说清楚。

var str = "abc"; 
 
console.log(str);   // abc 
 
console.log(...str);  // a b c 
 
console.log("a","b","c"); // a b c 
 

 
var ary = [...str]; 
 
console.log(ary);   // (3) ["a", "b", "c"] 
 

 
showArgs(...str); 
 
function showArgs(x, y, z){ 
 
    console.log(x); // a 
 
    console.log(y); // b 
 
    console.log(z); // c 
 
}

你为什么要使用console.log(...arguments[0])?你希望/期望通过在那里使用...发生了什么?

+0

我使用'...'传递给原函数的实现,并用它来打印参数而不用考虑它。它仍然令人惊讶,因为悬停在'...'对象上显示字符串为字符串。 – jozenbasin