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.extend()的实现方式详解及实例
Jun 29 Javascript
jQuery的live()方法对hover事件的处理示例
Feb 27 Javascript
jQuery中slideUp()方法用法分析
Dec 24 Javascript
详解JavaScript的AngularJS框架中的表达式与指令
Mar 05 Javascript
浅谈Cookie的生命周期问题
Aug 02 Javascript
EasyUI 结合JS导出Excel文件的实现方法
Nov 10 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
Dec 23 Javascript
js+div+css下拉导航菜单完整代码分享
Dec 28 Javascript
JavaScript实现为事件句柄绑定监听函数的方法分析
Nov 14 Javascript
js中null与空字符串&quot;&quot;的区别讲解
Jan 17 Javascript
JS实现的贪吃蛇游戏案例详解
May 01 Javascript
javascript跳转与返回和刷新页面的实例代码
Nov 20 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
ASP知识讲座四
2006/10/09 PHP
PHP session有效期session.gc_maxlifetime
2011/04/20 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
PHP中使用数组指针函数操作数组示例
2014/11/19 PHP
Laravel validate error处理,ajax,json示例
2019/10/25 PHP
如何在标题栏显示框架内页面的标题
2007/02/03 Javascript
ext jquery 简单比较
2010/04/07 Javascript
菜鸟javascript基础资料整理3 正则
2010/12/06 Javascript
JQuery 1.6发布 性能提升,同时包含大量破坏性变更
2011/05/10 Javascript
浅析JavaScript原型继承的陷阱
2013/12/03 Javascript
对于jQuery性能的一些优化建议
2015/08/13 Javascript
Vue+Typescript中在Vue上挂载axios使用时报错问题
2019/08/07 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
uni app仿微信顶部导航条功能
2019/09/17 Javascript
vue-router 控制路由权限的实现
2020/09/24 Javascript
[51:15]完美世界DOTA2联赛PWL S2 PXG vs Magma 第一场 11.21
2020/11/24 DOTA
python发送HTTP请求的方法小结
2015/07/08 Python
Python生成随机数组的方法小结
2017/04/15 Python
python代码 FTP备份交换机配置脚本实例解析
2019/08/01 Python
使用Rasterio读取栅格数据的实例讲解
2019/11/26 Python
python-xpath获取html文档的部分内容
2020/03/06 Python
Python如何使用正则表达式爬取京东商品信息
2020/06/01 Python
伦敦一家非常流行的时尚精品店:Oxygen Boutique
2017/01/15 全球购物
巴西最大的运动品牌:Olympikus
2020/07/14 全球购物
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
CSS代码检查工具stylelint的使用方法详解
2021/03/27 HTML / CSS
回门宴答谢词
2014/01/13 职场文书
大学生秋游活动方案
2014/02/17 职场文书
青年文明号服务承诺
2014/03/31 职场文书
关于读书的演讲稿600字
2014/08/27 职场文书
忠诚教育心得体会
2014/09/03 职场文书
2014年收银工作总结
2014/11/13 职场文书
学习社交礼仪心得体会
2016/01/22 职场文书
导游词之澳门妈祖庙
2019/12/19 职场文书
win10安装配置nginx的过程
2021/03/31 Servers
Python下载商品数据并连接数据库且保存数据
2022/03/31 Python