heyujie
2021-05-24 4885600ecc369aa2e30a65de8dd7a410f13c34df
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Based on: https://github.com/mathiasbynens/String.prototype.codePointAt
// Thanks @mathiasbynens !
 
"use strict";
 
var toInteger  = require("../../../number/to-integer")
  , validValue = require("../../../object/valid-value");
 
module.exports = function (pos) {
    var str = String(validValue(this)), length = str.length, first, second;
    pos = toInteger(pos);
 
    // Account for out-of-bounds indices:
    if (pos < 0 || pos >= length) return undefined;
 
    // Get the first code unit
    first = str.charCodeAt(pos);
    if (first >= 0xd800 && first <= 0xdbff && length > pos + 1) {
        second = str.charCodeAt(pos + 1);
        if (second >= 0xdc00 && second <= 0xdfff) {
            // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae
            return (first - 0xd800) * 0x400 + second - 0xdc00 + 0x10000;
        }
    }
    return first;
};