변수타입

4068 단어

1. 인용 유형은 어떤 것들이 있습니까?참조되지 않는 유형


기본 형식 값(수치, 볼 값, 문자열,null,undefined): 창고 메모리에 저장된 간단한 데이터 세그먼트를 가리킨다.
인용 형식 값(대상, 수조, 함수, 정규): 메모리에 저장된 대상을 가리킨다. 변수에 저장된 것은 사실상 하나의 바늘일 뿐이다. 이 바늘은 메모리에 저장된 다른 위치를 실행하고 이 위치에서 대상을 저장한다.

2. 다음 코드는 무엇을 출력합니까?무엇 때문에

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);     //false
console.log(obj1 = obj2);      //{a:1, b:2};
console.log(obj1 == obj2);     //true
  • 처음에 두 대상을 성명했기 때문에 각각obj1,obj2이다. 이 두 대상은 모두 독립된 서로 다른 주소를 가지고 있다.그래서 첫 번째 콘솔.log(obj1 == obj2); 출력false, 그들의 저장 주소가 다르기 때문에 서로 다른 '변수'에 속하고, 단지 똑같이 생겼을 뿐입니다.
  • 그리고 콘솔.log(obj1 = obj2); obj2가 저장한 주소를 obj1에 값을 부여합니다. 이때 obj1,obj2는 같은 저장 주소를 가지고 있습니다.
  • 마지막으로 console을 실행합니다.log(obj1=obj2)일 때obj1,obj2는 같은 주소를 가리키기 때문에 둘은 같다.true 를 내보냅니다.

  • 3. 다음 코드는 무엇을 출력합니까?무엇 때문에

    var a = 1
    var b = 2
    var c = { name: ' ', age: 2 }           // 
    var d = [a, b, c]                            // 
    
    var aa = a
    var bb = b
    var cc = c
    var dd = d
    
    a = 11
    b = 22
    c.name = 'hello'
    d[2]['age'] = 3
    
    console.log(aa)             //1
    console.log(bb)             //2
    console.log(cc)             // { name: 'hello', age: 3 }  
    console.log(dd)             //[1,2,{ name: 'hello', age: 3 }]
    

    이 예는 얕은 복사이다
  • 먼저 a, b, c, d, aa, bb, cc,dd
  • 를 정의했다.
  • 는 각각 a, b, c, d에 값을 부여하고 a, b는 기본 유형, c, d는 인용 유형이기 때문에 c, d는 실제 주소로 저장된다.
  • 그리고 각각 a, b, c, d의 값을 aa, bb, cc,dd에 부여한다. 이때 aa, bb는 각각 1,2이다.cc,dd는 c,d의 저장 주소입니다.
  • a, b, c, d에 다시 값을 부여하고 그 중에서 a, b의 값은 덮어쓰며 c, d는 주소의 내용을 수정하고 c, d가 저장한 주소는 수정하지 않았다
  • 실행 디버깅 aa,bb는 각각 1,2;네 번째 단계는 a, b의 값만 수정했기 때문에 aa, bb는 영향을 주지 않는다.cc,dd의 지향은 각각 c,d의 주소이기 때문에 cc,dd의 값은 c,d와 같다.

  • 4. 다음 코드는 무엇을 출력합니까?무엇 때문에

    var a = 1
    var c = { name: 'YQY', age: 2 }
    
    function f1(n){
      ++n
    }
    
    function f2(obj){
      ++obj.age
    }
    
    f1(a)           
    f2(c)         
    f1(c.age)         
    console.log(a)     //1
    console.log(c)    //{ name: 'YQY', age: 3 }
    

    이 예는 얕은 복사이다
  • 먼저 a, c, 함수 fn1, fn2를 성명한다.a는 기본 유형, c는 대상: 인용 유형이기 때문에 실제 저장은 일련의 주소입니다.
  • f1(a)을 실행하고 n을 설명하며 a의 값을 n, n=a=1;++로 부여합니다n, 이때 n=2;
  • f2(a)를 실행하고obj를 설명하며 c의 주소를obj,obj에 부여합니다.age=c.age=2,++obj.age=3, 이때obj와 c는 모두 같은 주소를 가리키는데 주소 내용은 {name:'jirengu', age: 3}
  • 실행 f1(c.age), 성명 n, n=c.age=3,++n, 이때 n=4
  • 디버그 console.log(a), 이때 a는 1이다.그러므로 출력 1
  • 디버그 console.log(c), 이 때 c가 저장한 주소는 변하지 않지만 주소 안의 내용은 f2 함수에 의해 수정되었기 때문에 출력 {name:'jirengu', age: 3}
  • 5. 다음 수조를 필터하여 정수만 남기고 원수조에서 직접 조작

    var arr = [3,1,0,-1,-3,2,-5];
    function filter(arr){
        for(var i=0 ;i

    6. 다음 수조를 필터하여 정수만 보존하고 원수조는 변하지 않으며 새 수조를 생성합니다

    var arr = [3,1,0,-1,-3,2,-5]
    function filter(arr){
        var arr2 = [] ;
        for(var i = 0 ; i < arr.length; i++){
            arr2[i]=arr[i];
        }
        for(var i=0 ;i

    7. 깊이 복사 함수를 써서 두 가지 방식으로 실현


    방법 1

    function deepCopy(obj){
      var obj2 = {};
      if(obj.hasOwnProperty){
        for(var key in obj){
          if(typeof obj[key] ==  "string"|| typeof obj[key] ==  "number" ||  
    obj[key] ==   undefined || obj[key] ==  null || typeof obj[key] ==  "boolean"){
            obj2[key] = obj[key];
          }else{
            obj2[key] = deepCopy(obj[key]);
          }
        }
      }
      return obj2;
    }
    var obj = {
      name:"YQY",
      age:2
    }
    var obj2 = deepCopy(obj);
    console.log(obj2);
    obj.age = 33;
    console.log(obj2.age);
    

    방법 2

    function deepCopy2(obj){
      return JSON.parse(JSON.stringify(obj));
    }
    var obj3 = {
      name:"YQY",
      age:20
    }
    var obj4 = deepCopy2(obj3);
    console.log(obj4);
    obj3.age = 33;
    console.log(obj4.age);
    

    답안을 참고하다

    좋은 웹페이지 즐겨찾기