bezier

获取一个用于计算贝塞尔曲线的函数

源码

function bezier(mX1: number, mY1: number, mX2: number, mY2: number) {
    if (!(mX1 >= 0 && mX1 <= 1 && mX2 >= 0 && mX2 <= 1)) {
        throw new Error('bezier x values must be in [0, 1] range');
    }

    if (mX1 === mY1 && mX2 === mY2) {
        return LinearEasing;
    }

    // Precompute samples table
    const sampleValues = float32ArraySupported
        ? new Float32Array(kSplineTableSize)
        : new Array(kSplineTableSize);
    for (let i = 0; i < kSplineTableSize; ++i) {
        sampleValues[i] = calcBezier(i * kSampleStepSize, mX1, mX2);
    }

    function getTForX(aX) {
        let intervalStart = 0.0;
        let currentSample = 1;
        const lastSample = kSplineTableSize - 1;

        for (; currentSample !== lastSample && sampleValues[currentSample] <= aX; ++currentSample) {
            intervalStart += kSampleStepSize;
        }
        --currentSample;

        // Interpolate to provide an initial guess for t
        const dist =
            (aX - sampleValues[currentSample]) /
            (sampleValues[currentSample + 1] - sampleValues[currentSample]);
        const guessForT = intervalStart + dist * kSampleStepSize;

        const initialSlope = getSlope(guessForT, mX1, mX2);
        if (initialSlope >= NEWTON_MIN_SLOPE) {
            return newtonRaphsonIterate(aX, guessForT, mX1, mX2);
        }
        if (initialSlope === 0.0) {
            return guessForT;
        }
        return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize, mX1, mX2);
    }

    return function BezierEasing(x: number) {
        // Because JavaScript number are imprecise, we should guarantee the extremes are right.
        if (x === 0 || x === 1) {
            return x;
        }
        return calcBezier(getTForX(x), mY1, mY2);
    };
}

形参

参数 描述 类型 默认值
mX1 第一个点的x坐标 number 必填
mY1 第一个点的y坐标 number 必填
mX2 第二个点的x坐标 number 必填
mY2 第二个点的y坐标 number 必填

输出

计算贝塞尔曲线的函数


getSystem

获取当前设备的操作系统

源码

function getSystem() {
    try {
        const u = navigator.userAgent;
        const android = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1;
        const ios = u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
        const pc = !android && !ios;
        const system = android ? 'android' : 'ios';
        return pc ? 'pc' : system;
    } catch (e) {
        return '';
    }
}

形参

输出

{string} 返回当前设备的操作系统,可能的值包括 'android'、'ios' 或 'pc',如果无法获取,则返回空字符串


isArray

判断一个对象是否为数组类型

源码

function isArray(obj: any): obj is any[] {
    return opt.call(obj) === '[object Array]';
}

形参

参数 描述 类型 默认值
obj 入参 any 必填

输出

{boolean} 返回是否为数组类型


isObject

判断一个对象是否为对象类型

源码

function isObject(obj: any): obj is { [key: string]: any } {
    return opt.call(obj) === '[object Object]';
}

形参

参数 描述 类型 默认值
obj 入参 any 必填

输出

{boolean} 返回是否为对象类型


isString

判断一个对象是否为字符串类型

源码

function isString(obj: any): obj is string {
    return opt.call(obj) === '[object String]';
}

形参

参数 描述 类型 默认值
obj 入参 any 必填

输出

{boolean} 返回是否为字符串类型


isOneOf

检查一个值是否在给定的有效值列表中

源码

function isOneOf<T>(value: T, validList: T[]) {
    return validList.indexOf(value) !== -1;
}

形参

参数 描述 类型 默认值
value 检查的值 T 必填
validList 有效值列表 T[] 必填

输出

{boolean} 返回要检查的值是否在有效值列表中


isEmpty

检查一个值是否为空值

源码

function isEmpty(obj: any): boolean {
    return obj === undefined || obj === null || obj === '';
}

形参

参数 描述 类型 默认值
obj 入参 any 必填

输出

{boolean} 返回该值是否为空值


isFunction

检查一个值是否为函数类型

源码

function isFunction(obj: unknown): boolean {
    return Object.prototype.toString.call(obj).toLowerCase() === '[object function]';
}

形参

参数 描述 类型 默认值
obj 入参 unknown 必填

输出

{boolean} 返回该值是否为函数


isNull

检查一个值是否为 null

源码

function isNull(obj: unknown): boolean {
    return Object.prototype.toString.call(obj).toLowerCase() === '[object null]';
}

形参

参数 描述 类型 默认值
obj 入参 unknown 必填

输出

{boolean} 返回该值是否为 null


isUndefined

检查一个值是否为 undefined

源码

function isUndefined(obj: unknown): boolean {
    return Object.prototype.toString.call(obj).toLowerCase() === '[object undefined]';
}

形参

参数 描述 类型 默认值
obj 入参 unknown 必填

输出

{boolean} 返回该值是否为 undefined


isEmptyArray

检查一个值是否为空数组

源码

function isEmptyArray(obj: Array<unknown>): boolean {
    return isArray(obj) && !obj?.length;
}

形参

参数 描述 类型 默认值
obj 入参 Array<unknown> 必填

输出

{boolean} 返回该值是否为空数组


isDeepEqual

深比较两个对象是否相等

源码

function isDeepEqual(obj: any, sub: any): boolean {
    if (typeof obj !== 'object' || typeof sub !== 'object' || obj === null || sub === null) {
        return obj === sub;
    }
    if (isFunction(obj) && isFunction(sub)) {
        return obj === sub || obj.toString() === sub.toString();
    }

    if (Object.keys(obj).length !== Object.keys(sub).length) {
        return false;
    }
    for (const key in obj) {
        if (!isDeepEqual(obj[key], sub[key])) return false;
    }
    return true;
}

形参

参数 描述 类型 默认值
obj 要比较的第一个对象 any 必填
sub - any 必填

输出

{boolean} 返回两个对象是否相等


fadeColor

获取任意颜色的透明色

源码

function fadeColor(color: string): string {
    if (!color) {
        return '';
    }
    if (w3cx11[color]) {
        return `${w3cx11[color]}00`;
    }
    if (/^#[A-Fa-f0-9]{6}$/.test(color)) {
        return `${color}00`;
    }
    if (/^rgb\(.*?\)$/.test(color)) {
        return color.replace(/rgb\((.*?)\)/, 'rgba($1, 0)');
    }
    return '';
}

形参

参数 描述 类型 默认值
color 颜色 string 必填

输出

transparent color


handleUnit

给值带上 px 的单位,有单位的值直接返回

源码

function handleUnit(value: number | string) {
    return typeof value === 'number' || !isNaN(Number(value)) ? `${value}px` : value;
}

形参

参数 描述 类型 默认值
value 需要设置的值 number/string 必填

输出