Pass arguments to console.log as first class arguments via proxy function

Javascript

Javascript Problem Overview


console.log takes an unspecified number of arguments and dumps their content in a single line.

Is there a way I can write a function that passes arguments passed to it directly to console.log to maintain that behaviour? For example:

function log(){
    if(console){
        /* code here */
    }
}

This would not be the same as:

function log(){
    if(console){
        console.log(arguments);
    }
}

Since arguments is an array and console.log will dump the contents of that array. Nor will it be the same as:

function log(){
    if(console){
        for(i=0;i<arguments.length;console.log(arguments[i]),i++);
    }
}

Since that will print everything in different lines. The point is to maintain console.log's behaviour, but through a proxy function log.

+---

I was looking for a solution I could apply to all functions in the future (create a proxy for a function keeping the handling of arguments intact). If that can't be done however, I'll accept a console.log specific answer.

Javascript Solutions


Solution 1 - Javascript

This should do it ..

function log() {
    if(typeof(console) !== 'undefined') {
        console.log.apply(console, arguments);
    }
}

Just adding another option (using the spread operator and the rest parameters - although arguments could be used directly with the spread)

function log(...args) {
    if(typeof(console) !== 'undefined') {
        console.log(...args);
    }
}

Solution 2 - Javascript

There is a good example from the html5boilerplate code that wraps console.log in a similar way to make sure you don't disrupt any browsers that don't recognize it. It also adds a history and smoothes out any differences in the console.log implementation.

It was developed by Paul Irish and he has written up a post on it here.

I've pasted the relevant code below, here is a link to the file in the project: https://github.com/h5bp/html5-boilerplate/blob/master/js/plugins.js

// usage: log('inside coolFunc', this, arguments);
// paulirish.com/2009/log-a-lightweight-wrapper-for-consolelog/
window.log = function(){
  log.history = log.history || [];   // store logs to an array for reference
  log.history.push(arguments);
  if(this.console) {
    arguments.callee = arguments.callee.caller;
    var newarr = [].slice.call(arguments);
    (typeof console.log === 'object' ? log.apply.call(console.log, console, newarr) : console.log.apply(console, newarr));
  }
};

// make it safe to use console.log always
(function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,timeStamp,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();){b[a]=b[a]||c}}((function(){try {console.log();return window.console;}catch(err){return window.console={};}})());

Solution 3 - Javascript

Yes.

console.log.apply(null,arguments);

Although, you may need to loop through the arguments object and create a regular array from it, but apart from that that's how you do it.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionadityaView Question on Stackoverflow
Solution 1 - JavascriptGabriele PetrioliView Answer on Stackoverflow
Solution 2 - JavascriptnheinrichView Answer on Stackoverflow
Solution 3 - JavascriptNiet the Dark AbsolView Answer on Stackoverflow