1. 값으로 전달 (값으로)
변수의 값은 복사되며 원래 값과 아무 관련이 없습니다. 즉, 새 값이 수정되더라도 원래 값은 변경되지 않습니다. JavaScript에서는 기본 유형이 값으로 전달됩니다.
다음과 같이 코드 코드를 복사합니다.
함수 테스트패스값()
{
varm=1;
var n=2;
//m과 n의 값을 복사하여 passValue에 전달합니다.
passValue(m,n);
Alert(m); //원래 값이 됩니다.
}
함수 passValue(a,b)
{
a = a+b; //a의 값을 변경합니다. 여기서 a는 원래 값의 복사본입니다.
경고(a);
}
출력 결과:
3
1
2. 참고로.
참조 자체의 복사본이 함수에 전달됩니다. 참조가 가리키는 객체는 복사되어 전달되지 않습니다(Java에서도 마찬가지입니다). 객체의 속성 값이 변경되면 원본 때문입니다. 참조는 동일한 객체를 가리킵니다. 따라서 수정된 값은 원래 참조를 통해 액세스됩니다.
그러나 함수에서 새 개체에 대한 참조를 가리키기만 하면 원래 개체의 값은 변경되지 않고 복사된 참조만 변경됩니다.
다음과 같이 코드 코드를 복사합니다.
함수 테스트패스값()
{
var 날짜 = 새 날짜(2006,02,27);
Alert(date.getDate()); //출력은 27입니다.
//날짜 참조 자체를 복사하여 passReference에 전달합니다. 날짜가 가리키는 객체는 복사되지 않았습니다.
passReference(날짜);
Alert(date.getDate()); //출력은 12입니다.
//위와 동일
changeReference(날짜);
Alert(date.getDate()); //출력은 여전히 12입니다.
}
함수 passReference(da)
{
//da와 원본 참조가 동일한 객체를 가리키므로 함수 외부에서는 원본 참조를 통해 접근하는 것이 객체의 날짜 속성 값이 되며, 이것이 수정된 값이 됩니다.
da.setDate(12);
}
함수 변경Reference(da)
{
//이때 da 참조는 실제로 원본 참조의 복사본입니다. 참조 자체를 재할당해도 원본 참조에는 영향을 미치지 않습니다.
da= new Date(2007,05,11);
//da 참조가 새 객체를 가리키도록 합니다. 이때 원래 참조는 여전히 원래 객체를 가리킵니다.
Alert(da.getDate()); // 출력은 11입니다.
}
특수 문자열 3개
JavaScript에서는 String도 참조로 전달됩니다. js에는 charAt 메서드만 있고 해당 수정 메서드는 없습니다. Java의 String과 동일하며 불변성을 갖습니다.
다음과 같이 코드 코드를 복사합니다.
var s1 = "안녕하세요";
var s2 = "지옥" + "o";
만약 (s1 == s2)
Alert("s1 = s2"); //이 문장이 실행됩니까? Java에 익숙한 사람들은 이 문장이 실행되지 않을 것이라고 생각할 수 있습니다(저는 이 문장에 대해 매우 비판적입니다. 이 문장은 Java에서도 실행됩니다!). Java에서 ==는 동일성을 비교합니다. 실제로 js의 String==는 값이 동일한지 비교하므로 이 문장이 실행됩니다. 그러나 다른 Object == 비교는 Java에서와 동일합니다.