2017-05-06 38 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