axios中实用的工具函数

88 阅读2分钟

本文参加了由公众号@若川视野 发起的每周源码共读活动,点击了解详情一起参与。

文章是axios源码中utils文件中的函数,有帮助的可以直接运用到项目中去了

var toString = Object.prototype.toString

// 是否是数组
function isArray(val) {
        return toString.call(val) === '[object Array]'
}

// 是否是未定义
function isUndefined(val) {
        return typeof val === 'undefined'
}

// 是否是Buffer类型
function isBuffer(val) {
        return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)
                && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);
}


// 是否是ArrayBuffer类型
function isArrayBuffer(val) {
        return toString.call(val) === '[object ArrayBuffer]';
}

// 是否是FormData类型
function isFormData(val) {
        return (typeof FormData !== 'undefined') && (val instanceof FormData)
}

// 是否是String类型
function isString(val) {
        return typeof val === 'string'
}

// 是否是Number类型
function isNumber(val) {
        return typeof val === 'number'
}

// 是否是Object类型
function isObject(val) {
        return val !== null && typeof val === 'object'
}

// 是否是Date类型
function isDate(val) {
        return toString.call(val) === '[object Date]'
}

// 是否是file类型
function isFile(val) {
        return toString.call(val) === '[object File]'
}

// 是否是Blob类型
function isBlob(val) {
        return toString.call(val) === '[object Blob]'
}

// 是否是Function类型
function isFunction(val) {
        return toString.call(val) === '[object Function]'
}

// 是否是Stream类型
function isStream(val) {
        return isObject(val) && isFunction(val.pipe)
}

// 是否是URLSearchParams object
function isURLSearchParams(val) {
        return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;
}

// 去除前后空格
function trim(str) {
        return str.replace(/^\s*/, '').replace(/\s*$/, '')
}

// 是否在一个标准浏览器环境中运行
function isStandardBrowserEnv() {
        if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||
                navigator.product === 'NativeScript' ||
                navigator.product === 'NS')) {
                return false;
        }
        return (
                typeof window !== 'undefined' &&
                typeof document !== 'undefined'
        );
}

// 遍历一个数组或一个对象,为每个项目调用一个函数
function forEach(obj, fn) {
        if (obj === null || typeof obj === 'undefined') {
                return
        }
        if (typeof obj !== 'object') {
                obj = [obj]
        }
        if (isArray(obj)) {
                for (var i = 0, l = obj.length; i < l; i++) {
                        fn.call(null, obj[i], i, obj)
                }
        } else {
                for (var key in obj) {
                        if (Object.prototype.hasOwnProperty.call(obj, key)) {
                                fn.call(null, obj[key], key, obj)
                        }
                }
        }
}

// 当多个对象包含相同键时,后一个对象优先考虑
function merge() {
        var result = {}
        function assignValue(val, key) {
                if (typeof result[key] === 'object' && typeof val === 'object') {
                        result[key] = merge(result[key], val)
                } else {
                        result[key] = val
                }
        }
        for (var i = 0, l = arguments.length; i < l; i++) {
                forEach(arguments[i], assignValue)
        }
        return result
}

// 通过向对象a中添加对象b的属性来扩展对象a。
function extend(a, b, thisArg) {
        forEach(b, function assignValue(val, key) {
                if (thisArg && typeof val === 'function') {
                        a[key] = bind(val, thisArg)
                } else {
                        a[key] = val
                }
        })
        return a
}