Symbol.type = Symbol('type')
const NaO = Symbol.for('NaO')
Reflect.type = object => object != null ? object[Symbol.type] : NaO // Not a Object ;-)
'Number String Array Object Boolean Symbol' // add more
.split(' ')
.forEach(b => eval(b).prototype[Symbol.type] = b)
console.log([
1, 1.1, 'str', {}, true, [], null, undefined, new String('something'), new Array(5), {[Symbol.type]: 'CustomType'}, NaN, NaO
].map(v => [(typeof v), Reflect.type(v)]))
U3ltYm9sLnR5cGUgPSBTeW1ib2woJ3R5cGUnKQpjb25zdCBOYU8gPSBTeW1ib2wuZm9yKCdOYU8nKQoKUmVmbGVjdC50eXBlID0gb2JqZWN0ID0+IG9iamVjdCAhPSBudWxsID8gb2JqZWN0W1N5bWJvbC50eXBlXSA6IE5hTyAvLyBOb3QgYSBPYmplY3QgOy0pCgonTnVtYmVyIFN0cmluZyBBcnJheSBPYmplY3QgQm9vbGVhbiBTeW1ib2wnIC8vIGFkZCBtb3JlCi5zcGxpdCgnICcpCi5mb3JFYWNoKGIgPT4gZXZhbChiKS5wcm90b3R5cGVbU3ltYm9sLnR5cGVdID0gYikKCmNvbnNvbGUubG9nKFsKMSwgMS4xLCAnc3RyJywge30sIHRydWUsIFtdLCBudWxsLCB1bmRlZmluZWQsIG5ldyBTdHJpbmcoJ3NvbWV0aGluZycpLCBuZXcgQXJyYXkoNSksIHtbU3ltYm9sLnR5cGVdOiAnQ3VzdG9tVHlwZSd9LCBOYU4sIE5hTwpdLm1hcCh2ID0+IFsodHlwZW9mIHYpLCBSZWZsZWN0LnR5cGUodildKSk=
[ [ 'number', 'Number' ],
[ 'number', 'Number' ],
[ 'string', 'String' ],
[ 'object', 'Object' ],
[ 'boolean', 'Boolean' ],
[ 'object', 'Array' ],
[ 'object', Symbol(NaO) ],
[ 'undefined', Symbol(NaO) ],
[ 'object', 'String' ],
[ 'object', 'Array' ],
[ 'object', 'CustomType' ],
[ 'number', 'Number' ],
[ 'symbol', 'Symbol' ] ]