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中绑定事件的命名空间详解
Apr 05 Javascript
js动态在form上插入enctype=multipart/form-data的问题
May 24 Javascript
JS 获取鼠标左右键的键值方法
Oct 11 Javascript
js实现禁止中文输入的方法
Jan 14 Javascript
jQuery实现冻结表头的方法
Mar 09 Javascript
jquery利用命名空间移除绑定事件的方法
Mar 11 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
May 03 Javascript
ui组件之input多选下拉实现方法(带有搜索功能)
Jul 14 Javascript
BetterScroll 在移动端滚动场景的应用
Sep 18 Javascript
Vue修改mint-ui默认样式的方法
Feb 03 Javascript
vue.js使用v-pre与v-html输出HTML操作示例
Jul 07 Javascript
vue使用canvas实现移动端手写签名
Sep 22 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
这东西价格,可以买几台TECSUN S-2000
2021/03/02 无线电
PHPlet在Windows下的安装
2006/10/09 PHP
dede3.1分页文字采集过滤规则详说(图文教程)续四
2007/04/03 PHP
PHP逐行输出(ob_flush与flush的组合)
2012/02/04 PHP
ThinkPHP3.1新特性之查询条件预处理简介
2014/06/19 PHP
学习php设计模式 php实现模板方法模式
2015/12/08 PHP
php微信开发之上传临时素材
2016/06/24 PHP
PHP数据库表操作的封装类及用法实例详解
2016/07/12 PHP
JavaScript 创建对象
2009/07/17 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
JS动态修改表格cellPadding和cellSpacing的方法
2015/03/31 Javascript
jqPlot jQuery绘图插件的使用
2016/06/18 Javascript
聊聊JavaScript如何实现继承及特点
2017/04/07 Javascript
vue组件编写之todolist组件实例详解
2018/01/22 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
小程序实现多选框功能
2018/10/30 Javascript
layerui代码控制tab选项卡,添加,关闭的实例
2019/09/04 Javascript
Vue Router的手写实现方法实现
2020/03/02 Javascript
Vue实现导航栏菜单
2020/08/19 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
vue在图片上传的时候压缩图片
2020/11/18 Vue.js
python实现基本进制转换的方法
2015/07/11 Python
python按综合、销量排序抓取100页的淘宝商品列表信息
2018/02/24 Python
点球小游戏python脚本
2018/05/22 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
Python实现ElGamal加密算法的示例代码
2020/06/19 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
一款CSS3实现多功能下拉菜单(带分享按)的教程
2014/11/05 HTML / CSS
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
2013/01/09 HTML / CSS
优秀毕业大学生推荐信
2013/11/13 职场文书
幼儿园英语教学反思
2014/01/30 职场文书
2014年防汛工作总结
2014/12/08 职场文书
老公出轨后的保证书
2015/05/08 职场文书
会议承办单位欢迎词
2019/07/09 职场文书