Show More
Commit Description:
submission report
Commit Description:
submission report
References:
File last commit:
Show/Diff file:
Action:
node_modules/es-abstract/2018/CopyDataProperties.js
| 60 lines
| 1.7 KiB
| application/javascript
| JavascriptLexer
|
r789 | 'use strict'; | |||
var callBound = require('../helpers/callBound'); | ||||
var forEach = require('../helpers/forEach'); | ||||
var OwnPropertyKeys = require('../helpers/OwnPropertyKeys'); | ||||
var $isEnumerable = callBound('Object.prototype.propertyIsEnumerable'); | ||||
var IsArray = require('./IsArray'); | ||||
var IsPropertyKey = require('./IsPropertyKey'); | ||||
var Type = require('./Type'); | ||||
// https://www.ecma-international.org/ecma-262/9.0/#sec-copydataproperties | ||||
module.exports = function CopyDataProperties(target, source, excludedItems) { | ||||
if (Type(target) !== 'Object') { | ||||
throw new TypeError('Assertion failed: "target" must be an Object'); | ||||
} | ||||
if (!IsArray(excludedItems)) { | ||||
throw new TypeError('Assertion failed: "excludedItems" must be a List of Property Keys'); | ||||
} | ||||
for (var i = 0; i < excludedItems.length; i += 1) { | ||||
if (!IsPropertyKey(excludedItems[i])) { | ||||
throw new TypeError('Assertion failed: "excludedItems" must be a List of Property Keys'); | ||||
} | ||||
} | ||||
if (typeof source === 'undefined' || source === null) { | ||||
return target; | ||||
} | ||||
var ES = this; | ||||
var fromObj = ES.ToObject(source); | ||||
var sourceKeys = OwnPropertyKeys(fromObj); | ||||
forEach(sourceKeys, function (nextKey) { | ||||
var excluded = false; | ||||
forEach(excludedItems, function (e) { | ||||
if (ES.SameValue(e, nextKey) === true) { | ||||
excluded = true; | ||||
} | ||||
}); | ||||
var enumerable = $isEnumerable(fromObj, nextKey) || ( | ||||
// this is to handle string keys being non-enumerable in older engines | ||||
typeof source === 'string' | ||||
&& nextKey >= 0 | ||||
&& ES.IsInteger(ES.ToNumber(nextKey)) | ||||
); | ||||
if (excluded === false && enumerable) { | ||||
var propValue = ES.Get(fromObj, nextKey); | ||||
ES.CreateDataProperty(target, nextKey, propValue); | ||||
} | ||||
}); | ||||
return target; | ||||
}; | ||||