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 相关文章推荐
农历与西历对照
Sep 06 Javascript
jQuery插件 tabBox实现代码
Feb 09 Javascript
多浏览器支持的右下角浮动窗口
Apr 01 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
Jun 06 Javascript
js实现支持手机滑动切换的轮播图片效果实例
Apr 29 Javascript
Jquery实现select multiple左右添加和删除功能的简单实例
May 26 Javascript
JS简单实现无缝滚动效果实例
Aug 24 Javascript
jQuery实现的表格展开伸缩效果实例
Sep 07 Javascript
基于Axios 常用的请求方法别名(详解)
Mar 13 Javascript
VSCode中如何利用d.ts文件进行js智能提示
Apr 13 Javascript
vue中父子组件传值,解决钩子函数mounted只运行一次的操作
Jul 27 Javascript
解决antd日期选择组件,添加value就无法点击下一年和下一月问题
Oct 29 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
基于magic_quotes_gpc与magic_quotes_runtime的区别与使用介绍
2013/04/22 PHP
PHP中判断变量为空的几种方法分享
2013/08/26 PHP
PHP 数组黑名单/白名单实例代码详解
2019/06/04 PHP
laravel中的fillable和guarded属性详解
2019/10/23 PHP
Laravel 框架基于自带的用户系统实现登录注册及错误处理功能分析
2020/04/14 PHP
在jQuery1.5中使用deferred对象 着放大镜看Promise
2011/03/12 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
日历查询的算法 如何计算某一天是星期几
2012/12/12 Javascript
javaScript函数中执行C#代码中的函数方法总结
2013/08/07 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
2014/01/02 Javascript
javascript中setTimeout和setInterval的unref()和ref()用法示例
2014/11/26 Javascript
在ASP.NET MVC项目中使用RequireJS库的用法示例
2016/02/15 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
JavaScript 中Date对象的格式化代码方法汇总
2017/09/06 Javascript
老生常谈JavaScript面向对象基础与this指向问题
2017/10/16 Javascript
全面解析vue router 基本使用(动态路由,嵌套路由)
2018/09/02 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
node中的密码安全(加密)
2018/09/17 Javascript
vuex实现像调用模板方法一样调用Mutations方法
2019/11/06 Javascript
解决vue+webpack项目接口跨域出现的问题
2020/08/10 Javascript
NodeJS开发人员常见五个错误理解
2020/10/14 NodeJs
[09:23]国际邀请赛采访专栏:iG战队VK,Tongfu战队Cu
2013/08/05 DOTA
Python使用getpass库读取密码的示例
2017/10/10 Python
Python 实现网页自动截图的示例讲解
2018/05/17 Python
Python多线程应用于自动化测试操作示例
2018/12/06 Python
python自动保存百度盘资源到百度盘中的实例代码
2019/08/26 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
详解Anaconda 的安装教程
2020/09/23 Python
Python爬取酷狗MP3音频的步骤
2021/02/26 Python
人事主管岗位职责范本
2013/12/04 职场文书
大学生如何写自荐信
2014/01/08 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
python+opencv实现视频抽帧示例代码
2021/06/11 Python
如何解决php-fpm启动不了问题
2021/11/17 PHP
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技
javascript进阶篇深拷贝实现的四种方式
2022/07/07 Javascript