Javascript는 변수를 선언할 때 해당 유형을 선언할 필요가 없습니다. Var x는 모든 유형의 값과 동일할 수 있습니다.
예:
var str = "string....";
var arr = ["this","is","array"]
var obj = { name :"caizhongqi",age:26,sex:"male"};
모두 정확합니다. 매우 간단하고 편리해 보이지만 이 편리함은 이해하기 어려운 놀라움을 선사합니다. 예(예 1) ):
경고가 "this is string"으로 나오는 것을 단번에 알 수 있습니다. 하지만 Java 언어를 사용하는 프로그래머의 경우 var y=x를 할당해야 합니다. y 변수에 대한 메모리의 x 주소(포인터)이므로 "ni hao" 경고가 Java 언어 습관과 더 일치해야 한다고 생각하지만 JavaScript 언어에서는 문자 문자열 할당이 직접적인 경우가 아닙니다. 작업, 데이터를 y의 저장 공간에 직접 복사합니다.
다음 예(예 2)를 보세요.
알림이 "안녕하세요"라고 나왔다고 생각했다면 오산입니다. var y = x일 때 x는 이미 y에 배열을 제공하지 않았나요? 그러나 실제로는 그렇지 않습니다. var y = x이면 x는 메모리에 주소(포인터)를 전달합니다! x[0]="world"는 원래 저장 위치의 데이터를 수정하므로, Alert(y[0])는 새로운 x 값을 사용하여 경고합니다. 혼란스러운? 왜 직접 측정하고 한번에 직접 견적을 내는 걸까요?
걱정하지 마세요. 다음 예는 더 혼란스럽습니다(예 3).
알림이 "hello"로 나오는 것을 눈으로 알 수 있습니다! 이것은 예측할 수 없고 이상한 JavaScript입니다!
Stephen Chow의 "Domestic Zero Paint"에도 비슷한 장면이 있습니다.
Xing 씨가 임무차 심천에서 홍콩에 막 도착했을 때 Anita Yuen이 짐에서 헤어드라이어를 발견했다고 말했습니다. 사실은 수염 면도기였는데, 가죽신을 꺼내보니 헤어드라이어였고, 휴대폰처럼 보였던 것도 사실은 수염 면도기였습니다. 면도기와 헤어드라이어가 Anita Yuen과 관객을 혼란스럽게 했습니다. 하하하하. 제가 가장 좋아하는 영화 중 하나입니다. 처음 봤을 때 배가 아팠어요.
방금 변수 할당을 되돌아보면 직접 수량과 참조 수량을 사용하는 것은 면도기와 헤어드라이어를 바꾸는 것과 같아서 우리 모두를 어지럽게 했습니다.
사실 문제는 x = ["ni", "hao"]의 두 번째 할당에 있습니다. 메모리의 변화와 JavaScript의 문자열 유형 처리와 객체 유형 처리의 차이점을 살펴보겠습니다. 🎜 >
다음 두 가지 상황이 관찰됩니다.
var x = "this is string...";
var y = ["this","is","string"];
x와 y의 차이점은 유형에 있습니다. JavaScript 파서는 문자열 값(실제로 복사)을 x(직접 수량)에 할당하지만 배열 포인터를 y(참조 수량)에 할당합니다. 완전 자동! 다음 그림과 결합하면 더 잘 이해할 수 있습니다.
그림에서 p1, p2...는 변수에 대한 포인터이고 위 var y의 y는 개체 유형을 저장합니다. 변수 p1(가정) 및 x는 문자열 자체를 저장합니다. 예제 3을 다시 분석해 보세요. var ni","hao"]를 실행하면 파서는 이 새 배열을 보관할 새 저장 공간을 열고 x는 이 새 저장 공간의 포인터입니다. 이는 재정의(또는 재할당)를 의미합니다. JavaScript의 변수는 원래 공간을 파괴하지 않고 새 저장 공간을 생성합니다. 예제 2를 다시 보면 x[0] = "world"입니다. 이 문장은 x에 대한 새 값을 정의하지 않고 새 저장 공간을 생성하지 않습니다. 그러나 공간의 데이터만 변경하므로 예제 2의 최종 경고는 "world"입니다. 예제 1은 문자열 할당이고 전체 프로세스는 직접적인 작업입니다.
위 분석에서 볼 수 있듯이 JavaScript 변수는 직접적인 수량이나 포인터를 저장할 수 있으며 이는 인위적으로 간섭할 수 없습니다. 따라서 일상적인 코딩에서는 세부 사항과 같은 이러한 문제에 주의해야 합니다. 루프 내 큰 문자열 연결 및 할당은 프로그램의 실행 효율성에 직접적인 영향을 미칠 수 있습니다.
두 가지 예를 살펴보세요.
var _tmpStr="";
var str = "이것은 큰 문자열입니다..." for (i=0; i _tmpStr = a;
}
a = _tmpStr;
직접 수량을 사용하기 때문에 각 루프는 매우 큰 문자열을 작동해야 합니다. 그리고 비효율적이다. 대신 참조 연산을 사용하는 경우, 즉 배열을 통해:
var str = "this is big string..."
var _tmpArray = [] for (i=0; i _tmpArray[i]=str;
}
str = _tmpArray.join("");
<script> var x = "this is string"; <BR> var y = x; <BR> x="ni hao"; <BR> alert(y) <BR></script>100k 문자열이 있으면 테스트를 수행합니다. , 내 컴퓨터에서 직접 연결 작업은 약 2600밀리초가 걸립니다. 어레이 연결을 사용하면 효율성이 10배 이상 다릅니다.
이렇게 긴 글을 쓰지 않은지 꽤 오랜 시간이 걸렸습니다.