Heim  >  Artikel  >  Web-Frontend  >  JS判断元素为数字的奇异写法分享_javascript技巧

JS判断元素为数字的奇异写法分享_javascript技巧

WBOY
WBOYOriginal
2016-05-16 17:51:271163Durchsuche

这是在阅读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 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; iconsole.log(isNumber3(arr[i]))
}

结果只有数组最后的一项为true。即只有数字类型 a === +a 才为真。
为什么不用typeof,因为字符串比较理论上是需要遍历所有字符的,性能和字符串长度成正比。
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn