JSFiddle - React, Tailwind, and code Playground

JavaScript

'use strict';

function typeOfArg(arg) {
  var defined = ['String', 'Number', 'Object', 'Date', 'Undefined', 'Null', 'Array', 'Object', 'Function'];
  // "[object X]" to "X"
  var argToString = {}.toString.call(arg).slice(8, -1);
  
  if (defined.indexOf(argToString) >= 0) {
    return argToString;
  } else if (typeof arg == 'object'
  					&& typeof arg.length == 'number'
            && arg.length >= 0
            && arg.join === undefined) {
    return 'Array-like';
  } else {
    return 'Error: type is not known';
  }
}

// Тестовые объекты

// Array-like объект NodeList
var el = document.createDocumentFragment();
el.appendChild(document.createDocumentFragment());
var nodeList = el.childNodes;

// Array-like объект HtmlCollection
var htmlColl = document.forms;

// Array-like объект arguments
var args = (() => arguments)();

function Foo() {};

var testcases = [
  ['String', ''],
  ['Number', 12],
  ['Date', new Date],
  ['Array-like', htmlColl],
	['Array-like', args],
  ['Undefined', undefined],
  ['Null', null],
  ['Array', []],
  ['Array', [1, 2, 4]],
  ['Object', {}],
  ['Object', {'key': 'value'}],
  ['Object', new Foo],
  ['Function', function() {}],
];

for (var [expected, test] of testcases) {
  console.log(expected + ': ', typeOfArg(test));
}