javascript之判断专题
javascript有数组,对象,函数,字符串,布尔,还有Symbol,set,map,weakset,weakmap。
判断这些东西也是有很多坑,像原生的typeof,instanceOf有一些bug,有些能满足90%的情况,也有些不太如人意。
所以各大类库都出了一些判断的函数,以is开头的xxx。
1,判断null
typeof null//'object',所以不能用typeof判断。typeof的一个坑。
null大家都是用 null===null判断的。jquery阿underscore都是这么写:
function isNull(obj){return obj===null}
2.undefined
typeof undefined==="undefined",还不能直接写undefined,而jq等类库和underscore都是这么写的:
function isUndefined(obj){return obj===void 0;}
3.NaN
typeof NaN==="number",js内置的isNaN在输入字符串,对象都返回true,白瞎这个名字了,不过倒是有人用这个判断数字,!isNaN(number)。所以判断NaN的时候是:
function isNaN(obj){return obj!==obj}
jquery,underscore等类库也都是这么判断,看来大家意见差不多。
3.window对象
jquery的判断window对象
//判断window
function isWindow(){
window==document//IE678 true
document==window//IE678 false
}
3.判断基础类型Number,boolean,function,string。
//typeof判断string,number,boolean,function可满足90%的需求
//但是。。。
typeof new Boolean(1);//"object"
typeof new Number(1);//"object"
typeof new String(1);//"object"
这些要判断也蛮简单的,上一下underscore的源码吧。
_.isFunction / _.isString / _.isNumber / _.isDate / _.isRegExp都是这样。。用Object.prototype.toString.call(obj)判断
刚刚试了下,Object.toString.call和原型链上的toString返回的不一样-0-。
_.isFunction = function(obj) {
return Object.protorype.toString.call(obj) == '[object Function]';
};
underscore的boolean的判断还是蛮全的,包括字面量,对象形式的boolean:
_.isBoolean = function(obj) {
return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
};
4.object
typeof 太多东西都是object了,看看underscore咋判断
_.isObject = function(obj) {
return obj === Object(obj);
};
//这里
typeof null//'object'
typeof []//object
typeof /\d/i //"object"
typeof window.alert //IE678 "object"
5.element
_.isElement = function(obj) {
return !!(obj && obj.nodeType == 1);
};
6.Arguments
这是underscore的判断Arguments,和源码,注释很清楚也不多说。
_.isArguments = function(obj) {
return toString.call(obj) == '[object Arguments]';
};
// 验证isArguments函数, 如果运行环境无法正常验证arguments类型的数据, 则重新定义isArguments方法
if(!_.isArguments(arguments)) {
// 对于环境无法通过toString验证arguments类型的, 则通过调用arguments独有的callee方法来进行验证
_.isArguments = function(obj) {
// callee是arguments的一个属性, 指向对arguments所属函数自身的引用
return !!(obj && _.has(obj, 'callee'));
};
}
7.Array
判断数组是最麻烦的,前面的还好,数组默认的0,1,2,3的下标,一个length属性,一些Array方法,判断的时候还要保证obj不是类数组,还要保证不是Arguments。。
我们看一下这些类库探索Array的路程
开始是
return arr.instanceof Array;
后来
return !!arr&&arr.constructor==Array;
return typeof arr.sort=='function'
return try{
Array.prototype.toString.call(o);
return true;
}catch(e){
return false;
}
从instanceof判断,constructor的判断到Array的toString方法的判断,可谓是用尽心思,最新版的jquery的判断array好像把这好多方法集合在一起,写的老长。
underscore的判断还是用它的toString.call判断:
_.isArray = nativeIsArray ||
function(obj) {
return toString.call(obj) == '[object Array]';
};
如果js原生支持isArray就先用原生的,这个nativeIsArray在一开始被设置为Array的isArray方法。
各大框架也有类数组的判断,这个更麻烦,老长的代码,判断原理是类数组的length属性能被重写,而数组的length属性不能被重新,代码就不贴了。
8.iframe
//判断页面是否在iframe
function(){
alert(window!=window.top)
alert(window.frameElement!==null)
alert(window.eval!==top.eval)
}
//判断iframe与父页面同源
function isSameOrigin(el){
var ret=false;
try{
ret=!!el.contentWindow.location.href; }catch(e){}
return ret;
}
附赠取iframe的函数
//取iframe的对象
function getIframeDocument(node){
return node.contentDocument||node.contentWindow.document
}
总结一下原生判断的一些坑。
//typeof 的陷阱
typeof null//'object'
typeof []//object
typeof document.childNodes //safari "function"
typeof document.createElement('embed')//ff3-10 "function"
typeof document.createElement('object')//ff3-10 "function"
typeof document.createElement('applet')//ff3-10 "function"
typeof /\d/i
typeof window.alert //IE678 "object"
//instanceof不能跨文档比较 iframe里面的数组实例不是父窗口的Array实例
instanceof
//contructor的陷阱
//旧版本ie下dom bom对象的constructor属性没有暴露出来
好,今天就写这么多,谢谢观看,如有错误,请指出,大家共同学习~
javascript之判断专题的更多相关文章
- 输入5至10之间的数字(用javaScript实现判断)
输入5至10之间的数字 ----用javaScript实现判断 代码如下: <!DOCTYPE html><html><body> <script>fu ...
- Javascript中判断数组的正确姿势
在 Javascript 中,如何判断一个变量是否是数组? 最好的方式是用 ES5 提供的 Array.isArray() 方法(毕竟原生的才是最屌的): var a = [0, 1, 2]; con ...
- JavaScript中判断为整数的多种方式
之前记录过JavaScript中判断为数字类型的多种方式,这篇看看如何判断为整数类型(Integer). JavaScript中不区分整数和浮点数,所有数字内部都采用64位浮点格式表示,和Java的d ...
- 关于 JavaScript 数据类型判断
在 JavaScript 中,有 undefined.null.number.string.boolean 五种基本数据类型,另外,有一种复杂数据类型 object ,类似于 C# 中值类型.引用类型 ...
- Java与JavaScript中判断两字符串是否相等的区别
JavaScript是一种常用的脚本语言,这也决定了其相对于其他编程语言显得并不是很规范.在JavaScript中判断两字符串是否相等 直接用==,这与C++里的String类一样.而Java里的等号 ...
- JavaScript中判断整字类型最简洁的实现方法
这篇文章主要介绍了JavaScript中判断整字类型最简洁的实现方法,本文给出多个判断整数的方法,最后总结出一个最短.最简洁的实现方法,需要的朋友可以参考下 我们知道JavaScript提供了type ...
- JavaScript复杂判断的更优雅写法
摘要: 写代码是一门艺术. 原文:JavaScript 复杂判断的更优雅写法 作者:Think. 公众号:大转转fe Fundebug经授权转载,版权归原作者所有. 前提 我们编写js代码时经常遇到复 ...
- JavaScript实现判断图片是否加载完成的3种方法整理
JavaScript实现判断图片是否加载完成的3种方法整理 有时候我们在前端开发工作中为了获取图片的信息,需要在图片加载完成后才可以正确的获取到图片的大小尺寸,并且执行相应的回调函数使图片产生某种显示 ...
- javascript中判断变量时变量值为 0 的特殊情况
有时候我们在js中会直接判断变量是否存在值,下面列举一些情况: var a = 0; var b = 1; var c = ' '; var d; console.log( a ? 1 : null) ...
随机推荐
- java集合迭代器
一.Java中有一个设计模式是迭代器模式 1.迭代器模式定义迭代器模式(Iterator),提供一种方法顺序访问一个聚合对象中的各种元素,而又不暴露该对象的内部表示. 2.迭代器模式概述Java集合框 ...
- [转帖]FORFILES 的简单介绍。
FORFILES https://blog.csdn.net/sandy9919/article/details/82932460 命令格式: forfiles.exe /p "D:\备份& ...
- Kettle转换工具Windows版安装
一.简介 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定. Kettle 中文名称叫水壶,该项目的主程序员MAT ...
- C#中那些常用的工具类(Utility Class)(一)
代码越写越多,但是我们也需要经常去反思那些写过的代码,Utility Class就是这一类需要特别去反思总结的类,这些类像工具一样,我们经常通过一些静态方法,通过传入一些参数,然后得到我们需要的结果, ...
- 解决 Redis 只读不可写的问题
本文转载:https://blog.csdn.net/han_cui/article/details/54767208?tdsourcetag=s_pcqq_aiomsg 解决 Redis 只读不可写 ...
- SSH整合Maven教程
http://www.cnblogs.com/xdp-gacl/p/4239501.html
- Java线程的创建方式三:Callable(四)
一.Java实现多线程的三种方式 方式一:继承Thread类: public class Test extends Thread { public static void main(String[] ...
- Hibernate中的Entity类之间的继承关系之一MappedSuperclass
在hibernate中,Entity类可以继承Entity类或非Entity类.但是,关系数据库表之间不存在继承的关系.那么在Entity类之间的继承关系,在数据库表中如何表示呢? Hibernate ...
- 添加一个Android框架层的系统服务与实现服务的回调
2017-10-09 概述 所谓Android系统服务其本质就是一个通过AIDL跨进程通信的小Demo的延伸而已.按照 AIDL 跨进程通信的标准创建一套程序,将服务端通过系统进程来运行实现永驻内存, ...
- 多校#5-1005-Instring-HDU5785-manacher+维护
寻找三元组(i,j,k),使得(i,j)(j,k)都是回文字串,其中i<=j<k. 可以发现,对于每一位i,只要预处理出来有多少个以i为右端的回文串和以i为左端的回文串.把那些串的另一端的 ...