티스토리 뷰
발생일: 2012.05.08
문제:
해결책:
음메.
slice를 splice로 잘못 썼던 게 문제였다... -_-;
splice는 배열에서 특정 인덱스의 아이템을 추가하거나 삭제하는 메서드이고,
아래와 같은 형태로 호출한다.
splice(index, howmany, itemToAdd, itemToAdd, ...)
표준에는 두 번째 파라미터인 howmany 값이 필수라고 정의해뒀지만,
만약 이 값을 생략하는 경우, IE 하위 버전과 모던 브라우저 간의 동작 방식이 다르다.
두 번째 인자를 생략할 경우,
크롬에서는 해당 인덱스부터 끝까지 삭제하지만, IE8 이하 버전에서는 삭제하지 않는 것이 그 차이점이다.
삭제한 엘리먼트를 배열에 담아 리턴하는 동작은 동일하다.
예를 들어,
var a = [1, 2, 3, 4, 5];
var result = a.splice(1);
와 같은 작업을 수행하면.
// IE9, Chrome, FF, Safari
a ==> [1]
result ==> [2, 3, 4, 5]
// IE8 이하
a ==> [1, 2, 3, 4, 5]
result ==> []
와 같은 결과가 나온다.
즉, a.splice의 두 번째 인자를 생략하고 호출하는 액션은,
a.splice(1);
// IE9, Chrome, FF, Safari
a.splice(1, a.length - 1);
// IE8 이하
a.splice(1, 0);
를 호출하는 것과 같다.
단순히 리턴받은 결과를 놓고 본다면,
모던 브라우저에서는 array.splice(1) 과 array.slice(1)의 값은 동일하다.
그래서 쉽게 눈치채지 못했던 것이다.
여튼, 결론은...
철자를 주의깊게 확인하자. -_-;;