SOURCE

function isNull(param) {
    return param === null
}

function isUndefined(param) {
    return param === undefined
}

function isNumber(param) {
    if (typeof param === 'number') {
        return param === 0 || !!param
    } else {
        return false
    }
}

function isString(param) {
    return typeof param === 'string'
}

function isBoolean(param) {
    return param === true || param === false
}

function isTrue(param) {
    return param === true
}

function isFalse(param) {
    return param === false
}

function isObject(param) {
    return typeof param === 'object' && param !== null
}

function isPlainObject(param) {
    return Object.prototype.toString.call(param) === '[object Object]'
}

function isFunction(param) {
    return Object.prototype.toString.call(param) === '[object Function]'
}

function isArray(param) {
    return Object.prototype.toString.call(param) === '[object Array]'
}

// 辅助工具函数: 测试
function test(describe, callback) {
    if (callback()) {
        let message = '%c ' + describe + ': √';
        console.log(message, 'color:#22cd2f;')
    } else {
        let message = '%c ' + describe + ': ×';
        console.log(message, 'color:#f00;font-weight:bold;')
    }
}

function equal(a, b) {
    return a === b
}

function notEqual(a, b) {
    return a !== b
}

test('null是null', () => {
    return equal(isNull(null), true)
});
test('"null"不是null', () => {
    return equal(isNull('null'), false)
});
test('undefined不是null', () => {
    return equal(isNull(undefined), false)
});
test('undefined是undefined', () => {
    return equal(isUndefined(undefined), true)
});
test('null不是undefined', () => {
    return equal(isUndefined(null), false)
})
test('0是数字', () => {
    return equal(isNumber(0), true)
});
test('1是数字', () => {
    return equal(isNumber(1), true)
});
test('-1.2是数字', () => {
    return equal(isNumber(-1.2), true)
});
test('NaN不是数字', () => {
    return equal(isNumber(NaN), false)
})
test('"123"是字符串', () => {
    return isTrue(isString('123'))
})
test('数字123不是字符串', () => {
    return isFalse(isString(123))
})
test('true 是 boolean', () => {
    return isTrue(isBoolean(true))
})
test('false 是 boolean', () => {
    return isTrue(isBoolean(false))
})
test('0 不是 boolean', () => {
    return isFalse(isBoolean(0))
})
test('1 不是 boolean', () => {
    return isFalse(isBoolean(1))
})
test('{}是object', () => {
    return isTrue(isObject({}))
})
test('Math是object', () => {
    return isTrue(isObject(Math))
})
test('[]是object', () => {
    return isTrue(isObject([]))
})
test('{} 是 plain object', () => {
    return isTrue(isPlainObject({}))
})
test('Math 不是 plain object', () => {
    return isFalse(isPlainObject(Math))
})
test('[] 不是 plain object', () => {
    return isFalse(isPlainObject([]))
})
test('null不是对象', () => {
    return isFalse(isObject(null))
})
test('123不是对象', () => {
    return isFalse(isObject(123))
})
test('parseInt是函数', () => {
    return isTrue(isFunction(parseInt))
})
test('Function不是函数', () => {
    return isTrue(isFunction(Function))
})
test('[]是数组', () => {
    return isTrue(isArray([]))
})
test('{1:22}不是数组', () => {
    return isFalse(isArray({1: 22}))
})
console 命令行工具 X clear

                    
>
console