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 相关文章推荐
让div层随鼠标移动的实现代码 ie ff
Dec 18 Javascript
Javascript load Page,load css,load js实现代码
Mar 31 Javascript
JQuery入门——用bind方法绑定事件处理函数应用介绍
Feb 05 Javascript
js实现点击后将文字或图片复制到剪贴板的方法
Aug 04 Javascript
node.js中的fs.ftruncate方法使用说明
Dec 15 Javascript
jquery中show()、hide()和toggle()用法实例
Jan 15 Javascript
js实现星星打分效果的方法
Jul 05 Javascript
深入浅出es6模板字符串
Aug 26 Javascript
对vue中v-if的常见使用方法详解
Sep 28 Javascript
Vue+Webpack完美整合富文本编辑器TinyMce的方法
Nov 30 Javascript
JavaScript对象访问器Getter及Setter原理解析
Dec 08 Javascript
node.js文件的复制、创建文件夹等相关操作
Feb 05 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获取windows登录用户名的方法
2014/06/24 PHP
Linux操作系统安装LAMP环境
2015/06/26 PHP
php中对象引用和复制实例分析
2019/08/14 PHP
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
js中有关IE版本检测
2012/01/04 Javascript
jquery无缝向上滚动实现代码
2013/03/29 Javascript
js读取json的两种常用方法示例介绍
2014/10/19 Javascript
js的flv视频播放器插件使用方法
2015/06/23 Javascript
jquery实现表单验证简单实例演示
2015/11/23 Javascript
详解JavaScript中数组和字符串的lastIndexOf()方法使用
2016/03/13 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
JS如何设置cookie有效期为当天24点并弹出欢迎登陆界面
2016/08/04 Javascript
微信小程序 swiper组件详解及实例代码
2016/10/25 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
jQuery实现table中两列CheckBox只能选中一个的示例
2017/09/22 jQuery
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
JS实现字符串翻转的方法分析
2018/08/31 Javascript
element-ui多文件上传的实现示例
2019/04/10 Javascript
浅谈Vue中render中的h箭头函数
2019/11/07 Javascript
将Vue组件库更换为按需加载的方法步骤
2020/05/06 Javascript
Vue.js使用axios动态获取response里的data数据操作
2020/09/08 Javascript
Django Python 获取请求头信息Content-Range的方法
2019/08/06 Python
Python3将ipa包中的文件按大小排序
2020/04/17 Python
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
html5画布旋转效果示例
2014/01/27 HTML / CSS
介绍一下grep命令的使用
2012/06/28 面试题
ktv好的活动方案
2014/08/17 职场文书
心灵点滴观后感
2015/06/02 职场文书
导师鉴定意见
2015/06/05 职场文书
大卫科波菲尔读书笔记
2015/06/30 职场文书
酒店厨房管理制度
2015/08/06 职场文书
2016形势与政策学习心得体会
2016/01/12 职场文书
4种方法python批量修改替换列表中元素
2022/04/07 Python
SQL Server的存储过程与触发器以及系统函数和自定义函数
2022/04/10 SQL Server