밑줄(1.3.3)의 소스코드를 읽어보면서 본 내용입니다.
var Each = _.each = _.forEach = function(obj, iterator, context) {
if (obj == null)
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)
}
} else {
for (var key in obj) {
if (_.has(obj, key)) {
if (iterator.call(context, obj[key], key, obj) == = 차단기) 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 ) === '[객체 번호]'
}
이렇게 변경됨
function isNumber3(a){
return a === a
}
다양한 유형으로 테스트
var arr = ['1', true, false, 정의되지 않음, null, {}, [], 1]
for (var i=0; i
console.log(isNumber3(arr [i]))
}
결과적으로 배열의 마지막 항목만 true입니다. 즉, 숫자 유형 a === a만 참입니다.
typeof를 사용하지 않는 이유는 문자열 비교가 이론적으로 모든 문자를 순회해야 하고 성능은 문자열 길이에 정비례하기 때문입니다.