参照渡し
参考:参考リンク
//コード
let user = { name: 'John' };
let admin = user;
admin.name = 'Pete'; // "admin" の参照で変更されました
alert(user.name); // 'Pete', "user" の参照からも変更が確認できます
let a = {};
let b = a; // 参照のコピー
alert( a == b ); // true, 両方の変数は同じオブジェクトを参照しています
alert( a === b ); // true
let a = {};
let b = {}; // 2つの独立したオブジェクト
alert( a == b ); // false
クローンとマージ, Object.assign
参考:参考リンク
//コード
let obj1 = {value: 'hoge'}
let obj2 = Object.assign({}, obj1);
console.log(obj2); // { value: 'hoge' }
obj1.value = 'fuga';
console.log(obj1); // { value: 'fuga' }
console.log(obj2); // { value: 'hoge' }
//Object.assign()の本来の用途は、オブジェクトをマージすること
let obj1 = {
value: 'hoge',
obj2: {
num: 1
}
};
let copy = Object.assign({}, obj1);
console.log(copy); // { value: 'hoge', obj2: { num: 1 } }
obj1.value = 'fuga';
obj1.obj2.num = 9;
console.log(copy); // { value: 'hoge', obj2: { num: 9 } }
//old メソッド
let user = {
name: "John",
age: 30
};
let clone = {}; // 新しい空オブジェクト
// すべての user プロパティをその中にコピーしましょう
for (let key in user) {
clone[key] = user[key];
}
// 今、clone は完全に独立したクローンです
clone.name = "Pete"; // その中のデータを変更
alert( user.name ); // 依然としてオリジナルのオブジェクトは John
$.extend VS Object.assign
参考:JavascriptでObjectをextend / assign / mergeする4つの方法
//コード
let object1 = {
id: 1,
name: {
forename: 'John',
surname: 'McClane'
},
};
let object2 = {
id: 2,
name: {
}
};
// merge objects
let objExtend = $.extend(true, {}, object1, object2);
let objAssign = Object.assign({}, object1, object2);
// diff
console.log(objExtend.name.forename); // "John"
console.log(objAssign.name.forename); // undefined
$x$ = nja_mrg: $.extendをvaniraで実装
参考:vanilla-javascript-version-of-jquery-extend
//コード
var nja_mrg = function () {
// Variables
var extended = {};
var deep = false;
var i = 0;
var length = arguments.length;
// Check if a deep merge
if ( Object.prototype.toString.call( arguments[0] ) === '[object Boolean]' ) {
deep = arguments[0];
i++;
}
// Merge the object into the extended object
var merge = function (obj) {
for ( var prop in obj ) {
if ( Object.prototype.hasOwnProperty.call( obj, prop ) ) {
// If deep merge and property is an object, merge properties
if ( deep && Object.prototype.toString.call(obj[prop]) === '[object Object]' ) {
extended[prop] = extend( true, extended[prop], obj[prop] );
} else {
extended[prop] = obj[prop];
}
}
}
};
// Loop through each object and conduct a merge
for ( ; i < length; i++ ) {
var obj = arguments[i];
merge(obj);
}
return extended;
};
window.$x$ = nja_mrg;