JS判断元素为数字的奇异写法分享


Posted in Javascript onAugust 01, 2012

这是在阅读underscore(1.3.3)源码中看到的,它的each方法

var each = _.each = _.forEach = function(obj, iterator, context) { 
if (obj == null) return; 
if (nativeForEach && obj.forEach === nativeForEach) { 
obj.forEach(iterator, context); 
} else if (obj.length === +obj.length) { 
for (var i = 0, l = obj.length; i < l; i++) { 
if (iterator.call(context, obj[i], i, obj) === breaker) return; 
} 
} else { 
for (var key in obj) { 
if (_.has(obj, key)) { 
if (iterator.call(context, obj[key], key, obj) === breaker) return; 
} 
} 
} 
};

该方法里有一句
if (obj.length === +obj.length)

看半天没明白,后经高人指点,这句等价于
if (typeof obj.length === 'number')

即是用来判断元素是否为数字类型的。typeof和Object.prototype.toString是常见的写法。而最后一种则不常见,常人难以理解。

一些库有类型判断的工具函数,如

function isNumber1(a){ 
return typeof a === 'number' 
}

又或者用Object.prototype.toString
function isNumber2(a) { 
return Object.prototype.toString.call(a) === '[object Number]' 
}

改成这种写法
function isNumber3(a){ 
return a === +a 
}

用各种类型测试下
var arr = ['1', true, false, undefined, null, {}, [], 1] 
for (var i=0; i<arr.length; i++) { 
console.log(isNumber3(arr[i])) 
}

结果只有数组最后的一项为true。即只有数字类型 a === +a 才为真。
为什么不用typeof,因为字符串比较理论上是需要遍历所有字符的,性能和字符串长度成正比。
Javascript 相关文章推荐
仅IE支持clearAttributes/mergeAttributes方法使用介绍
May 04 Javascript
js 显示base64编码的二进制流网页图片
Apr 04 Javascript
javascript比较两个日期的先后示例代码
Dec 31 Javascript
基于JavaScript实现一定时间后去执行一个函数
Dec 14 Javascript
node.js实现端口转发
Apr 14 Javascript
JSP防止网页刷新重复提交数据的几种方法
Nov 19 Javascript
jQuery中select与datalist制作下拉菜单时的区别浅析
Dec 30 Javascript
ReactNative页面跳转Navigator实现的示例代码
Aug 02 Javascript
ionic App问题总结系列之ionic点击系统返回键退出App
Aug 19 Javascript
详解Vue的组件中data选项为什么必须是函数
Aug 17 Javascript
通过实例了解Render Props回调地狱解决方案
Nov 04 Javascript
Vue3.0写自定义指令的简单步骤记录
Jun 27 Vue.js
javascript for循环从入门到偏门(效率优化+奇特用法)
Aug 01 #Javascript
jQuery源码中的chunker 正则过滤符分析
Jul 31 #Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
Jul 31 #Javascript
基于jquery的点击链接插入链接内容的代码
Jul 31 #Javascript
基于jQuery实现的百度导航li拖放排列效果,即时更新数据库
Jul 31 #Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
Jul 31 #Javascript
jQuery.each()用法分享
Jul 31 #Javascript
You might like
使用phpQuery采集网页的方法
2013/11/13 PHP
PHP面向对象五大原则之接口隔离原则(ISP)详解
2018/04/04 PHP
js实现图片轮换效果代码
2013/04/16 Javascript
往光标所在位置插入值的js代码
2013/09/22 Javascript
深入理解Javascript里的依赖注入
2014/03/19 Javascript
基于jquery的手风琴图片展示效果实现方法
2014/12/16 Javascript
JQuery解析XML的方法小结
2016/04/02 Javascript
jQuery自定义图片缩放拖拽插件imageQ实现方法(附demo源码下载)
2016/05/27 Javascript
jQuery实现调整表格单列顺序完整实例
2016/06/20 Javascript
深入浅析JavaScript中的scrollTop
2016/07/11 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
AngularJS通过$http和服务器通信详解
2016/09/21 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
JavaScript字符串_动力节点Java学院整理
2017/06/27 Javascript
JS非空验证及邮箱验证的实例
2017/08/11 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
2017/12/13 Javascript
JavaScript运行原理分析
2018/02/09 Javascript
requests和lxml实现爬虫的方法
2017/06/11 Python
Python实现自动上京东抢手机
2018/02/06 Python
python 实现数组list 添加、修改、删除的方法
2018/04/04 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
Python判断两个文件是否相同与两个文本进行相同项筛选的方法
2019/03/01 Python
Python中断多重循环的几种方式详解
2020/02/10 Python
python中remove函数的踩坑记录
2021/01/04 Python
h5页面唤起app如果没安装就跳转下载(iOS和Android)
2020/06/03 HTML / CSS
New Balance美国官网:运动鞋和健身服装
2017/04/11 全球购物
尤为Wconcept中国官网:韩国设计师品牌服饰
2019/01/10 全球购物
什么是Web Service?
2012/07/25 面试题
vue 中 get / delete 传递数组参数方法
2021/03/23 Vue.js
大学生四个方面的自我评价
2013/09/19 职场文书
人力管理专业毕业生求职信
2014/02/27 职场文书
毕业生找工作求职信
2014/08/05 职场文书
初中军训感想
2015/08/07 职场文书
CSS变量实现主题切换的方法
2021/06/23 HTML / CSS