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开发随笔一 preventDefault的必要
Nov 25 Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
May 07 Javascript
Javascript表格翻页效果的具体实现
Oct 05 Javascript
jQuery简单实现隐藏以及显示特效
Feb 26 Javascript
javascript结合Canvas 实现简易的圆形时钟
Mar 11 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
Jun 03 Javascript
jQuery日程管理控件glDatePicker用法详解
Mar 29 jQuery
微信小程序 下拉菜单简单实例
Apr 13 Javascript
用最简单的方法判断JavaScript中this的指向(推荐)
Sep 04 Javascript
移动端效果之IndexList详解
Oct 20 Javascript
Postman的下载及安装教程详解
Oct 16 Javascript
vue+springboot图片上传和显示的示例代码
Feb 14 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
锁定年轻人的双倍活力 星巴克推出星倍醇即饮浓咖啡
2021/03/03 咖啡文化
可定制的PHP缩略图生成程式(需要GD库支持)
2007/03/06 PHP
php 购物车实例(申精)
2009/05/11 PHP
PHP实现加强版加密解密类实例
2015/07/29 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
PHP XML Expat解析器知识点总结
2019/02/15 PHP
JavaScript isPrototypeOf和hasOwnProperty使用区别
2010/03/04 Javascript
javascript 自动填写表单的实现方法
2010/04/09 Javascript
javascript之典型高阶函数应用介绍
2013/01/10 Javascript
jQuery实现点击标题输入详细信息
2013/04/16 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
jQuery实现购物车计算价格功能的方法
2015/03/25 Javascript
javascript伸缩菜单栏实现代码分享
2015/11/12 Javascript
Angular 2父子组件数据传递之@Input和@Output详解 (上)
2017/07/05 Javascript
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
详解NodeJs开发微信公众号
2018/05/25 NodeJs
JS实现提示效果弹出及延迟隐藏的功能
2019/08/26 Javascript
js实现淘宝首页的banner栏效果
2019/11/26 Javascript
javascript实现切割轮播效果
2019/11/28 Javascript
node.JS事件机制与events事件模块的使用方法详解
2020/02/06 Javascript
python 对dataframe下面的值进行大规模赋值方法
2018/06/09 Python
python中的二维列表实例详解
2018/06/19 Python
python读取LMDB中图像的方法
2018/07/02 Python
python 读取修改pcap包的例子
2019/07/23 Python
python单例设计模式实现解析
2020/01/07 Python
python解释器pycharm安装及环境变量配置教程图文详解
2020/02/26 Python
tensorflow从ckpt和从.pb文件读取变量的值方式
2020/05/26 Python
python实现数学模型(插值、拟合和微分方程)
2020/11/13 Python
python爬虫scrapy基本使用超详细教程
2021/02/20 Python
玩转CSS3色彩
2010/01/16 HTML / CSS
介绍一下Transact-SQL中SPACE函数的用法
2015/09/01 面试题
自我评价格式
2014/01/06 职场文书
二人合伙经营协议书
2014/09/13 职场文书
开展警示教育活动总结
2015/05/09 职场文书
初中班主任工作总结2015
2015/05/13 职场文书
2019年最新借条范本!
2019/07/08 职场文书