Array.push() makes all elements the same when pushing an object

Solution 1:

The problem is not with the push method of the Array.prototype but with your bindings. You are modifying the same s object in every iteration in your async.foreach block which is actually the same Object as the previously defined Subscriber.

First you should move the declaration of the s variable to the foreach block.

And also if you want to create an object with default values, it should be a function, which returns a new object:

function Subscriber() {
  return {
    'userID':   '',
    'email':    '',
    'name':     '',
    'stage':    '',
    'poster':   false,
    'canEmail': false,
    'stage':    ''
  };
};

And then you can instantiate a Subscriber object like this:

var s = Subscriber();

See this answer or Closures on MDN for more explanation.

Solution 2:

Cloning the object before pushing into the array, also solves the problem.

temp = clone(s);
subscribers.push(temp);

Get https://www.npmjs.com/package/clone