Zach Templeton Zach Templeton - 2 months ago 6
Javascript Question

JavaScript instanceof and moment.js

I'm attempting to understand types in the JavaScript world. My page is using moment.js. I have a function that sometimes returns a

and other times, returns a
(it's legacy code gone wild).

My code kind of looks like this:

var now = getDate();
if (now instanceof moment) {
console.log('we have a moment.');
} else {
console.log('we have a string.');

function getDate() {
var result = null;
// Sometimes result will be a moment(), other times, result will be a string.
result = moment();
return result;

When I execute the code above, I never get
we have a moment.
. Even if I manually make set
result = moment();
. Why is that? Am I misunderstanding


First of all, instanceof isn't perfectly reliable.

Second of all, moment() returns instance of Moment class that isn't exposed to user. Following code prove this:

moment().__proto__.constructor // function Moment()
moment().constructor === moment; // false

Third of all, moment provide function moment.isMoment that will solve your problem.

And last, but not least - your code should use consistent return types - always return moment instances or always return strings. It will reduce your pain in future.

You can ensure that you always have moment instance by calling moment function - moment(string) equals in value moment(moment(string)), so you can just always convert your argument to moment instance.