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 相关文章推荐
js 页面输出值
Nov 30 Javascript
关于jQuery UI 使用心得及技巧
Oct 10 Javascript
jQuery使用数组编写图片无缝向左滚动
Dec 11 Javascript
js模拟hashtable的简单实例
Mar 06 Javascript
sogou地图API用法实例教程
Sep 11 Javascript
node.js中的favicon.ico请求问题处理
Dec 15 Javascript
js+html5实现canvas绘制网页时钟的方法
May 21 Javascript
根据Bootstrap Paginator改写的js分页插件
Dec 25 Javascript
轻松实现jQuery添加删除按钮Click事件
Mar 13 Javascript
angularjs利用directive实现移动端自定义软键盘的示例
Sep 20 Javascript
利用d3.js力导布局绘制资源拓扑图实例教程
Jan 08 Javascript
小程序登录之支付宝授权的实现示例
Dec 13 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的in_array低性能问题
2013/09/17 PHP
php的laravel框架快速集成微信登录的方法
2016/12/12 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
2019/01/17 PHP
JS模拟多线程
2007/02/07 Javascript
jsTree树控件(基于jQuery, 超强悍)[推荐]
2009/09/01 Javascript
使用js对select动态添加和删除OPTION示例代码
2013/08/12 Javascript
jQuery结合HTML5制作的爱心树表白动画
2015/02/01 Javascript
JavaScript中常见获取元素的方法汇总
2015/03/04 Javascript
ros::spin() 和 ros::spinOnce()函数的区别及详解
2016/10/01 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
jQuery实现限制文本框的输入长度
2017/01/11 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
手写Vue弹窗Modal的实现代码
2019/09/11 Javascript
Layui表格监听行单双击事件讲解
2019/11/14 Javascript
vue添加自定义右键菜单的完整实例
2020/12/08 Vue.js
Python实现在线程里运行scrapy的方法
2015/04/07 Python
python生成圆形图片的方法
2020/03/25 Python
用Python写一段用户登录的程序代码
2018/04/22 Python
python 获取一个值在某个区间的指定倍数的值方法
2018/11/12 Python
Python零基础入门学习之输入与输出
2019/04/03 Python
计算机二级python学习教程(3) python语言基本数据类型
2019/05/16 Python
Python3从零开始搭建一个语音对话机器人的实现
2019/08/23 Python
python+selenium select下拉选择框定位处理方法
2019/08/24 Python
Django vue前后端分离整合过程解析
2020/11/20 Python
Python tkinter实现日期选择器
2021/02/22 Python
美国鲍勃商店:Bob’s Stores
2018/07/22 全球购物
工程力学专业毕业生求职信
2013/10/06 职场文书
机械专业毕业生推荐信范文
2013/11/25 职场文书
党员四风问题对照检查材料思想汇报
2014/09/16 职场文书
出租车拒载检讨书
2015/01/28 职场文书
酒店人事专员岗位职责
2015/04/07 职场文书
毕业证明书
2015/06/19 职场文书
道士塔读书笔记
2015/06/30 职场文书
活动新闻稿范文
2015/07/17 职场文书
2015年校本培训工作总结
2015/07/24 职场文书
vue实现省市区联动 element-china-area-data插件
2022/04/22 Vue.js