2010-05-02 1 views
4

나는 Number, String, Boolean과 같은 자바 스크립트에서 원시 및 객체 래핑 값 유형의 가용성이 문제를 일으키는 방법을 자세히 설명했습니다 (부울로의 타입 캐스팅을 포함하되 이에 국한되지 않음). 예 : object-wrapped NaN, ""그리고 false는 실제로 true로 타입 캐스트됩니다.JavaScript에서 프리미티브 및 객체 랩핑 값을 모두 사용할 수있게하는 이유는 무엇입니까?

이 모든 혼란과 문제로 인해 JavaScript에 내장 클래스에 대한 두 가지 유형의 값을 갖는 데 도움이됩니까?

편집 : 빠른 답변 주셔서 감사합니다. 자바 스크립트 작성자는 스칼라 값에 하위 메서드가있는 방법으로 래퍼 된 원주민을 만들려고했지만 분명히 역화되어 더 많은 문제를 일으킨 것으로 생각합니다.

+0

@Delan : 초기에는 Java에 능숙한 개발자가 쉽게 JavaScript를 채택 할 수 있도록 많은 노력을 기울였습니다. 이것은 쉽게이 목표를 향한 하나의 (실패한) 시도 일 수 있습니다. 이것이 얼마나 나쁜지를 보여주는 한 가지 예로서 'Boolean'객체는 값이 false 인 경우에도 항상 true로 평가됩니다. –

+0

리터럴에 대한 프로토 타입을 제공하기위한 구현 세부 사항으로 간주합니다. – eyelidlessness

답변

0

많은 언어와 마찬가지로 JavaScript는 좋은 부품과 불량 부품이 있습니다.

이것은 중 하나입니다. 정말 나쁜 부분은입니다.

IMHO, 실제로 많은 이점이 없으며 입력 된 래퍼에서만 문제가 없습니다.

우리 친구 더글러스 크록 포드이이 모든 문제를 해결했으며, 실제로 그는 첫날부터 반대했습니다. 그게 당신이 알아야 할 전부입니다.

5

Douglas Crockford에 따르면, 그들은 결코 유용합니다

입력 된 래퍼가 완전히 불필요하고 때때로 혼란 것으로 판명. new Boolean 또는 new Number 또는 new String을 사용하지 마십시오.

출처 : JavaScript: The Good Parts - 부록 B : 잘못된 부품 (쪽 114).

심지어사양의 제 4 판에는 recommended their deprecation입니다.

0

더글러스 크록 포드 (Douglas Crockford)는 거기서 가장 똑똑한 사람 중 하나이지만 하나님이 아닙니다. 그가 말한 모든 것은 맹목적으로 따라 와서는 안됩니다. 실제로 참조로 값을 전달하려는 경우 기본 유형에 대한 래퍼를 선호하는 상황이 있습니다.

프리미티브 값은 항상 및 객체 으로으로 으로 전달됩니다. 따라서 어떤 이유로 든 번호를 참조 번호로 전달해야하는 경우 Number 개체를 사용하여 번호를 지정할 수 있습니다. 참조 (AFAIK)를 잃지 않고 숫자의 값을 실제로 변경할 수는 없지만 임의의 객체와 마찬가지로 추가 매개 변수를 추가 할 수 있습니다. 원시 숫자가 지원하지 않는 것입니다.

var nr1 = new Number(123), 
    nr2 = nr1; // reference to nr1 
nr1.name = "number"; //parameter "name" for nr1 is set AFTER the initialization of nr2 
alert(nr2.name); // nr2 has the same parameter as nr1 
+0

불변의 프리미티브를 참조로 전달하는 데 제한된 범위가 있다고 주장 할 수 있습니다. 왜냐하면 값을 수정할 수 없다고했기 때문입니다. 귀하의 예제에서와 같이 추가 필드를 추가 할 수 있지만 실제로는 ** 원시 타입 **으로 수행해야하는지 궁금합니다. –

+0

이것이 가장 실용적인 사용법은 아니라는 점에 동의하지만 요점은 원시 코드와 래퍼 객체 사이의 실제 차이점을 보여주는 것이 었습니다. 대신 Crockford가 말했던 것 대신에 우리는 반드시 따라야 만합니다. 같은 동작을 수행하는 더 좋은 방법이 있기 때문에 결코 ** 새로운 번호 **를 사용하지는 못합니다.하지만 누군가가 그것을 사용하기를 원한다면 왜 그녀/그녀는해서는 안되는 지 알 수 없습니다. – Andris

+0

@ 앤드리스 : 이유는 "완전히 불필요하고 때로는 혼란"하기 때문입니다. 당신이 말했듯이 "같은 행동을 성취하는 더 좋은 방법이 있기 때문에"그들은 불필요합니다. 그리고이 경우'b'가 true로 평가되기 때문에 때때로 혼란 스럽습니다 :'var b = new Boolean (false); if (b) {경고 (b)}' –

관련 문제