setup

基础设置和功能支持

export const VERSION = '1.13.7';

/**
 * 获取当前环境的全局对象
 * 
 * @description 这段代码尝试跨不同 JavaScript 环境获取全局对象
 * @returns {Object} 全局对象
 */
export const root =
    /**
     * 浏览器环境 (window)
     *      - 针对浏览器环境(如 Web Worker)
     *      - 检查 self 是否为对象
     *      - 确保 self.self 指向 self 本身
     *      - 如果条件成立,返回 self(通常是 window)
     */
    (typeof self == 'object' && self.self === self && self) ||
    /**
     * Node.js 环境 (global)
     *      - 针对 Node.js 环境
     *      - 检查 global 是否为对象
     *      - 确保 global.global 指向 global 本身
     *      - 如果条件成立,返回 global
     */
    (typeof global == 'object' && global.global === global && global) ||
    /**
     * 通过 Function 构造器获取 this
     *      - 使用 Function 构造器动态返回 this
     *      - 这是一个兜底方案,尝试获取全局 this
     *      - 在严格模式下可能返回 undefined
     */
    Function('return this')() ||
    // 最后的 {} 是最终的兜底方案。如果前面所有方法都失败,则返回一个空对象
    {};


/**
 * 创建原型对象的引用别名
 * 
 * @description 
 *      - 缓存 Array 和 Object 的原型对象
 *      - 减少每次使用时查找原型链的开销
 *      - 提供更简洁的代码写法
*/
export const ArrayProto = Array.prototype, ObjProto = Object.prototype;

/**
 * Symbol 原型的安全处理
 * 
 * @description
 *      - typeof Symbol !== 'undefined' 检查当前环境是否支持 Symbol
 *      - 如果支持,返回 Symbol.prototype
 *      - 如果不支持(如旧版浏览器或不完全的 ES6 环境),返回 null
 */
export const SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;

/**
 * 导出常用的数组和对象原型方法
 * 
 * @description
 * - 直接引用并导出常用的原型方法
 * - 提供快速访问和使用
 * - 减少方法调用的查找开销
 */
export const push = ArrayProto.push,
    slice = ArrayProto.slice,
    toString = ObjProto.toString,
    hasOwnProperty = ObjProto.hasOwnProperty;

/**
 * 检测对象缓冲区相关特性的环境支持
 * 
 * @description
 * - 判断当前环境是否支持 ArrayBuffer
 * - 判断当前环境是否支持 DataView
 * - 用于跨环境的兼容性检查
 */
export const supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',
    supportsDataView = typeof DataView !== 'undefined';

/**
 * 导出原生对象和数组的静态方法
 * 
 * @description
 * - 直接引用原生的数组和对象方法
 * - 提供 ArrayBuffer 视图的安全检测
 * - 减少方法查找开销
 */
export const nativeIsArray = Array.isArray,
    nativeKeys = Object.keys,
    nativeCreate = Object.create,
    nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;

/**
 * 导出原生的数值判断函数
 * 
 * @description
 * - 直接引用 isNaN 和 isFinite 全局函数
 * - 通过下划线前缀创建别名
 * - 提供数值的特殊状态检测
 */
export const _isNaN = isNaN,
    _isFinite = isFinite;

/**
 * 检测对象属性枚举的兼容性问题
 * 
 * @description
 * - 检查某些属性在不同浏览器中的枚举行为
 * - 记录一些历史上可能存在枚举问题的标准属性
 */
// 检测属性枚举的浏览器兼容性问题
export const hasEnumBug = !{ toString: null }.propertyIsEnumerable('toString');

// 可能存在枚举问题的非枚举属性列表
export const nonEnumerableProps = [
    'valueOf', 
    'isPrototypeOf', 
    'toString',
    'propertyIsEnumerable', 
    'hasOwnProperty', 
    'toLocaleString'
];

/**
 * JavaScript 数组的最大可用索引值。
 * 它等于 `2^53 - 1`,即 JavaScript 中的最大安全整数。
 * 通常用于验证或限制类数组结构的索引范围。
 *
 * @constant {number} MAX_ARRAY_INDEX
 * @default 9007199254740991
 */
export const MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;

最后更新于