mout
Version:
Modular Utilities
67 lines (66 loc) • 2.28 kB
JavaScript
;
exports.__esModule = true;
var hasOwn_1 = require("./hasOwn");
var _hasDontEnumBug;
var _dontEnums;
// eslint-disable-next-line require-jsdoc
function checkDontEnum() {
_dontEnums = [
'toString',
'toLocaleString',
'valueOf',
'hasOwnProperty',
'isPrototypeOf',
'propertyIsEnumerable',
'constructor'
];
_hasDontEnumBug = true;
// eslint-disable-next-line guard-for-in, no-unused-vars
for (var _ in { toString: null }) {
_hasDontEnumBug = false;
}
}
/**
* Similar to Array/forEach but works over object properties and fixes Don't
* Enum bug on IE.
* based on: http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation
*/
function forIn(obj, fn, thisObj) {
var key;
var i = 0;
// no need to check if argument is a real object that way we can use
// it for arrays, functions, date, etc.
// post-pone check till needed
if (_hasDontEnumBug == null)
checkDontEnum();
for (key in obj) {
if (exec(fn, obj, key, thisObj) === false) {
break;
}
}
if (_hasDontEnumBug) {
var ctor = obj.constructor;
var isProto = !!ctor && obj === ctor.prototype;
while ((key = _dontEnums[i++])) {
// For constructor, if it is a prototype object the constructor
// is always non-enumerable unless defined otherwise (and
// enumerated above). For non-prototype objects, it will have
// to be defined on this object, since it cannot be defined on
// any prototype objects.
//
// For other [[DontEnum]] properties, check if the value is
// different than Object prototype value.
if ((key !== 'constructor' || (!isProto && hasOwn_1["default"](obj, key))) &&
obj[key] !== Object.prototype[key]) {
if (exec(fn, obj, key, thisObj) === false) {
break;
}
}
}
}
}
// eslint-disable-next-line require-jsdoc
function exec(fn, obj, key, thisObj) {
return fn.call(thisObj, obj[key], key, obj);
}
exports["default"] = forIn;