채택완료

자바스크립트에서 배열인지 아닌지 확인하는 함수인데...



<p id="demo"></p>


<script>

var fruits = ["Banana", "Orange", "Apple", "Mango"];

document.getElementById("demo").innerHTML = isArray(fruits);


function isArray(myArray) {

    return myArray.constructor.toString().indexOf("Array") > -1;

}

</script>


 

위 식의 정확한 의미를 좀 알려주세요. 특히, 아래 식의 부분부분과 전체 의미를 알고 싶습니다.
return myArray.constructor.toString().indexOf("Array") > -1;

답변 1개 / 댓글 10개

채택된 답변
+20 포인트

입력받은 변수가 배열인 경우 Array Object가 되는데, Array Object의 생성자는 Array()입니다. 그래서 입력받은 변수의 생성자를 문자열로 읽어들여서 Array 이라는 단어가 있는지를 확인하는 함수입니다. 

답변에 대한 댓글 10개

답변 고맙습니다. 근데, 이해가 안 가는 게...


document.getElementById("demo").innerHTML = isArray(fruits); 가 isArray 함수에 변수 fruits를 넣어 돌린 값을 출력시키라는 의미잖아요.

isArray 함수의 내용이 아래 식이구요.
------------------------------------------------------------------
function isArray(myArray) {
return myArray.constructor.toString().indexOf("Array") > -1;
}
------------------------------------------------------------------
myArray는 뭐고,
또, constructor 는 뭐고,
toString()은 뭐고,
indexOf("Array") 는 뭐고,
이것들을 .(마침표)로 합친 식인 myArray.constructor.toString().indexOf("Array")는 뭔가요?

그리고, 왜 myArray.constructor.toString().indexOf("Array")이 -1보다 크다는 식의 결과가 참거짓의 참으로 나오나요?


.(마침표)는 어떤 용도로 사용되는지?
1. myArray는 isArray(myArray)에서 받아온 변수값입니다.
2. constructor(생성자)는 myArray라는 변수(객체)가 생성될때 처음 호출되는 함수입니다. 배열 객체의 경우에는 Array() 함수가 실행됩니다.
3. toString은 생성자 함수(여기선 Array(){ [Native Code] }가 되겠죠)를 문자열로 반환합니다.
4. indexOf("Array")는 변환한 문자열에서 Array이라는 글자의 위치를 찾습니다. 만약 Array 이라는 문자가 있다면 해당 문자열이 시작되는 곳의 Index 번호를 반환하겠죠. 없다면 -1을 반환합니다. myArray가 정상적으로 배열이었다면, myArray.constructor.toString().indexOf("Array")는 최소 1보다는 크겠죠. 그래서 > -1이 더 붙어서 Boolean형태로 변환되어 '참(true)' 값을 반환합니다.
그럼 결과적으로 id가 demo 인 엘리먼트의 내부 Html값으로 true 또는 false 가 기록되게 됩니다.
추가) 객체(Class)에서 .(마침표)는 메서드를 호출하는 용도로 사용됩니다.
너무너무 자세하게 설명해주셔어 정말정말 고맙습니다. ^*^ 덕분에 기초가 튼튼해졌습니다.
[http://blog-imgs-44.fc2.com/w/a/r/wareureu/227.gif]
PS.

위 설명에서,

---------------------------------------------------------------------------------------------------
myArray가 정상적으로 배열이었다면, myArray.constructor.toString().indexOf("Array")는 최소 1보다는 크겠죠.
---------------------------------------------------------------------------------------------------

라고 하셨는데, 0부터 순서를 세니까 최소 0 이상이 맞는거 아닌가요?
Array로 시작하는게 아니라
function Array로 시작합니다.
[code]
123456789
function Array() {
[/code]
로 해서 Array는 10번째에 있죠. (0은 nl이...차지했네요)
그럼, myArray 변수에 할당된 데이터의 생성자를 Array() 가 아닌 function Array() {처럼 function 까지 넣어서 순서를 세야된다는 말씀이신가요?
그렇다해도, 순서는 0부터 세니까 9가 되야 할 것 같은데....
http://jsfiddle.net/9xgsajjf/ 코드 실행해보니, 9가 맞네요. 덕분에 또 좋은 거 알았습니다.
님 아니였으면 왜 9가 나오나 미칠 뻔 했네요. ㅎㅎ
네. 브라우저마다 조금씩 틀립니다. 제 IE11에서는 10이나오네요 ㅎㅎ

답변을 작성하려면 로그인이 필요합니다.