진급 4 작업

3722 단어
1. 인용 유형은 어떤 것들이 있습니까?참조되지 않는 유형
인용 형식 (대상, 그룹, 함수, 정규): 메모리에 저장된 대상을 가리킨다. 변수에 저장된 것은 사실상 하나의 바늘일 뿐, 이 바늘은 메모리에 저장된 다른 위치를 실행하고, 이 위치에서 대상을 저장한다.기본 형식 값 (수치, 볼 값,null,undefined): 창고 메모리에 저장된 간단한 데이터 세그먼트를 가리킨다.
2. 다음 코드는 무엇을 출력합니까?무엇 때문에
var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);  
console.log(obj1 = obj2);  
console.log(obj1 == obj2);  

출력은:false {a:1,b:2}true false입니다. 같은 유형이지만 내용도 같지만 대상, 즉 인용 유형은 내용에 두 개의 저장 공간을 개척하여 전혀 영향을 주지 않습니다.{a:1,b:2}obj2를 obj1에 값을 부여했기 때문에 이때 출력하는 것은obj2의 내용입니다.위에 obj2를 obj1에 부여했기 때문에 이때는 이전의 obj1이 obj2에 덮어씌워진 것과 같다. 이때 obj2의 내용을 수정하면 obj1에 대응하는 내용을 바꿀 수 있고 이때는 저장 공간에 있다.
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는 모두 기본 유형 값이고 d는 수조, c는 대상이지만 이들의 공통된 본질은 모두 인용 유형이다.console.log(aa)는 1이고 var aa = a;메모리에 aa의 위치가 있는데 이때 aa의 값은 a의 값으로 바뀐다. 비록 이후에 a와 b의 값을 수정했지만 aa와 bb에 영향을 주지 않는다.var cc = c; cc는 c의 내용 주소를 저장했는데 var d=[a, b, c]는 d=[a, b, c의 내용 주소]에 해당한다.그래서 c의 내용을 수정하면 cc와 d의 내용을 수정한다.var dd = d; d의 내용을 수정하면 dd의 내용을 수정하고 d[2]['age']=3;이 문장의 본질은 c.age=3이다.
4. 다음 코드는 무엇을 출력합니까?무엇 때문에
var a = 1
var c = { name: 'jirengu', 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: 'jirengu', age: 3}

f1(a);즉function f1(n) {var n = a = 1,++n;}a는 기본 유형값으로 a와 n은 서로 영향을 주지 않는다.f2(c);즉functionf2(n){var obj=c(obj=c의 내용주소),++ obj.age;obj.age값에 1을 더하면 c.age의 값에 1을 더하는 것과 같다.f1(c.age); 즉function f1(n) {var n = c.age;n+;}c.age의 값을 수정하지 않았습니다. {var n = c.age; n++; c.age = n} 이렇게 하면 최종 결과는age가 4입니다.
5. 다음 수조를 필터하여 정수만 남기고 원수조에서 직접 조작
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
}
filter(arr)
console.log(arr) // [3,1,2]
var arr = [3,1,0,-1,-3,2,-5];
function filter(arr){
    var j = 0;
    for(var i = 0; i < arr.length; i++) {
        if(arr[i] > 0) {
            arr[j] = arr[i];
            j++;
        }
    }
    arr.length = j; 
}
filter(arr);
console.log(arr); // [3,1,2]

6. 다음 수조를 필터하여 정수만 보존하고 원수조는 변하지 않으며 새 수조를 생성합니다
var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr)  // [3,1,0,-1,-2,2,-5]
function filter(arr){
    var newArr = [];
    var j = 0;
    for(var i = 0; i < arr.length; i++) {
        if(arr[i] > 0) {
            newArr[j++] = arr[i]
        } 
    }
    return newArr;
}

7. 깊이 복사 함수를 써서 두 가지 방식으로 실현
첫 번째:
function deepCopy(oldObj) {
    var newObj = {};            //  
    for(var key in oldObj) {       //   
        if(oldObj.hasOwnProperty(key)) {   //  ( , ) 
            if(typeof oldObj[key] === 'number' || typeof oldObj[key] === 'string'  || typeof oldObj[key] === 'boolean' || oldObj[key] === undefined  || oldObj[key] === null ) {
                                        //  
                    newObj[key] = oldObj[key];
                } else {
                                        //  
                    newObj[key] = deepCopy(oldObj[key]);
            }
        }
    }
    return newObj;
}

두 번째obj1 = JSON.parse(JSON.stringify(obj));의 한계성: 함수를 복제할 수 없는 원형 체인이 없어졌고 대상은 Object이며 소속된 클래스가 없어졌다.

좋은 웹페이지 즐겨찾기