Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 8775027
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: June 13, 20262026-06-13T18:42:32+00:00 2026-06-13T18:42:32+00:00

I thought there are 5 primitive types for JavaScript (null, undefined, boolean, number, string),

  • 0

I thought there are 5 primitive types for JavaScript (null, undefined, boolean, number, string), and then there is object (which includes array, function, and custom defined pseudo class objects). But it is somewhat strange that

typeof null

is "object", and there is no easy way to get back the object class name for pseudo-classical class such as Person, Author. I wonder if there is a newer operator or function that can return possibly lower case names for primitive type (and "null" for null, not "object"), and capital case for custom-defined pseudo-classical objects?

If no such operator or function exist in ECMA-5 or later, would it make sense to have it? Otherwise, we may need to rely on our own definition or any framework, but that will not be standard across different platforms.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-06-13T18:42:33+00:00Added an answer on June 13, 2026 at 6:42 pm

    ECMAScript 5 objects have an internal property known as [[Class]]. This is the closest thing in ES5 to what you’re asking. You can access [[Class]] with Object.prototype.toString as follows:

    function getClassOf(obj) {
        return Object.prototype.toString.call(obj).slice(8, -1);
    }
    
    getClassOf([ ]); // => "Array"
    getClassOf(new Date()); // => "Date"
    getClassOf(function() { }); // => "Function"
    getClassOf(3); // => "Number"
    getClassOf(true) // => "Boolean"
    getClassOf(document.createElement('div')); // => "HTMLDivElement"
    getClassOf(Math); // => "Math"
    getClassOf(null); // => "Null"
    getClassOf(undefined); // => "Undefined"
    getClassOf({ x: 1 }); // => "Object"
    

    This behavior is crucial for adequately identifying objects which come from other frames.

    However, it doesn’t work for user-defined constructors. Objects created with user-defined constructors have [[Class]] "Object".

    function Foo() { }
    var foo = new Foo();
    
    getClassOf(foo); // => "Object"
    

    It looks like ECMAScript 6 might have the ability to extend what’s returned by Object.prototype.toString, so that getClassOf(foo) could be "Foo" through the @@toStringTag symbol.

    See https://mail.mozilla.org/pipermail/es-discuss/2012-September/025344.html for more information on the upcoming standard.


    You could create your own function to do what you want like this:

    function getTypeOf(value) {
    
        // Return "null" for null.
        if (value === null) return 'null';
    
        // Return primitive types.
        var type = typeof value;
        if (type != 'object') return type;
    
        // Return [[Class]] if available for objects.
        type = Object.prototype.toString.call(value).slice(8, -1);
        if (type != 'Object') return type;
    
        // Return "Object" if it wasn't created with another constructor.
        var proto = Object.getPrototypeOf(value);
        if (proto == Object.prototype)
            return 'Object';
    
        // Return the constructor name if constructor hasn't been
        // modified on the object.
        if (value.constructor && proto === value.constructor.prototype)
            return value.constructor.name;
    
        // Return the constructor name if constructor hasn't been
        // modified on the prototype.
        if (proto.constructor && proto === proto.constructor.prototype)
            return proto.constructor.name;
    
        // Return "???" if the type is indeterminable.
        return '???';
    
    }
    

    Examples:

    getTypeOf([ ]); // => "Array"
    getTypeOf(new Date()); // => "Date"
    getTypeOf(function() { }); // => "Function"
    getTypeOf(3); // => "number"
    getTypeOf(true) // => "boolean"
    getTypeOf(document.createElement('div')); // => "HTMLDivElement"
    getTypeOf(Math); // => "Math"
    getTypeOf(null); // => "null"
    getTypeOf(undefined); // => "undefined"
    getTypeOf({ x: 1 }); // => "Object"
    
    function Foo() { }
    var foo = new Foo();
    
    getTypeOf(foo); // => "Foo"
    
    // If the constructor property is changed, still works.
    foo.constructor = function FakeConstructor() { };
    getTypeOf(foo); // => "Foo"
    
    // If the constructor property AND the prototype's constructor is
    // changed, result is "???".
    foo.constructor = function FakeConstructor() { };
    Foo.prototype.constructor = function FakeConstructor2() { };
    getTypeOf(foo); // => "???"
    
    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

I am writing a string parser and the thought occurred to me that there
I thought there was a way to quickly ask a NSSet to poll its
I thought there was only one - included in jQuery UI and documented here
As I was writing a for loop earlier today, I thought that there must
I thought the following would be a pretty common task and assumed there would
I thought what I wanted would be pretty simple, but there must be something
So I know there is a few templating engines out there, but I thought
I always thought that if you didn't implement a heartbeat, there was no way
I always thought that parentheses improved readability, but in my textbook there is a
I don't think this is possible but I thought I'd throw it out there.

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.