如何区分formData/date(特殊对象) 和普通的object对象?

最近在项目中遇到一个问题,用户在搜索框搜索时会出现将搜索内容复制过来进行搜索的情况,这样内容的开头或者结尾就容易带上空格,造成后端搜索不到指定内容,最直接的解决方法就是在vue的input 组件中使用 v-model.trim,但是由于页面太多,如果逐一修改则会耗费大量时间,后来想到在调用接口前统一将数据进行处理,遍历数据中的每一项,将是字符串的数据进行处理,代码如下:

// 遍历请求参数中所有开头/结尾有空格的字段,并去除
    toTrim (data) {
        if (data === null) return null;
        else if (typeof data === 'string') return data.trim();
        else if (data !== null && typeof data === 'object') {
                let newObj = data instanceof Array ? [] : {};
                for (let key in data) {
                    newObj[key] = this.toTrim(data[key]);
                }
                return newObj;
        } else return data;
    }

这样就能将所有前后带空字符串的数据处理
但是后来发现一个问题,并非所有的数据对象都是普通对象,还有date 和 formdata 等对象,这样就造成了上传及带日期的请求失败.
接下来的重点就是区分普通对象和其他特殊对象了

// 判断是否是formdata对象
let isFormData = (v) => {
    return Object.prototype.toString.call(v) === '[object FormData]';
}

console.log(isFormData(new FormData()));

相应的,判断是否是普通的Object

let isObject = (v) => {
    return Object.prototype.toString.call(v) === '[object Object]';
}

console.log(isObject({}));

将代码修改如下:

// 遍历请求参数中所有开头/结尾有空格的字段,并去除
    toTrim (data) {
        if (data === null) return null;
        else if (typeof data === 'string') return data.trim();
        else if (data !== null && typeof data === 'object') {
            if (Object.prototype.toString.call(data) === '[object Object]') {
                let newObj = data instanceof Array ? [] : {};
                for (let key in data) {
                    newObj[key] = this.toTrim(data[key]);
                }
                return newObj;
            }
            return data;
        } else return data;
    }

你可能感兴趣的:(如何区分formData/date(特殊对象) 和普通的object对象?)