due to there is no strict type checking, all the algorithms related to type checking are almost all heuristic progress,
“if there is a property of what, that could be xxx, or level down to other options”, you have to explore what it is through the way.
as this, in jquery.aop:
toStrings = {},
nodeTypes = { 1: 'element', 3: 'textnode', 9: 'document', 11: 'fragment' },
types = 'Arguments Array Boolean Date Document Element Error Fragment Function NodeList Null Number Object RegExp String TextNode Undefined Window'.split(' ');
//making a map of type
.....
return function(item) {
return item == null && (item === undefined ? _undef : 'null') ||
item.nodeType && nodeTypes[item.nodeType] ||
typeof item.length == 'number' && (
item.callee && _arguments ||
item.alert && 'window' ||
item.item && 'nodelist') ||
toStrings[toString.call(item)];
};
- null or undefined;
- nodetype exist in object, it could be of types in nodeTypes, including the built-in ones, the BOM, DOM ones
-or when length property exist, it could be Arguments, NodeList, window
interestingly, in BOM, DOM field, the __proto__ chain searching property mechanism is NOT always work, e.g. length in window, but check it , u will find:
Object.prototype.hasOwnProperty.call(window, "length") //false in FF, true in chrome
Object.prototype.toString.call(window.__proto__, "length") //false
....
"length" in window //true,
//at least it can show that the implementation is not integrity somehow
-use Object.prototype.toString method to output its type information and use map constructed to output its type.