JavaScript 유형의 경우 간단하게 요약 할 수 있습니다. 기본 유형과 참조 유형이 있으며, 차이는 스택 메모리에 고정 된 공간이 존재하며 구현 위치에 대한 포인터는 고정 된 공간이없는 스택 메모리에 저장되며 구현 위치에 대한 포인터는 스택 메모리에 저장됩니다.
시장에 나와있는 많은 책들은 이야기 할 공간이 많습니다. 이 기사에서는 여러 측면에 대해 이야기 할 것입니다.이 기사는 JavaScript, 특히 JavaScript 유형에 대한 간단한 이해가 필요할 수 있습니다. 아직 이해하지 못하면 JavaScript에 관한 책을 들고 다시 읽을 수 있습니다.
1. 기본 유형 및 참조 유형
1. 기본 유형 : 정의되지 않은/null/boolean/number/string
2. 참조 유형 : 객체/배열/기능/날짜/regexp/errgex/map/set…
참조 유형이 열거되지 않은 이유는 무엇입니까? 당신은 그것에 대해 너무 많이 알고 있기 때문에, 적어도 기사에서 나는 이것에 대해 이야기 한 것으로 충분합니다. 다른 것들은 거의 사용되지 않을 수 있으며, MAP 및 세트와 같은 것조차도 모든 브라우저에서 지원되지 않습니다.
2. JavaScript 유형의 판단
JavaScript에는 유형을 결정하는 데 사용할 수있는 두 개의 연산자가 있습니다. 그것들은 타입과 인스턴스이지만 원은 매우 작으며 그렇게 능숙하지 않으며 악명이 높지 않습니다. 몇 가지 상황도 정확하지만 많은 경우에도 신뢰할 수 없습니다. 그냥 보면 알게 될 것입니다.
코드 사본은 다음과 같습니다.
// 신뢰할 수있는 경우 :
'Sofish'타입 // String
새 문자열 ( 'sofish') string // true의 인스턴스
// 신뢰할 수없는 경우 :
typeof [] // 객체
null 타입 // 객체
문자열의 'sofish'인스턴스 // false
어 ~ 많은 초보자 JavaScript 프로그래머가 맹세 할 수 있습니다. 대부분의 사람들은 이미 JS를 사용해야 할 때 jQuery와 같은 라이브러리를 가지고 있습니다. 그들은 모두 캡슐화하여 유형을 쉽게 감지 할 수 있도록했습니다. 물론, "JavaScript에서는 모든 것이 객체이기 때문에"문장은 물론 많은 문서에서 언급 된 바와 같이, 정의되지 않은 것은 실제로 NAN과 Infinity의 글로벌 속성 일뿐입니다. 당신은 아마 알고있을 것입니다. 그러나 "물체"는 우리를 도울 수 있습니다.
코드 사본은 다음과 같습니다.
/* 객체 유형을 감지합니다
* @param : obj {JavaScript Object}
* @param : type {String} js 유형 이름은 대문자로 시작합니다.
* @return : {boolean}
*/
함수는 (obj, type) {
return object.prototype.tostring.call (obj) .slice (8, -1) === 유형;
}
이런 식으로, 우리는 IS 기능을 사용하여 유형 판단을 해결할 수 있으며,이 간단한 기능은 호환성이 우수하며 프로젝트에서 사용할 수 있습니다. 상황은 다음과 같습니다.
코드 사본은 다음과 같습니다.
is ( 'sofish', 'string') // true
is (null, 'null') // true
is (new set (), 'set') // true
3. JavaScript 유형 변환
JavaScript에서 변수 유형 (속성)을 변경할 수 있습니다. 가장 흔한 것은 문자열과 숫자 사이의 변환입니다. 1 + '2'를 12로 돌리는 방법? 수학 연산자이자 JavaScript의 문자열 하이픈 인 + 연산자를 이해해야합니다. 따라서 초보자는 종종 흥미로운 현상을 보게 될 것입니다. + 부호를 사용할 때 때때로 계산이 원하는 것이 아니라 - 표시를 사용하면 항상 "올바른"답변을 얻을 수 있습니다.
코드 사본은 다음과 같습니다.
1 + '2'// '12'
1 + ( + '2') // 3
1- '2'// -1
이것은 실제로 +의 이중 역할에 의해 발생합니다. 위의 코드에서, 두 번째 표현식은 문자열 앞에 A + 부호를 사용하여 클래스를 숫자로 변환해야한다는 것을 알 수 있습니다. JavaScript 유형 변환 이해는 대부분의 경우 +를 이해하기에 충분합니다. 기타 이해할 수있는 클래스, 비슷한 클래스는 할당/과부하로 수정할 수 있으며 오류를 포함 할 수도 있습니다.
코드 사본은 다음과 같습니다.
var err = new error ();
console.log (err instanceof error); // 진실
err = 'sofish';
Console.log (err); // 'Sofish'
4. JavaScript 참조 유형
이것은이 기사에서 어려운 시점입니다. 기본 유형과 비교하여 참조는 속성과 방법을 추가 할 수 있습니다. 참조는 참조 유사한 값으로, 기준 유형의 값을 변수에 할당하며 힙 메모리에 저장된 동일한 값을 가리 킵니다. 변수 (속성)가 과부하 될 수 있지만 복사는 매우 흥미로운 일이 될 것입니다. 나중에 자세히 이야기 할 것입니다.
1. 속성과 방법을 추가하십시오
다음 코드에서 기본 유사한 할당에 오류를보고하지 않겠다고 가정하는 것은 다음과 같이 표시되지만 가져올 때 유효하지 않습니다.
코드 사본은 다음과 같습니다.
var arr = [1,2,3];
arr.hello = '세계';
Console.log (arr.hello); // '세계'
var str = 'sofish';
str.hello = '세계';
Console.log (str.hello); // 한정되지 않은
2. 유형 값을 참조하는 작동
참조 유형은 스택 메모리에 저장되므로 참조이므로 동일한 원래 값을 가리킬 때 값에 대한 작업은 모든 참조에 영향을 미칩니다. 여기서 예를 들어, 재 할당 (값에 대한 직접 조작이 아님)은 객체를 재현하고 원래 값을 변경하지 않는다는 것입니다. 예를 들어:
코드 사본은 다음과 같습니다.
var arr = [1,2,3], sofish = arr;
sofish.push ( 'Hello World');
Console.log (ARR); // [1, 2, 3, 'Hello World']
// 비 선명 유형
소파 = [ '물고기가 아님]; // 부드럽게 비슷하게 변경되면 원래 값이 변경되지 않습니다.
Console.log (ARR); // [1, 2, 3, 'Hello World']]
3. 참조 유형 값의 복사
원래 값에 대한 작업은 모든 참조에 영향을 미치며 반드시 원하는 것은 아닙니다. 때로는 작동 할 때 다른 참조에 영향을 미치지 않고 새로운 객체를 복사해야합니다. 일반적으로 날짜 / 기능 / regexp ...과 같은 특정 작업은 거의 없습니다. 주로 배열 및 객체에는 추가 항목, 속성 등이 있기 때문에 이해해야 할 것은 배열 및 객체 객체를 복사하는 방법입니다.
3.1 배열 복사
배열 객체에서는 차단 된 배열을 반환하기 위해 슬라이스 방법이 존재하고 ES5 필터 등에 새 배열을 반환 하므로이 메소드를 사용하여 복사 할 수 있습니다.
코드 사본은 다음과 같습니다.
var arr = [1, 2, 3];
var sofish = arr.slice ();
// 새 배열에서의 작동은 원래 배열에 영향을 미치지 않습니다.
sofish.push ( 'Hello World');
Console.log (ARR); // [1, 2, 3]
3.2 객체 복사
배열 복사에서는 슬라이스 방법을 사용합니다. 실제로, 배열과 객체의 경우, 우리는 for ... in loop을 사용하여 복사 할 값을 지정할 수 있습니다.
코드 사본은 다음과 같습니다.
var obj = {이름 : 'sofish'}, sofish = {}, p;
for (p in obj) sofish [p] = obj [p];
// 새 개체에서의 작동은 원래 값에 영향을 미치지 않습니다.
sofish.say = function () {};
Console.log (OBJ); // {이름 : 'sofish'}
3.3 그림자/깊은 사본
위의 작업과 마찬가지로, 우리는 종종 그림자 사본을 부르는 것입니다. 그러나 배열과 객체는 여러 층 (차원)을 가질 수 있습니다. 이와 같은 복사는 최상층의 값을 고려합니다. 가능한 값의 배열 및 객체는 여전히 원래 객체를 가리 킵니다. 예를 들어:
코드 사본은 다음과 같습니다.
var arr = [1, {바이오 : '물고기가 아님}], sofish = [], p;
for (p in arr) {
부드럽게 [p] = arr [p];
}
//`sofish '에 포함 된 객체`cat'에서의 작업은 원래 값에 영향을 미칩니다.
SOFISH [1] .BIO = '해킹 가능';
console.log (arr); // [1, cat : {bio : 'hackable'}]
그래서 어떻게해야합니까? 이 문제를 해결하기 위해 Copy () 함수를 사용해 봅시다.
코드 사본은 다음과 같습니다.
/* 객체를 복사하십시오
* @param : obj {JavaScript Object} 원본 개체
* @param : isdeep {boolean}은 깊은 사본입니다
* @return : {JavaScript Object} 새 개체를 반환합니다
*/
함수 사본 (obj, isdeep) {
var ret = obj.slice? [] : {}, p, prop;
// IS 기능과 함께 사용하십시오
if (! isdeep && is (obj, 'array')) return obj.slice ();
for (p in obj) {
if (! obj.hasownproperty (p)) 계속;
prop = obj [p];
ret [p] = (is (prop, 'object') || is (prop, 'array'))?
복사 (prop, isdeep) : prop;
}
반품 반환;
}
이런 식으로, 우리는 사본 (obj, isdeep) 함수를 통해 배열 또는 객체를 복사 할 수 있습니다. 당신은 그것을 테스트 할 수 있습니다 :
코드 사본은 다음과 같습니다.
var arr = [1, {바이오 : '물고기가 아님}];
var sofish = copy (arr);
// 얕은 사본은 첫 번째 레이어 작동의 원래 값에 영향을 미치지 않지만 두 번째 레이어에 영향을 미칩니다.
sofish.push ( 'cat');
Console.log (ARR); // [1, {바이오 : '물고기가 아닙니다'}]
SOFISH [1] .BIO = 'Hello World';
console.log (arr) // [1, {bio : 'hello world'}]
// 딥 카피는 원래 값에 영향을 미치지 않습니다
소파 = 복사 (arr, 1);
SOFISH [1] .bio = 'foo 또는 bar';
Console.log (ARR); // [1, {bio : 'Hello World'}]
그게 다야. 기본적으로 유형에 대한 더 어려운 점을 이해해야합니다. 물론 복제는 가장 번거로운 지점입니다. 작업이 필요한 배열 및 객체 외에도 날짜/기능/regexp의 복제도 있습니다.