Why does console.log wrongly print an empty array?
Asked Answered
C

2

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?

Calfskin answered 14/8, 2013 at 11:44 Comment(4)
Not your question, but you should prefer something like var log = console.log.bind(console); to keep contextFleer
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.Seritaserjeant
@T.J.Crowder, What are host provided functions?Calfskin
@learner: Anything you don't see in the JavaScript specification. So console's various functions, alert, prompt, confirm, all the DOM functions, ...Seritaserjeant
C
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.

Clearance answered 14/8, 2013 at 11:46 Comment(2)
+1 Better wording and fully explained in 30 seconds less than my answer. :)Oscan
I now realize I wanted to use slice and not splice :)Calfskin
C
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.

Clumsy answered 20/3 at 0:59 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.