# JS读书笔记目录
- JS执行机制
- JS事件循环机制
- 大文件上传和断点续传
- 深入理解前端性能监控
- 11个JavaScript代码重构最佳实践
- 单点登录
- 手写 Promise
- JS 常见概念
- ES6 Set 和 Map 数据结构
- 你没用过的JS方法
- 手撕问题
- 面向对象基本原则
- ES6 难点
- 进制
- 无
- 正则表达式
- 图片加载优化
- 没用过的JSAPi
- js常用方法
- ES6 中的高阶函数
- 前端性能优化
- 性能分析
- IntersectionObserver
- ascll unicode编码
- if (!String.prototype.codePointAt) {
(function() {
'use strict'; // 严格模式,needed to support
apply
/call
withundefined
/null
var codePointAt = function(position) { if (this == null) { throw TypeError(); } var string = String(this); var size = string.length; // 变成整数 var index = position ? Number(position) : 0; if (index != index) { // betterisNaN
index = 0; } // 边界 if (index < 0 || index >= size) { return undefined; } // 第一个编码单元 var first = string.charCodeAt(index); var second; if ( // 检查是否开始 surrogate pair first >= 0xd800 && first <= 0xdbff && // high surrogate size > index + 1 // 下一个编码单元 ) { second = string.charCodeAt(index + 1); if (second >= 0xdc00 && second <= 0xdfff) { // low surrogate // http://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae return (first - 0xd800) * 0x400 + second - 0xdc00 + 0x10000; } } return first; }; if (Object.defineProperty) { Object.defineProperty(String.prototype, 'codePointAt', { value: codePointAt, configurable: true, writable: true }); } else { String.prototype.codePointAt = codePointAt; } })(); } - ascll unicode编码