각 방법입니다
代码如下: 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를 사용하지 않는 이유는 문자열 비교가 이론적으로 모든 문자를 순회해야 하고 성능은 문자열 길이에 정비례하기 때문입니다.