In JavaScript, a value can either be a primitive or an object. Therefore, you can check if a value is a JavaScript primitive (as opposed to being an object) using the following check:
!(value instanceof Object)
You may see value !== Object(value) as a means to check for primitive values on some websites. Please note that this would give you some false positives if you use it directly on a value (as opposed to passing it as a function argument). For example, [] !== Object([]) returns true even though an array is not a primitive.
For your convenience, you could create functions for this check, for example, like so:
// ES6+ const isPrimitive = (value) => !(value instanceof Object);
For versions earlier than ES6, you can use the traditional function syntax instead of an arrow function (as arrow function was introduced in ES6).
Refer to the following examples to see the result of this check with different primitive and object values:
- Checking if
StringIs Primitive or Object; - Checking if
NumberIs Primitive or Object; - Checking if
BigIntIs Primitive or Object; - Checking if
BooleanIs Primitive or Object; - Checking if
SymbolIs Primitive or Object; - Checking if
nullandundefinedAre Primitive or Object.
Checking if String Is Primitive or Object
A string literal is a primitive. You can check this using the custom isPrimitive() function:
const foo = 'foo'; console.log(isPrimitive(foo)); // true
When you use String() as a function (or wrapper around a primitive value), it coerces the argument given to it to a string primitive (as shown in the example below):
const numericStr = String(123); console.log(isPrimitive(numericStr)); // true
This is in contrast to creating an object instance (which is what you get when String is called as a constructor — i.e. with the new keyword):
const numericStr = new String(123); console.log(isPrimitive(numericStr)); // false
In practice, you should rarely find yourself having to use String as a constructor.
Checking if Number Is Primitive or Object
A number literal is a primitive. You can check this using the custom isPrimitive() function:
const posNum = 12345; const negNum = -12345; const nanNum = NaN; console.log(isPrimitive(posNum)); // true console.log(isPrimitive(negNum)); // true console.log(isPrimitive(nanNum)); // true
When you use Number() as a function (or wrapper around a primitive value), it coerces the argument given to it to a number primitive (as shown in the example below):
const posNum = Number('12345');
const negNum = Number('-12345');
const nanNum = Number('NaN');
console.log(isPrimitive(posNum)); // true
console.log(isPrimitive(negNum)); // true
console.log(isPrimitive(nanNum)); // true
This is in contrast to creating an object instance (which is what you get when Number is called as a constructor — i.e. with the new keyword):
const posNum = new Number('12345');
const negNum = new Number('-12345');
const nanNum = new Number('NaN');
console.log(isPrimitive(posNum)); // false
console.log(isPrimitive(negNum)); // false
console.log(isPrimitive(nanNum)); // false
In practice, you should rarely find yourself having to use Number as a constructor.
Checking if BigInt Is Primitive or Object
A bigint literal is a primitive. You can check this using the custom isPrimitive() function:
// ES10+ const posNum = 9007199254740991n; const negNum = -9007199254740991n; console.log(isPrimitive(posNum)); // true console.log(isPrimitive(negNum)); // true
When you use BigInt() as a function (or wrapper around a primitive value), it coerces the argument given to it to a bigint primitive (as shown in the example below):
// ES10+
const posNum = BigInt('9007199254740991');
const negNum = BigInt('-9007199254740991');
console.log(isPrimitive(posNum)); // true
console.log(isPrimitive(negNum)); // true
This is in contrast to creating an object instance (which is what you get when BigInt is called as a constructor — i.e. with the new keyword):
const posNum = new BigInt('9007199254740991');
const negNum = new BigInt('-9007199254740991');
console.log(isPrimitive(posNum)); // false
console.log(isPrimitive(negNum)); // false
In practice, you should rarely find yourself having to use BigInt as a constructor.
Checking if Boolean Is Primitive or Object
A boolean literal (i.e. true or false) is a primitive. You can check this using the custom isPrimitive() function:
console.log(isPrimitive(true)); // true console.log(isPrimitive(false)); // true
When you use Boolean() as a function (or wrapper around a primitive value), it coerces the argument given to it to a boolean primitive (as shown in the example below):
console.log(isPrimitive(Boolean(true))); // true console.log(isPrimitive(Boolean(false))); // true
This is in contrast to creating an object instance (which is what you get when Boolean is called as a constructor — i.e. with the new keyword):
console.log(isPrimitive(new Boolean(true))); // false console.log(isPrimitive(new Boolean(false))); // false
In practice, you should rarely find yourself having to use Boolean as a constructor.
Checking if Symbol Is Primitive or Object
Using the custom isPrimitive() function, you can check if a Symbol is a primitive or not in the following way:
// ES6+ const sym = Symbol(); console.log(isPrimitive(sym)); // true
// ES6+
const sym = Symbol('foo');
console.log(isPrimitive(sym)); // true
Symbol() can only be called as a function, and cannot be constructed with new Symbol().
Checking if null and undefined Are Primitive or Object
Using the custom isPrimitive() function, you can check if null and undefined are a primitive or not in the following way:
console.log(isPrimitive(null)); // true console.log(isPrimitive(undefined)); // true
Please note that for legacy reasons, typeof null gives you 'object' (as opposed to 'null'). null is actually a primitive type.
This post was published by Daniyal Hamid. Daniyal currently works as the Head of Engineering in Germany and has 20+ years of experience in software engineering, design and marketing. Please show your love and support by sharing this post.