式と演算子

参考:式と演算子

参考:演算子の優先順位




参照渡し

参考:参考リンク

//コード
  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;