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 相关文章推荐
Javascript &amp; DHTML 实例编程(教程)DOM基础和基本API
Jun 02 Javascript
由document.body和document.documentElement想到的
Apr 13 Javascript
JS+css 图片自动缩放自适应大小
Aug 08 Javascript
JavaScript生成GUID的多种算法小结
Aug 18 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
Feb 17 Javascript
jQuery中insertAfter()方法用法实例
Jan 08 Javascript
Javascript中内建函数reduce的应用详解
Oct 20 Javascript
jQuery模拟窗口抖动效果
Mar 15 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
Feb 21 Javascript
vue中实现图片和文件上传的示例代码
Mar 16 Javascript
express框架中使用jwt实现验证的方法
Aug 25 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
Feb 08 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生成网页快照 不用COM不用扩展.
2010/02/11 PHP
为IP查询添加GOOGLE地图功能的代码
2010/08/08 PHP
php图片加水印原理(超简单的实例代码)
2013/01/18 PHP
PHP处理SQL脚本文件导入到MySQL的代码实例
2014/03/17 PHP
PHP常用处理静态操作类
2015/04/03 PHP
PHP 应用容器化以及部署方法
2018/02/12 PHP
基于php解决json_encode中文UNICODE转码问题
2020/11/10 PHP
利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值
2009/10/24 Javascript
在JavaScript中监听IME键盘输入事件
2011/05/29 Javascript
Knockoutjs快速入门(经典)
2012/12/24 Javascript
window.returnValue使用方法示例介绍
2014/07/03 Javascript
laytpl 精致巧妙的JavaScript模板引擎
2014/08/29 Javascript
js简单实现竖向tab选项卡的方法
2015/05/04 Javascript
AngularJS HTML DOM详解及示例代码
2016/08/17 Javascript
Bootstrap作品展示站点实战项目2
2016/10/14 Javascript
微信小程序 自动登陆PHP源码实例(源码下载)
2017/05/08 Javascript
JS去掉字符串末尾的标点符号及删除最后一个字符的方法
2017/10/24 Javascript
手把手教你使用vue-cli脚手架(图文解析)
2017/11/08 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
webpack分离css单独打包的方法
2018/06/12 Javascript
深入理解Promise.all
2018/08/08 Javascript
Bootstrap-table使用footerFormatter做统计列功能
2018/09/07 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
微信小程序弹窗禁止页面滚动的实现代码
2020/12/30 Javascript
Python守护进程和脚本单例运行详解
2017/01/06 Python
Python实现手写一个类似django的web框架示例
2018/07/20 Python
python安装numpy和pandas的方法步骤
2019/05/27 Python
Python with用法:自动关闭文件进程
2019/07/10 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
2020/02/22 Python
Python计算矩阵的和积的实例详解
2020/09/10 Python
python 制作简单的音乐播放器
2020/11/25 Python
打印机墨盒:123Inkjets
2017/02/16 全球购物
致200米运动员广播稿
2014/02/06 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
canvas多重阴影发光效果实现
2021/04/20 Javascript
PostgreSQL自动更新时间戳实例代码
2021/11/27 PostgreSQL