Javascript 는 참조 or 복제 및 매개변수 전달

7116 단어 JavaScript
먼저 2014년 알리바바 전단계 필기시험 문제를 살펴보자.
var a = 1;

var obj = {

    b: 2

};

var fn = function () {};

fn.c = 3;



function test(x, y, z) {

    x = 4;

    y.b = 5;

    z.c = 6;

    return z;

}

test(a, obj, fn);

alert(a + obj.b + fn.c);

정답은 12입니다. 정답을 맞히면 볼 필요가 없습니다.If not, 나랑 같이 공부하자 ~
(1) 기본 유형
js를 배운 지 얼마 되지 않았기 때문에 부치가 인용인지 복제인지 잘 모르겠다. (인용이라면 그 값의 변화는 다른 값에 영향을 줄 수 있고, 복제라면 각자 놀고 서로 영향을 주지 않는다.) 이런 문제에 부딪히면 종종 헷갈린다.반나절의 시간을 들여 몇 가지 자료를 참고하였는데, 정리는 아래와 같다.
우선, Javascript의 기본 유형은 Boolean, String, Number, 그리고 Undefined와 Null이 있습니다. 아, 가장 지루한anybook의 문법 제1장 내용을 왜 끄집어내는지 알면 어떻고 정말 유용합니다.먼저 알아야 할 것은 글자 양의 Boolean, String, Number, 그리고 undefined+null(exact undefined null, 대소문자 구분)만이 기본 유형에 속하고 new가 나온 것은 포함되지 않는다는 것이다.
즉,
alert(typeof false);//"boolean"

var b = new Boolean(false);

alert(typeof b);//"object"

마찬가지로 new String('aaa')은 모두 기본 유형이 아니다. 직접적인 a='aaa', a는 기본 유형이다. 이것이 바로 글자의 양이 기본 유형이다.
한편, Object, Function, Array는 사실 모두 구조 함수입니다. 직접 new Object() 등을 할 수 있기 때문에 모두 함수입니다. so(Object instanceof Function ===true) & & (Function instanceof Object===true).
주의해야 할 것은 기본 유형에는 속성과 방법이 없지만 기본 포장 유형에 대응하는 방법을 사용할 수 있다는 것이다. 아래의 예를 보면 다음과 같다.
var a = 'ot';

a.age = 18;//hahahahaha,yeah,forever 18

alert(a.age);//undefined

a.length = 160;

alert(a.length);//2

두 번째 a.age=18은 사실 실현할 때 세 단계로 나뉜다.
var s1 = new String('ot');

s1.age = 18;

s1 = null;

즉, 기본 형식은 호출 형식이나 방법마다 새 대상을 만들고 삭제합니다.
마찬가지로 alert(a.age)에서도 다음 단계로 나뉩니다.
var s2 = new String('ot');

alert(s2.age);

s2=null;

s2에 대한age 방법이 정의되어 있지 않기 때문에undefined로 출력됩니다.alert(a.length) 때 s3=new String('ot') 때문에 String에 length 방법이 있기 때문에 결과를 출력합니다. 물론 지난번 값 부여 작업의 대상도 삭제되었을 것입니다.
(2) 참조 or Copy
Clear about 기본 형식 후에 알아야 할 것은 기본 형식 변수가 창고 내부에 존재하고 값을 부여할 때마다 새로운copy를 만들고play with itself를 만듭니다.기본 형식을 제외한 인용 형식은 메모리에 존재하고 인용만 가능합니다.다음 예제를 참조하십시오.
var ot = new Object();// , ot, ot 

var op = ot;// ot op, op 

op.age = 18;

alert(ot.age);//18



op = new String('sunshine');// op,ot 

alert(ot.length);//undefined

주석 부분을 보니 이미 이해할 수 있을 거라고 믿습니다.
(3) 매개 변수 전달
Javascript의 매개 변수는 값 전달로 전달됩니다. 다음 예를 살펴보겠습니다.
function setAge(i)

{

    alert(i);//24

    i = 18;

    alert(i);//18

};



var ot = 24;

setAge(ot);



alert(ot);//24

ot의 값 24를 전달하고 i에게 값을 부여한다. 그래서 첫 번째alert는 24이고 그 다음에 i가 다시 값을 부여한다. 그래서alert가 나온 것은 18이지만 외부의ot는 영향을 받지 않는다. 왜냐하면 전달 값, 즉 내용을 i에게 복제했기 때문이다.
그러면 전달된 값이 인용 형식일 때 어떻게 될까요?예:
function setName(obj)

{

    obj.name = 'ot';

};



var obj2 = new Object();

setName(obj2);

alert(obj2.name);//ot

이것은 인용을 전달하는 것처럼 보인다. 왜냐하면obj.name가 바뀌었지만 사실은 아니에요. 사실은 값이에요. obj2 자체의 값이 새 대상의 주소이기 때문에 이 주소가 전송됩니다.
(4) 면접문제로 돌아가기
우리는 지금 앞의 면접 문제를 다시 보러 간다.
var a = 1;

var obj = {

    b: 2

};

var fn = function () {};

fn.c = 3;



function test(x, y, z) {

    x = 4;

    y.b = 5;

    z.c = 6;

    return z;

}

test(a, obj, fn);

alert(a + obj.b + fn.c);

우선test가 전달한 실삼 중 a는 기본 유형(아 맞다. 값을 복사했어, 꼬끼오)이고obj는object(주소를 가리키며 움직여라, 네가 움직여도 나도 움직여), fn도 기본 유형이 아니지.테스트를 실행할 때 x는 4(a와 상관없이 각자 놀고 있잖아, a는 여전히 1), y의 b는 5로 부여되고, 그obj의 b도 5로 변하고, z의 c는 6으로 변한다. 그러면 fn의 c도 당연히 6이다.그래서 알러트의 결과는 1+5+6=12일 거예요.(사실test는 z를 되돌려 주지 않아도 마찬가지다.z는 여전히 변한다.)

좋은 웹페이지 즐겨찾기