ホームページ  >  記事  >  ウェブフロントエンド  >  要素が数値かどうかを判断するための奇妙な JS の書き方を共有する

要素が数値かどうかを判断するための奇妙な JS の書き方を共有する

黄舟
黄舟オリジナル
2016-12-12 11:37:221139ブラウズ

それぞれのメソッドです

代码如下:
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 === &#39;number&#39;)

と同等です。 typeof と Object.prototype.toString は一般的な書き方です。最後のは一般的ではないため、一般の人には理解するのが困難です。

一部のライブラリには

代码如下:
function isNumber1(a){ 
return typeof a === &#39;number&#39; 
}

などの型判定のツール関数が用意されていたり、Object.prototype.toString

代码如下:
function isNumber2(a) { 
return Object.prototype.toString.call(a) === &#39;[object Number]&#39; 
}

を使ってこの書き方に変更することもできます

代码如下:
function isNumber3(a){ 
return a === +a 
}

様々な型を使ってテストしてみましょう

代码如下:
var arr = [&#39;1&#39;, true, false, undefined, null, {}, [], 1] 
for (var i=0; i<arr.length; i++) { 
console.log(isNumber3(arr[i])) 
}

結果配列項目の最後の項目のみが true です。つまり、数値型 a === +a のみが true となります。
なぜ typeof を使用しないのでしょうか? 理論的には、文字列比較はすべての文字を走査する必要があり、パフォーマンスは文字列の長さに直接比例するからです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。