55 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			55 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | 'use strict'; | ||
|  | 
 | ||
|  | var bind = require('function-bind'); | ||
|  | 
 | ||
|  | var ES2016 = require('./es2016'); | ||
|  | var assign = require('./helpers/assign'); | ||
|  | var forEach = require('./helpers/forEach'); | ||
|  | 
 | ||
|  | var GetIntrinsic = require('./GetIntrinsic'); | ||
|  | 
 | ||
|  | var $TypeError = GetIntrinsic('%TypeError%'); | ||
|  | var $isEnumerable = bind.call(Function.call, GetIntrinsic('%ObjectPrototype%').propertyIsEnumerable); | ||
|  | var $pushApply = bind.call(Function.apply, GetIntrinsic('%ArrayPrototype%').push); | ||
|  | 
 | ||
|  | var ES2017 = assign(assign({}, ES2016), { | ||
|  | 	ToIndex: function ToIndex(value) { | ||
|  | 		if (typeof value === 'undefined') { | ||
|  | 			return 0; | ||
|  | 		} | ||
|  | 		var integerIndex = this.ToInteger(value); | ||
|  | 		if (integerIndex < 0) { | ||
|  | 			throw new RangeError('index must be >= 0'); | ||
|  | 		} | ||
|  | 		var index = this.ToLength(integerIndex); | ||
|  | 		if (!this.SameValueZero(integerIndex, index)) { | ||
|  | 			throw new RangeError('index must be >= 0 and < 2 ** 53 - 1'); | ||
|  | 		} | ||
|  | 		return index; | ||
|  | 	}, | ||
|  | 
 | ||
|  | 	// https://www.ecma-international.org/ecma-262/8.0/#sec-enumerableownproperties
 | ||
|  | 	EnumerableOwnProperties: function EnumerableOwnProperties(O, kind) { | ||
|  | 		var keys = ES2016.EnumerableOwnNames(O); | ||
|  | 		if (kind === 'key') { | ||
|  | 			return keys; | ||
|  | 		} | ||
|  | 		if (kind === 'value' || kind === 'key+value') { | ||
|  | 			var results = []; | ||
|  | 			forEach(keys, function (key) { | ||
|  | 				if ($isEnumerable(O, key)) { | ||
|  | 					$pushApply(results, [ | ||
|  | 						kind === 'value' ? O[key] : [key, O[key]] | ||
|  | 					]); | ||
|  | 				} | ||
|  | 			}); | ||
|  | 			return results; | ||
|  | 		} | ||
|  | 		throw new $TypeError('Assertion failed: "kind" is not "key", "value", or "key+value": ' + kind); | ||
|  | 	} | ||
|  | }); | ||
|  | 
 | ||
|  | delete ES2017.EnumerableOwnNames; // replaced with EnumerableOwnProperties
 | ||
|  | 
 | ||
|  | module.exports = ES2017; |