28 lines
1.1 KiB
JavaScript
28 lines
1.1 KiB
JavaScript
|
var toInteger = require('../internals/to-integer');
|
||
|
var requireObjectCoercible = require('../internals/require-object-coercible');
|
||
|
|
||
|
// `String.prototype.{ codePointAt, at }` methods implementation
|
||
|
var createMethod = function (CONVERT_TO_STRING) {
|
||
|
return function ($this, pos) {
|
||
|
var S = String(requireObjectCoercible($this));
|
||
|
var position = toInteger(pos);
|
||
|
var size = S.length;
|
||
|
var first, second;
|
||
|
if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;
|
||
|
first = S.charCodeAt(position);
|
||
|
return first < 0xD800 || first > 0xDBFF || position + 1 === size
|
||
|
|| (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF
|
||
|
? CONVERT_TO_STRING ? S.charAt(position) : first
|
||
|
: CONVERT_TO_STRING ? S.slice(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)
|
||
|
};
|