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 相关文章推荐
$.ajax json数据传递方法
Nov 19 Javascript
Jquery中删除元素的实现代码
Dec 29 Javascript
javascript动态控制服务器控件实例
Sep 05 Javascript
web前端设计师们常用的jQuery特效插件汇总
Dec 07 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
Dec 01 Javascript
基于JavaScript实现动态创建表格和增加表格行数
Dec 20 Javascript
js实现的光标位置工具函数示例
Oct 03 Javascript
jQuery实现简易的输入框字数计数功能示例
Jan 16 Javascript
vue双向绑定简要分析
Mar 23 Javascript
原生js封装自定义滚动条
Mar 24 Javascript
vue项目实战总结篇
Feb 11 Javascript
jQuery实现form表单序列化转换为json对象功能示例
May 23 jQuery
浅析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
使用Xdebug调试和优化PHP程序之[1]
2007/04/17 PHP
PHP session有效期session.gc_maxlifetime
2011/04/20 PHP
PHP经典算法集锦【经典收藏】
2016/09/14 PHP
PHP中遍历数组的三种常用方法实例分析
2019/06/24 PHP
tp5框架的增删改查操作示例
2019/10/31 PHP
Javascript 原型和继承(Prototypes and Inheritance)
2009/04/01 Javascript
javascript cookies操作集合
2010/04/12 Javascript
仿谷歌主页js动画效果实现代码
2013/07/14 Javascript
跟我学习javascript的浮点数精度
2015/11/16 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
javascript 实现文本使用省略号替代(超出固定高度的情况)
2017/02/21 Javascript
微信小程序 首页制作简单实例
2017/04/07 Javascript
vue仿淘宝订单状态的tab切换效果
2020/06/23 Javascript
vue内置指令详解
2018/04/03 Javascript
vue中锚点的三种方法
2018/07/06 Javascript
AngularJS与后端php的数据交互方法
2018/08/13 Javascript
15 分钟掌握vue-next响应式原理
2019/10/13 Javascript
浅谈webpack构建工具配置和常用插件总结
2020/05/11 Javascript
Python中的对象,方法,类,实例,函数用法分析
2015/01/15 Python
图文详解WinPE下安装Python
2016/05/17 Python
一个基于flask的web应用诞生 记录用户账户登录状态(6)
2017/04/11 Python
python输入错误密码用户锁定实现方法
2017/11/27 Python
Python中 map()函数的用法详解
2018/07/10 Python
python logging重复记录日志问题的解决方法
2018/07/12 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
Myprotein俄罗斯官网:欧洲第一运动营养品牌
2019/05/05 全球购物
Clarks鞋澳大利亚官方网站:Clarks Australia
2019/12/25 全球购物
凌阳科技股份有限公司C++程序员面试题笔试题
2014/11/20 面试题
2013英文求职信模板范文
2013/11/15 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
2014年底工作总结
2014/12/15 职场文书
2016三八妇女节慰问信
2015/11/30 职场文书
《花钟》教学反思
2016/02/17 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
Python制作一个随机抽奖小工具的实现
2021/07/07 Python
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android