# JS判断数据类型的方法
来源:http://www.jb51.net/article/84968.htm
> 比如要判断一个变量是否是数组类型,PHP中有is_array()函数可以直接判断,然而js中我们需要...-- well,下面我们就来详细看一下JavaScript中判断数据类型的方法总结
## 一:typeof
```
//haorooms是全局变量
if(haorooms!=undefined){
}
//js会报错,说"Uncaught ReferenceError: haorooms is not defined"
```
解决的方法是我们如下写:
```
if(typeof haorooms!=undefined){
}
```
用了typeof之后,就不会报错了!这是typeof的应用之一!
此外,typeof还可以进行数据类型的判断!如下:
```
var haorooms="string"; console.log(haorooms); //string
var haorooms=1; console.log(haorooms); //number
var haorooms=false; console.log(haorooms); //boolean
var haorooms; console.log(typeof haorooms); //undfined
var haorooms= null; console.log(typeof haorooms); //object
var haorooms = document; console.log(typeof haorooms); //object
var haorooms = []; console.log(haorooms); //object
var haorooms = function(){}; console.log(typeof haorooms) //function 除了可以判断数据类型还可以判断function类型
```
很明显,对于typeof,除了前四个类型外,null、对象、数组返回的都是object类型;
## 二:instanceof
可以用其判断是否是数组。
```
var haorooms=[];
console.log(haorooms instanceof Array) //返回true
```
## 三:constructor
constructor就是返回对象相对应的构造函数。
判断各种数据类型的方法:
```
console.log([].constructor == Array);
console.log({}.constructor == Object);
console.log("string".constructor == String);
console.log((123).constructor == Number);
console.log(true.constructor == Boolean);
function employee(name,job,born){
this.name=name;
this.job=job;
this.born=born; }
var haorooms=new employee("Bill Gates","Engineer",1985);
console.log(haorooms.constructor); //输出function employee(name, jobtitle, born){this.name = name; this.jobtitle = job; this.born = born;}
```
通过输出haorooms.constructor,可以看出constructor就是返回对象相对应的构造函数。
## 四:Object.prototype.toString
前面我们提到了可以运用 constructor 属性来判定物件类型,让我们再来讲讲 Object.protype.toString 这个方法
```
Object.prototype.toString.apply({}) // "[object Object]"
Object.prototype.toString.apply([]) // "[object Array]"
Object.prototype.toString.apply(NaN)// "[object Number]"
Object.prototype.toString.apply(function(){}) // "[object Function]"
```
运用这种方式我们可以正确的判断一个变量的基本型态,但是如果是自订类型的话,却无法得知真正的类型,因为结果依然会是 [object Object]
## 五:其他(我暂时没看懂这个)
jQuery 也有类型判断的方法,下面是一例
```
$.isWindow(window) // true
```
怎么做的呢
```
core.js#479
isWindow: function( obj ) {
return obj != null && obj == obj.window;
}
```
所以开一个这样的 Object:
```
var fakeWindow;
fakeWindow = {};
fakeWindow.window = fakeWindow;
$.isWindow(fakeWindow) // true
```
你就骗过他了。
## 小结
在 JavaScript 中要正确判断类型,当仔细去钻研的时候,真是一件麻烦事,根据不同的情境去设计你的判断式是相当重要的,我们也必须要去思考如何用最简洁的方式判断正确的类型,当然这篇还有很多地方没有介绍到,例如 isPrototypeOf 这个方法,JavaScript 是一个有许多历史包袱的语言,但也是不断的在进步,运用它的时候,要注意,有太多的方式是双面刃,切记要小心运用。
- 附言
- JS规范及使用工具
- JS调试
- JS判断数据类型的方法
- apicloud在chrome下进行手机上调试
- JS数据类型转换
- JS-ApiCloud和Sublime同时调试方法
- api.js(官方)
- 团队-load.js(11)
- pushUp(上拉加载)
- pushDown(下拉刷新)
- ajax(对ajax函数封装)
- runAjax(对ajax函数封装)
- updateData(更新模板数据)
- showProgress(显示模态加载)
- hideProgress(隐藏模态加载)
- netError(网络不好的情况下统一定义的错误)
- LoadImage(图片开启缓存)
- 团队-common.js(24)
- isDefine(判断值是否定义)
- verifyMobile(检测手机号是否合法)
- verifyPassword(验证密码和确认密码是否一致)
- VerifyRegion(验证区域)
- jsonToStr(json对象转字符串)
- strToJson(json字符串转json对象)
- isJson(判断是否是json对象)
- showToast(显示模态提示)
- uploadPhoto(上传图片模块封装)
- selectCity(选择城市函数封装)
- openWin(打开新窗口)
- openFrame(打开frame)
- confirm(确认提示函数封装)
- 倒计时-总
- countDown(倒计时1-毫秒级倒计时)
- date_format(倒计时2-时间格式化输出)
- fill_zero_prefix(倒计时3-位数不足补零)
- RemainingTime(倒计时4-计算时间差)
- popupInput(键盘自动弹出功能1-弹出输入框)
- getInputValue(键盘自动弹出功能2-获取输入框的值)
- exitApp(退出监听)
- developing(提示在开发中)
- closeWin(关闭窗口)
- fix_android_ios(解决沉浸式的问题)
- isNumber(是否为数字)
- writeFile(存储文件)
- readFile(读取缓存文件)
- removeDir(删除缓存文件夹)
- dotTpl(doT模板获取数据)
- getAgeByBirthday(根据出生日期算出年龄)
- getConstellationByBirthday(根据出生判断星座)
- isCardNo(检测身份证号合法性)
- 团队-yfsocket.js
- 团队-user.js
- getUser(获取当前的用户)
- getUserID(获取当前用户的ID)
- userRegister(用户注册)
- userLoginTest(测试登录地址不传参)
- userLogin(用户登录)
- 团队-config.js
- 团队-log.js
- log(控制台日志)
- 团队-chat.js
- getHistoryMessages(请求历史消息)
- updateHistoryMessages(更新历史消息)
- getNewMessages(监听来自入口文件的新消息)
- sendMessageToPage(会话页面插入发送的消息)
- sendMessageToServer(发送消息到服务器)
- updateSendDataStatus(更新发送的消息的状态)
- updateSendDataStatus(更新发送的消息的状态)
- getSortFun(排序函数)
- pressRecord(监听按下录音)
- cancelRecord(监听松开录音键)
- inputBarMove(监听键盘聊天框键盘弹出,用于调整聊天窗口高度)
- fnOpenChatBox(打开聊天框)
- transText(表情处理)
- getImgsPaths(获取所有表情图片的名称和真实URL地址)
- playVoice(播放语音函数)
- fnClearMessage(清空当前聊天记录)
- uploadPicture(上传图片到服务器)
- uploadVoice(上传语音到服务器)
- downVoiceFile(下载语音文件)
- AUI系列(17)
- api.js
- aui-waterfall.js
- aui-tab.js
- aui-actionsheet.js
- aui-collapse.js
- aui-dialog.js
- aui-lazyload.js
- aui-list-swipe.js
- aui-popup.js
- aui-popup-new.js
- aui-pull-refresh.js
- aui-range.js
- aui-scroll.js
- aui-sharebox.js
- aui-skin.js
- aui-slide.js
- aui-toast.js
- aui-list-swipe.js
- aui-list-swipe-backup.js
- aui-slide.js
- RAF-app.js(42)
- close_start_page 关闭启动图
- r_ajax(ajax函数封装)
- start_welcome
- set_welcome
- open_f_mask
- open_w(打开新窗口)
- close_w(关闭当前页面)
- close_name_w(关闭指定页面)
- open_f(打开浮动窗口)
- open_slide(打开侧滑)
- close_slide(关闭侧滑)
- hide_f(隐藏frame)
- close_f(关闭frame)
- get_f_h(得到frame的高度)
- scroll_page(页面滚动)
- $toast(提示框)
- $alert(警告框)
- open_datetime(选择日期时间)
- push_down(下拉刷新)
- push_down_over(下拉刷新恢复)
- push_up(上拉加载)
- push_up_over(上拉加载恢复)
- call_tel(拨打电话)
- send_sms(发送短息)
- open_url(加载网页)
- get_osid(获得设备编号)
- show_doing(显示模态加载)
- hide_doing(关闭模态加载)
- check_update(检测版本更新)
- update_widget(静默更新)
- exit_app(退出APP)
- android_exit(执行指定窗口界面)
- ue_script(执行指定窗口界面)
- ue_script_f(执行指定窗口界面)
- clear_cache(清除缓存)
- net_error(网络不好的情况)
- select_img(选择图片)
- get_par(获取页面参数)
- download(下载)
- get_os(获取系统类型)
- get_location(获取位置)
- get_net(获取网络情况)
- RAF-init.js(15)
- var serverURL(定义路径)
- set_local(设置本地存储)
- get_local(获取本地存储)
- json2str(json转字符串)
- str2json(字符串转json)
- is_json(是否是json对象)
- in_array(判断字符串是否在array中)
- loading(加载中)
- is_define(判断是否是空)
- input_float(控制只能输入小数)
- input_int(控制只能输入整数)
- is_mobile(是否手机号码)
- timetostr(根据时间戳获取年、月、日)
- num_two(自动补零)
- 未知-check.js(7)
- checkMobile(验证手机号)
- checkPassword(验证密码和确认密码)
- checkRegion(注册短信模块)
- register(register)
- sms(发送短信验证码)
- checkCode(验证短信验证码输入是否正确)
- CountDown(验证码动态数字特效)
- 第三方JS
- doT.js-模板引擎
- echo.js-移动端的图片延迟加载
- swipe.js-图片轮播
- iscroll.js-顶部导航滚动
- async.js-异步接口同步调用
- hammer.js-移动端的手势库
- 问题
- can't find variable:ajax
- can't find variable:is_define