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 相关文章推荐
JQuery autocomplete 使用手册
Apr 01 Javascript
javascript中获取下个月一号,是星期几
Jun 01 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
Jun 08 Javascript
js数组去重的常用方法总结
Jan 24 Javascript
jQuery toggleClass应用实例(附效果图)
Apr 06 Javascript
基于jquery ui的alert,confirm方案(支持换肤)
Apr 03 Javascript
JS中showModalDialog关闭子窗口刷新主窗口用法详解
Mar 25 Javascript
Vuex简单入门
Apr 19 Javascript
详解js中let与var声明变量的区别
Apr 05 Javascript
async/await让异步操作同步执行的方法详解
Nov 01 Javascript
swiper4实现移动端导航栏tab滑动切换
Oct 16 Javascript
js中实现继承的五种方法
Jan 25 Javascript
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
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
php通过字符串调用函数示例
2014/03/02 PHP
php实现随机显示图片方法汇总
2015/05/21 PHP
PHP的Laravel框架中使用消息队列queue及异步队列的方法
2016/03/21 PHP
Laravel接收前端ajax传来的数据的实例代码
2017/07/20 PHP
PHP实现微信退款功能
2018/10/02 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
php的扩展写法总结
2019/05/14 PHP
javascript入门基础之私有变量
2010/02/23 Javascript
仿百度联盟对联广告实现代码
2014/08/30 Javascript
node.js中的http.response.getHeader方法使用说明
2014/12/14 Javascript
jQuery实现Div拖动+键盘控制综合效果的方法
2015/03/10 Javascript
jQuery实现精美的多级下拉菜单特效
2015/03/14 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
jQuery的each循环用法简单示例
2016/06/12 Javascript
详解Jquery Easyui的验证扩展
2017/01/09 Javascript
原生js实现放大镜
2017/02/20 Javascript
CSS3+JavaScript实现翻页幻灯片效果
2017/06/28 Javascript
Vue+Openlayers自定义轨迹动画
2020/09/24 Javascript
Python使用scrapy采集数据过程中放回下载过大页面的方法
2015/04/08 Python
python 系统调用的实例详解
2017/07/11 Python
python pandas库中DataFrame对行和列的操作实例讲解
2018/06/09 Python
python使用folium库绘制地图点击框
2018/09/21 Python
pandas 转换成行列表进行读取与Nan处理的方法
2018/10/30 Python
pygame游戏之旅 添加键盘按键的方法
2018/11/20 Python
使用Python和Prometheus跟踪天气的使用方法
2019/05/06 Python
【HTML5】3D模型--百行代码实现旋转立体魔方实例
2016/12/16 HTML / CSS
英国和爱尔兰的自炊式豪华度假小屋:Rural Retreats
2018/06/08 全球购物
区域销售经理岗位职责
2013/12/10 职场文书
销售简历自我评价
2014/01/24 职场文书
有趣的广告词
2014/03/18 职场文书
双创工作实施方案
2014/03/26 职场文书
学校感恩教育活动总结
2014/07/07 职场文书
开学典礼观后感
2015/06/15 职场文书
python实现局部图像放大
2021/11/17 Python
使用Cargo工具高效创建Rust项目
2022/08/14 Javascript