Js判断参数(String,Array,Object)是否为undefined或者值为空


Posted in Javascript onNovember 04, 2013

有时候我们会遇到这样的情况:在一些前端控件要提交数据到服务器端的数据验证过程中,需要判断提交的数据是否为空。如果是普通表单的字符串数据,只需要在 trim 后判断 length 即可,而这里需要的数据可以是各种不同的类型(数字、字符串、数组、对象等等),通过 JSON.stringify(data) 进行序列化后再传递。

在这里定义如下的数据值为“空值”:

•undefined
•null
•空字符串及纯空白字符串:''、'    ' 等。
•空数组:[]
•空对象:{}

对于除此以外的数据值,均认为不为空。

其中 null 和 undefined 很容易识别,但对于其他类型,我们须要得到其数据类型才能用相应的方法去检测数据是否为空。最容易想到的方法就是利用typeof 操作符:

<SPAN style="BACKGROUND-COLOR: rgb(255,255,255)">if(typeof data === 'number') {
  //deal with numbers
}</SPAN>

但 typeof 返回的类型字符串只有 'object'、'function'、'number'、'boolean'、'string'、'undefined' 这六种,很多原生对象如 Date、RegExp 对象无法与用 {} 创建的对象进行区分。另外,typeof 对于一些基本数据类型如 (String、Number、Boolean) 与其对应的基本包装类型数据会分别返回不同值,如:
<SPAN style="BACKGROUND-COLOR: rgb(255,255,255)">console.log(typeof false); //'boolean'
console.log(typeof new Boolean(false)); //'object'
console.log(typeof 1); //'number'
console.log(typeof new Number(1)); //'object'
console.log(typeof ''); //'string'
console.log(typeof new String('')); //'object'</SPAN>

这对我们的判断也有一定的影响。

用 instanceof?这只能判断对象,而且存在多 frame 时多个同类对象不共享 prototype 的问题,从其他 frame 中取得的对象无法正确判断。

还好,还有一个最简单也最可靠的方法:Object.prototype.toString。对于不同类型的数据,这个方法可以返回 '[object Object]'、'[object Array]'、'[object String]' 这样的字符串,非常方便判断。需要注意的是,在 IE8 及其以下浏览器中,这个方法对于null、undefined、window 等都会返回 '[object Object]',不过还好,这并不影响我们使用它判断空对象。

下面直接上代码,说明就看注释吧。

var isEmptyValue = function(value) {
            var type;
            if(value == null) { // 等同于 value === undefined || value === null
                return true;
            }
            type = Object.prototype.toString.call(value).slice(8, -1);
            switch(type) {
            case 'String':
                return !$.trim(value);
            case 'Array':
                return !value.length;
            case 'Object':
                return $.isEmptyObject(value); // 普通对象使用 for...in 判断,有 key 即为 false
            default:
                return false; // 其他对象均视作非空
            }
        };
Javascript 相关文章推荐
异步动态加载JS并运行(示例代码)
Dec 13 Javascript
Jquery实现自定义窗口随意的拖拽
Mar 12 Javascript
jQuery简单几行代码实现tab切换
Mar 10 Javascript
ztree获取选中节点时不能进入可视区域出现BUG如何解决
Dec 03 Javascript
基于AngularJS+HTML+Groovy实现登录功能
Feb 17 Javascript
JavaScript资源预加载组件和滑屏组件的使用推荐
Mar 10 Javascript
jquery Deferred 快速解决异步回调的问题
Apr 05 Javascript
jquery实现(textarea)placeholder自动换行
Dec 22 Javascript
微信小程序 图片边框解决方法
Jan 16 Javascript
vue项目部署上线遇到的问题及解决方法
Jun 10 Javascript
javascript创建元素和删除元素实例小结
Jun 19 Javascript
微信小程序实现时间进度条功能
Nov 17 Javascript
浅析return false的正确使用
Nov 04 #Javascript
javascript与jquery中跳出循环的区别总结
Nov 04 #Javascript
js中apply方法的使用详细解析
Nov 04 #Javascript
js数组操作学习总结
Nov 04 #Javascript
Javascript执行效率全面总结
Nov 04 #Javascript
jquery的map与get方法详解
Nov 04 #Javascript
ajax请求get与post的区别总结
Nov 04 #Javascript
You might like
深入解析yii权限分级式访问控制的实现(非RBAC法)
2013/06/13 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
thinkphp分页集成实例
2017/07/24 PHP
使用GruntJS构建Web程序之构建篇
2014/06/04 Javascript
JavaScript的arguments对象应用示例
2014/09/15 Javascript
JavaScript获取两个数组交集的方法
2015/06/09 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
常用的js验证和数据处理总结
2016/08/02 Javascript
vue.js中引入vuex储存接口数据及调用的详细流程
2017/12/14 Javascript
浅谈vue.js导入css库(elementUi)的方法
2018/03/09 Javascript
React Native中Mobx的使用方法详解
2018/12/04 Javascript
node.js中Buffer缓冲器的原理与使用方法分析
2019/11/23 Javascript
详解vue3.0 的 Composition API 的一种使用方法
2020/10/26 Javascript
前端vue如何使用高德地图
2020/11/05 Javascript
js重写alert事件(避免alert弹框标题出现网址)
2020/12/04 Javascript
windows下wxPython开发环境安装与配置方法
2014/06/28 Python
Python计算一个文件里字数的方法
2015/06/15 Python
各个系统下的Python解释器相关安装方法
2015/10/12 Python
pandas数据处理基础之筛选指定行或者指定列的数据
2018/05/03 Python
python将一组数分成每3个一组的实例
2018/11/14 Python
选择python进行数据分析的理由和优势
2019/06/25 Python
python实现的分析并统计nginx日志数据功能示例
2019/12/21 Python
django rest framework 自定义返回方式
2020/07/12 Python
如何利用python进行时间序列分析
2020/08/04 Python
英国最大的女性服装零售商:Dorothy Perkins
2017/03/30 全球购物
Rodd & Gunn澳大利亚官网:新西兰男装品牌
2018/09/25 全球购物
OSPREY LONDON官网:英国本土皮具品牌
2019/05/31 全球购物
您在慕尼黑的跑步商店:Lauf-bar
2019/10/11 全球购物
机修工岗位职责
2013/11/24 职场文书
员工晚婚的请假条
2014/02/08 职场文书
动员大会主持词
2014/03/20 职场文书
国庆节标语大全
2014/10/08 职场文书
交通事故被告代理词
2015/05/23 职场文书
CSS变量实现主题切换的方法
2021/06/23 HTML / CSS
oracle删除超过N天数据脚本的方法
2022/02/28 Oracle
Win11控制面板快捷键是什么?Win11打开控制面板的方法汇总
2022/07/07 数码科技