angular.extend和merge

extend

angular.extend(dst, src);

說明:

依次將第二個(gè)參數(shù)及后續(xù)的參數(shù)的第一層屬性(不管是簡(jiǎn)單屬性還是對(duì)象)拷貝賦給第一個(gè)參數(shù)的第一層屬性,即如果是對(duì)象,則是引用的是同一個(gè)對(duì)象,并返回第一個(gè)參數(shù)對(duì)象。src可以有多個(gè)。
angular.extend返回dst的引用。如下圖,修改了temp中某個(gè)值,dst中同樣會(huì)變。
不是深拷貝,多個(gè)src時(shí),后續(xù)的src會(huì)覆蓋前面src中存在的相同<strong>對(duì)象</strong>。如下圖,src2中的c會(huì)覆蓋src中的c。對(duì)象完全覆蓋,不會(huì)考慮對(duì)象里面的值。

Note: Keep in mind that angular.extend
does not support recursive merge (deep copy). Use angular.merge
for this.

代碼:

$scope.src = {
    a: 'A',
    b: 'B',
    c: {
        d: 'D',
        e: {
            f: 'F'
        }
    }
};
$scope.src2 = {
    c: {
        src2: 'D',
        e: {
            src2: 'src2',
            f: 'F'
        }
    }
};
$scope.dest = {
    A: 'a'
};
$scope.temp = angular.extend($scope.dest, $scope.src, $scope.src2);
$scope.change = function(){
    $scope.temp.A = 'changed';
}

效果:

src: {"a":"A","b":"B","c":{"d":"D","e":{"f":"F"}}}
src2: {"c":{"src2":"D","e":{"src2":"src2","f":"F"}}}
temp: {"A":"a","a":"A","b":"B","c":{"src2":"D","e":{"src2":"src2","f":"F"}}}
dest: {"A":"a","a":"A","b":"B","c":{"src2":"D","e":{"src2":"src2","f":"F"}}}

點(diǎn)擊button后:

src: {"a":"A","b":"B","c":{"d":"D","e":{"f":"F"}}}
src2: {"c":{"src2":"D","e":{"src2":"src2","f":"F"}}}
temp: {"A":"changed","a":"A","b":"B","c":{"src2":"D","e":{"src2":"src2","f":"F"}}}
dest: {"A":"changed","a":"A","b":"B","c":{"src2":"D","e":{"src2":"src2","f":"F"}}}

merge

angular.merge(dst, src);

說明:

和extend的區(qū)別就是merge是深拷貝。
如下圖,在extend中,src中的c對(duì)象會(huì)被src2中的c對(duì)象覆蓋;在merge中,會(huì)將兩個(gè)源中的對(duì)象都拷貝,如src中c對(duì)象中的d,如果兩個(gè)源中存在相同對(duì)象,并且相同對(duì)象中存在相同key,key對(duì)應(yīng)的值會(huì)被后者覆蓋。

代碼:

$scope.src = {
    a: 'A',
    b: 'B',
    c: {
        d: 'D',
        e: {
            f: 'F'
        }
    }
};
$scope.src2 = {
    c: {
        src2: 'D',
        e: {
            src2: 'src2',
            f: 'FFFFF'
        }
    }
};
$scope.dest = {
    A: 'a'
};
$scope.temp = angular.merge($scope.dest, $scope.src, $scope.src2);
$scope.change = function(){
    $scope.temp.A = 'changed';
}

效果:

src: {"a":"A","b":"B","c":{"d":"D","e":{"f":"F"}}}
src2: {"c":{"src2":"D","e":{"src2":"src2","f":"FFFFF"}}}
temp: {"A":"a","a":"A","b":"B","c":{"d":"D","e":{"f":"FFFFF","src2":"src2"},"src2":"D"}}
dest: {"A":"a","a":"A","b":"B","c":{"d":"D","e":{"f":"FFFFF","src2":"src2"},"src2":"D"}}

點(diǎn)擊button后

src: {"a":"A","b":"B","c":{"d":"D","e":{"f":"F"}}}
src2: {"c":{"src2":"D","e":{"src2":"src2","f":"FFFFF"}}}
temp: {"A":"changed","a":"A","b":"B","c":{"d":"D","e":{"f":"FFFFF","src2":"src2"},"src2":"D"}}
dest: {"A":"changed","a":"A","b":"B","c":{"d":"D","e":{"f":"FFFFF","src2":"src2"},"src2":"D"}}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容