guessType( x ) {
        if (Array.isArray(x)) {
            const types = [];
            for (let item of x) {
                if (item === undefined || item === null) {
                    continue;
                }

                const type = this.guessType(item);
                if (!types.includes(type)) {
                    types.push(type);
                }
            }
            types.sort();
            return `Array [${types.join(",")}]`;
        }

        const guessType = $.type(x);
        if (guessType === "dom-node") {
            //distinguish nodes
            return guessType.nodeName.toLowerCase();
        }

        if (guessType === "object") {
            if ($.isFunction(x.getType)) {
                return x.getType();
            }
        }
        return guessType;
    }
Unique identifier (unlike toString.call(x)) to be guessed
from the data value. This type guess is more strict than
OpenSeadragon.type() implementation, but for most type recognition
this test relies on the output of OpenSeadragon.type().

Note: although we try to implement the type guessing, do
not rely on this functionality! Prefer explicit type declaration.

@function guessType
@param x object to get unique identifier for
 - can be array, in that case, alphabetically-ordered list of inner unique types
   is returned (null, undefined are ignored)
 - if $.isPlainObject(x) is true, then the object can define
   getType function to specify its type
 - otherwise, toString.call(x) is applied to get the parameter description
@return {string} unique variable descriptor