5

I use Firefox.

This code logs [].

var log = console.log;

function new_comb(aComb) {
    var res = [];
    log(aComb); // <- This is the line
    for (var p in aComb) {
        var peg = aComb[p];
        var current = peg[peg.length - 1];
        for (var i = 0; i < aComb.length; i++) {
            if (i == p) continue;
            if (current > aComb[i][aComb[i].length - 1]) continue;
            var tmp = aComb.splice(0);
            tmp[i].push(current);
            tmp[p].pop();
            res.push(tmp);
        }
    }
    return res;
}

var comb = [
    [3, 1],
    [9, 2],
    [15, 0]];
var res = new_comb(comb);

This code logs the correct value.

var log = console.log;

function new_comb(aComb) {
    var res = [];
    log(aComb); // <- This is the line
    // note that I comment this out.
    /*for (var p in aComb) {
        var peg = aComb[p];
        var current = peg[peg.length - 1];
        for (var i = 0; i < aComb.length; i++) {
            if (i == p) continue;
            if (current > aComb[i][aComb[i].length - 1]) continue;
            var tmp = aComb.splice(0);
            tmp[i].push(current);
            tmp[p].pop();
            res.push(tmp);
        }
    }*/
    return res;
}

var comb = [
    [3, 1],
    [9, 2],
    [15, 0]];
var res = new_comb(comb);

Why is this happening?

4
  • 1
    Not your question, but you should prefer something like var log = console.log.bind(console); to keep context Commented Aug 14, 2013 at 11:46
  • 1
    Or better yet, with console.log or any other host-provided function: function log(msg) { return console.log(msg); } Host-provided functions can be (and are allowed to be) very squirrelly indeed. They're not guaranteed to have bind, and they're not guaranteed to work correctly when called via other references than their normative one. Commented Aug 14, 2013 at 11:47
  • @T.J.Crowder, What are host provided functions? Commented Aug 14, 2013 at 11:53
  • @learner: Anything you don't see in the JavaScript specification. So console's various functions, alert, prompt, confirm, all the DOM functions, ... Commented Aug 14, 2013 at 11:54

2 Answers 2

14

console.log shows live data, not a snapshot of the object at the time you run it.

Since you splice all the data out of the array, it is empty almost as soon as you log it.

Stringify or deep copy the array if you want to log a snapshot of it.

Sign up to request clarification or add additional context in comments.

2 Comments

+1 Better wording and fully explained in 30 seconds less than my answer. :)
I now realize I wanted to use slice and not splice :)
0

If you log objects in the latest versions of Chrome and Firefox, what you get logged on the console is a reference to the object, which is not necessarily the 'value' of the object at the moment in time you call console.log(), but it is the value of the object at the moment you open the console.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.