首先我觉得在我的工作中可以被定为假值的数据有以下这几个
1.undefined
2.null
3.数字0
4.空字符串''
5.空数组[]
6.空对象{}
7.false
基本数据类型的真假很好判断,通过!!或者Boolean()都可以判断,但是引用类型,比如[],{}这两个用前面的方法判断的话,结果会为true,这不是我想要的,所以写了一个方法判断这些数据的真假。
方法的代码:
数组是通过数组的长度来进行判断的。
对象是通过对象属性形成的数组的长度判断的。
// str.slice(8,-1) 等价于 str.slice(8,str.length - 1); -2就是length - 2 依次类推
const callObjectString = (p)=>Object.prototype.toString.call(p).slice(8,-1);
const basicType = {
function:'function'
}
const referenceType = {
object:'object',
Array:'Array',
Object:'Object',
Null:'Null'
}
export const judgeFalse = (params)=>{
if(typeof params === basicType.function) throw new Error(`${params} can't be a function`);
if(typeof params === referenceType.object){
if(callObjectString(params) === referenceType.Array){
return !!params.length
}
if(callObjectString(params) === referenceType.Object){
return !!Object.keys(params).length;
}
if(callObjectString(params) === referenceType.Null){
return !!params;
}
}else{
return !!params;
}
}
测试用例:
import { judgeFalse } from "./isFalse";
describe("假值", () => {
test("sample1 undefined", () => {
expect(judgeFalse()).toBe(false);
});
test("sample1 null", () => {
expect(judgeFalse(null)).toBe(false);
});
test("sample1 0", () => {
expect(judgeFalse(0)).toBe(false);
});
test('sample1 ""', () => {
expect(judgeFalse("")).toBe(false);
});
test("sample1 false", () => {
expect(judgeFalse(false)).toBe(false);
});
test("sample1 []", () => {
expect(judgeFalse([])).toBe(false);
});
test("sample1 {}", () => {
expect(judgeFalse({})).toBe(false);
});
});
describe("真值", () => {
test("sample1 1", () => {
expect(judgeFalse(1)).toBe(true);
});
test('sample1 " "', () => {
expect(judgeFalse(" ")).toBe(true);
});
test("sample1 true", () => {
expect(judgeFalse(true)).toBe(true);
});
test("sample1 [0,false]", () => {
expect(judgeFalse([0, false])).toBe(true);
});
test("sample1 {0:false}", () => {
expect(judgeFalse({ 0: false })).toBe(true);
});
});
测试结果: