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 select控制插件
Aug 17 Javascript
jquery如何实现锚点链接之间的平滑滚动
Dec 02 Javascript
jquery模拟LCD 时钟的html文件源代码
Jun 16 Javascript
javascript中for/in循环及使用技巧
Sep 01 Javascript
jQuery图片旋转插件jQueryRotate.js用法实例(附demo下载)
Jan 21 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
Sep 10 Javascript
vue + vuex todolist的实现示例代码
Mar 09 Javascript
微信小程序如何使用globalData的方法
Jun 06 Javascript
layui实现数据表格自定义数据项
Oct 26 Javascript
基于jQuery实现可编辑的表格
Dec 11 jQuery
解决echarts 一条柱状图显示两个值,类似进度条的问题
Jul 20 Javascript
Vue为什么要谨慎使用$attrs与$listeners
Aug 27 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学习笔记 类的声明与对象实例化
2011/06/13 PHP
javascript 对象的定义方法
2007/01/10 Javascript
javascript css styleFloat和cssFloat
2010/03/15 Javascript
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
Ajax 数据请求的简单分析
2011/04/05 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
2012/01/15 Javascript
JavaScript中的对象的extensible属性介绍
2014/12/30 Javascript
JavaScript中的包装对象介绍
2015/01/27 Javascript
jQuery oLoader实现的加载图片和页面效果
2015/03/14 Javascript
js判断手机号运营商的方法
2015/10/23 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
JavaScript的new date等日期函数在safari中遇到的坑
2016/10/24 Javascript
AngularJS实现页面定时刷新
2017/03/14 Javascript
基于JavaScript实现的希尔排序算法分析
2017/04/14 Javascript
Vue传参一箩筐(页面、组件)
2019/04/04 Javascript
微信小程序网络层封装的实现(promise, 登录锁)
2019/05/08 Javascript
Vue中el-form标签中的自定义el-select下拉框标签功能
2020/04/20 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
Flask框架中密码的加盐哈希加密和验证功能的用法详解
2016/06/07 Python
python批量实现Word文件转换为PDF文件
2018/03/15 Python
Python3用tkinter和PIL实现看图工具
2018/06/21 Python
python实现指定字符串补全空格、前面填充0的方法
2018/11/16 Python
python GUI库图形界面开发之PyQt5单行文本框控件QLineEdit详细使用方法与实例
2020/02/27 Python
基于python实现破解滑动验证码过程解析
2020/05/28 Python
浅谈html5与APP混合开发遇到的问题总结
2018/03/20 HTML / CSS
鱼油专家:Omegavia
2016/10/10 全球购物
女士和男士时尚鞋在线购物:Shoespie
2019/02/28 全球购物
JPA面试常见问题
2016/11/14 面试题
工程预算与管理应届生求职信
2013/10/06 职场文书
区域销售经理职责
2013/12/22 职场文书
转党组织关系介绍信
2014/01/08 职场文书
中秋手机店促销方案
2014/06/16 职场文书
2014年教师德育工作总结
2014/11/10 职场文书
2015年学校少先队工作总结
2015/07/20 职场文书
社区结对共建协议书
2016/03/23 职场文书
基于Python实现西西成语接龙小助手
2022/08/05 Golang