38 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| var uncurryThis = require('../internals/function-uncurry-this');
 | |
| var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');
 | |
| var toString = require('../internals/to-string');
 | |
| var requireObjectCoercible = require('../internals/require-object-coercible');
 | |
| 
 | |
| var charAt = uncurryThis(''.charAt);
 | |
| var charCodeAt = uncurryThis(''.charCodeAt);
 | |
| var stringSlice = uncurryThis(''.slice);
 | |
| 
 | |
| var createMethod = function (CONVERT_TO_STRING) {
 | |
|   return function ($this, pos) {
 | |
|     var S = toString(requireObjectCoercible($this));
 | |
|     var position = toIntegerOrInfinity(pos);
 | |
|     var size = S.length;
 | |
|     var first, second;
 | |
|     if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;
 | |
|     first = charCodeAt(S, position);
 | |
|     return first < 0xD800 || first > 0xDBFF || position + 1 === size
 | |
|       || (second = charCodeAt(S, position + 1)) < 0xDC00 || second > 0xDFFF
 | |
|         ? CONVERT_TO_STRING
 | |
|           ? charAt(S, position)
 | |
|           : first
 | |
|         : CONVERT_TO_STRING
 | |
|           ? stringSlice(S, position, position + 2)
 | |
|           : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;
 | |
|   };
 | |
| };
 | |
| 
 | |
| module.exports = {
 | |
|   // `String.prototype.codePointAt` method
 | |
|   // https://tc39.es/ecma262/#sec-string.prototype.codepointat
 | |
|   codeAt: createMethod(false),
 | |
|   // `String.prototype.at` method
 | |
|   // https://github.com/mathiasbynens/String.prototype.at
 | |
|   charAt: createMethod(true)
 | |
| };
 | 
