Javascript 는 참조 or 복제 및 매개변수 전달
7116 단어 JavaScript
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는 여전히 변한다.)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.