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 相关文章推荐
JScript中使用ADODB.Stream判断文件编码的代码
Jun 09 Javascript
toString()一个会自动调用的方法
Feb 08 Javascript
获取div编辑框,textarea,input text的光标位置 兼容IE,FF和Chrome的方法介绍
Nov 08 Javascript
读取input:file的路径并显示本地图片的方法
Sep 23 Javascript
JS小功能(button选择颜色)简单实例
Nov 29 Javascript
无闪烁更新网页内容JS实现
Dec 19 Javascript
JavaScript中的逻辑判断符&amp;&amp;、||与!介绍
Dec 31 Javascript
如何使用Vuex+Vue.js构建单页应用
Oct 27 Javascript
微信小程序上线发布流程图文详解
May 06 Javascript
node省市区三级数据性能测评实例分析
Nov 06 Javascript
JS判断数组四种实现方法详解
Jun 29 Javascript
JavaScript 生成唯一ID的几种方式
Feb 19 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
ThinkPHP php 框架学习笔记
2009/10/30 PHP
实现在同一方法中获取当前方法中新赋值的session值解决方法
2014/06/26 PHP
Windows下编译PHP5.4和xdebug全记录
2015/04/03 PHP
php 使用html5实现多文件上传实例
2016/10/24 PHP
php实现的错误处理封装类实例
2017/06/20 PHP
laravel框架中间件简单使用方法示例
2020/01/25 PHP
JavaScript setTimeout和setInterval的使用方法 说明
2010/03/25 Javascript
网站页面自动跳转实现方法PHP、JSP(上)
2010/08/01 Javascript
jQuery的实现原理的模拟代码 -3 事件处理
2010/08/03 Javascript
Javascript浅谈之this
2013/12/17 Javascript
妙用Bootstrap的 popover插件实现校验表单提示功能
2016/08/29 Javascript
JS匿名函数类生成方式实例分析
2016/11/26 Javascript
ionic2打包android时gradle无法下载的解决方法
2017/04/05 Javascript
简单实现jQuery弹幕效果
2017/05/06 jQuery
原生javascript实现文件异步上传的实例讲解
2017/10/26 Javascript
详解JS转换数值函数Number()、parseInt()、parseFloat()
2018/08/24 Javascript
vue打包相关细节整理(小结)
2018/09/28 Javascript
Vue2.0 实现页面缓存和不缓存的方式
2019/11/12 Javascript
基于elementUI竖向表格、和并列的案例
2020/10/26 Javascript
Vue过滤器,生命周期函数和vue-resource简单介绍
2021/01/12 Vue.js
Python基于动态规划算法计算单词距离
2015/07/25 Python
Windows上配置Emacs来开发Python及用Python扩展Emacs
2015/11/20 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
Python基于分水岭算法解决走迷宫游戏示例
2017/09/26 Python
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
django输出html内容的实例
2018/05/27 Python
python调用自定义函数的实例操作
2019/06/26 Python
python移位运算的实现
2019/07/15 Python
Pycharm常用快捷键总结及配置方法
2020/11/14 Python
努比亚手机官网:nubia
2016/10/06 全球购物
J2EE系统只能是基于web
2015/09/08 面试题
自立自强的名人事例
2014/02/10 职场文书
餐饮业员工工作决心书
2014/03/11 职场文书
产假请假条
2014/04/10 职场文书
中学生秋季运动会广播稿
2014/09/21 职场文书
2019如何书写演讲稿?
2019/07/01 职场文书