2017-12-20 11 views
2

typeof에 대한 또 다른 질문이 있습니다. 이 예제는 다루지 않습니다.JavaScript에서 '숫자'유형을 찾으려고 할 때 잘못된 결과가 나타나는 이유는 무엇입니까?

왜 arrNew를 사용하여 첫 번째 필터()에서 0을 입력해도 작동하지 않습니까?

두 번째 필터()에서 arrNew02와 함께 작동합니다.

if 문 안에 return 전에 console.log 문을 넣으면 "number"유형이 0으로 인식됩니다.

function filterArray(arr){ 

var arrNew = arr.filter(function(item){ 
    if(typeof item === "number"){ 
     console.log("typeof item: " + item + " " + typeof item); 
     return item; 
    } 
    }); 


console.log("arrNew: " + arrNew); 

var arrNew02 = arr.filter(function(item){ 
    return(typeof item === "number"); 
}); 

console.log("arrNew02: " + arrNew02); 

} 

filterArray([1, "a", "b", 0, 15]); 
// This should return [1, 0, 15] 

나는 isNaN을 사용해 보았습니다. 그러나이 예제에서는 문자열 인 숫자를 놓쳤습니다. "1"을 반환합니다.

var arrNew03 = arr.filter(function(item){ 
    if(isNaN(item) === false){ 
     return item; 
    } 
}); 

console.log("arrNew03: " + arrNew03); 


filterArray([1, 2, "aasf", "1", "123", 123]); 
// This should return [1, 2, 123] 

그래서 항목 유형을 찾는 가장 좋은 방법은 무엇입니까? 숫자, 문자열 등 다른 방법이 있습니까? MDN 문서를 읽었습니다. 결국에는 typeof가 더 이상 안전하지 않은 이유에 대한 링크가 있습니다. 그러나 나는 여기서 링크 된 토론이 적절하지 않다고 생각합니다. http://es-discourse.com/t/why-typeof-is-no-longer-safe/15

+1

'filter()'콜백이 반환해야하는 것을 오해하고 있습니다. – SLaks

+0

예 - 아래 답변을 읽고 MDN 페이지에서 아래 답변에 제공된 링크를 읽으면 어떤 일이 벌어지는 지보고 있습니다. –

+0

MDN에서 : 함수는 배열의 각 요소를 테스트하는 술어입니다. 요소를 보관하려면 true를 돌려주고, 그렇지 않은 경우는 false를 돌려 주어, 3 개의 인수를 취합니다. 나는 그 물건을 돌려주고있다. –

답변

0

Array#filter은 새 배열의 요소를 포함하기 위해 truthy 값이 필요합니다.

값이 0 인 항목의 반품에는이 항목이 포함되지 않습니다.

설명

filter() 어레이의 각 요소에 대하여 한번 제공 콜백 함수를 호출하고, 모든 값들의 새로운 배열을 구성하는 복귀 callbacka value that coerces to true 대. callback은 값이 할당 된 배열의 인덱스에만 호출됩니다. 삭제되었거나 값이 할당 된 적이없는 인덱스에 대해서는 호출되지 않습니다. callback 테스트를 통과하지 못한 배열 요소는 건너 뛰고 새 배열에 포함되지 않습니다.

+1

OK - 여기 MDN 문서와 모든 내용을 읽었습니다. true를 반환하면 filter() 메서드는 새 배열에 항목을 포함합니다. 내 코드에서 작동하지 않는 code/filter() 메서드는 true가 아닌 항목을 반환합니다. 그러나 0을 반환하면 filter() 메서드는이를 Falsey 항목으로 평가하고 false를 반환합니다. 따라서 항목은 새 배열에 포함되지 않습니다. 정말 고맙습니다! –

0

숫자 0은 부울 false에 캐스팅되는 유일한 번호입니다. 다른 모든 숫자는 true으로 변환됩니다. 필터 결과로 item을 반환하고 itemfalse (이는 item === 0 인 경우)으로 바뀌면 항목이 필터링됩니다.

첫 번째 arr.filter 전화에서 item 대신 true을 반환해야합니다.

+0

OK - MDN 문서와 모든 내용을 여기서 읽었습니다. true를 반환하면 filter() 메서드는 새 배열에 항목을 포함합니다. 내 코드에서 작동하지 않는 code/filter() 메서드는 true가 아닌 항목을 반환합니다. 그러나 0을 반환하면 filter() 메서드는이를 Falsey 항목으로 평가하고 false를 반환합니다. 따라서 항목은 새 배열에 포함되지 않습니다. 정말 고맙습니다! –

+0

미안 해요, 게르 솜. 녹색 체크 표시가있는 답 만 틱 수 있습니다. 나는 그녀에게 나에게 링크를 주었기 때문에 니나에게주고있다. 당신이 그걸로 괜찮아지기를 바랍니다. –

+0

내가 용서해 : ') –