You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
36 lines
1.4 KiB
36 lines
1.4 KiB
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) |
|
};
|
|
|