function hasArrayNature(obj) {
  return (
    // not null/false
    !!obj &&
    // arrays are objects, NodeLists are functions in Safari
    (typeof obj == 'object' || typeof obj == 'function') &&
    // quacks like an array
    ('length' in obj) &&
    // not window
    !('setInterval' in obj) &&
    // no DOM node should be considered an array-like
    // a 'select' element has 'length' and 'item' properties on IE8
    (typeof obj.nodeType != 'number') &&
    (
      // a real array
      (// HTMLCollection/NodeList
      (Array.isArray(obj) ||
      // arguments
      ('callee' in obj) || 'item' in obj))
    )
  );
}
Create a component that will throw an exception when unmounted.

Components like <html> <head> and <body> can't be removed or added
easily in a cross-browser way, however it's valuable to be able to
take advantage of React's reconciliation for styling and <title>
management. So we just document it and throw in dangerous cases.

@param {string} tag The tag to wrap
@return {function} convenience constructor of new component