Object Equality in JavaScript
Equality๋ ๋๋ถ๋ถ ์ฒ์์ ํ๋๋ก JavaScript์ ํผ๋์ค๋ฌ์ด ์ธก๋ฉด์ด ์๋ค.
Equality๋ Javascript์์ ๊ฐ์ฅ ์ฒ์์ผ๋ก ํผ๋์ค๋ฌ์ด ์ธก๋ฉด ์ค ํ๋์ด๋ค.
==๋นํด ===์ ๊ฐ๋ ฅํ ํ์ ๋ช ๋ น์ด๋ค. ๋ชจ๋ ์ฃผ์ ๋ฅผ ๋ณต์กํ๊ฒ ์ ๊ณตํ๋ค.
์ค๋๋ ์ฐ๋ฆฌ๋ ๋ค๋ฅธ ๋ฉด์ ์ดํด ๋ณผ๊ฒ์ด๋ค. ์ด๋ป๊ฒ ๊ฐ์ฒด์ ๋น๊ต๋ฅผ ํ๋๊ฐ
๋ง์ฝ ๋๊ฐ์ ๊ฐ์ฒด๊ฐ ๊ฐ์ ์์ฑ๊ณผ ๊ทธ๋ค์ ์์ฑ์ด ๊ฐ์ ๊ฐ์ด๋ฉด, ๊ทธ๋ค์ ํ์คํ ๊ฐ์ ์๋ ์์ ๊ฒ์ด๋ค. ๋ค์ ๊ฒฝ์ฐ๋ฅผ ๋ณด์
var jangoFett = { occupation: "Bounty Hunter", genetics: "superb" }; var bobaFett = { occupation: "Bounty Hunter", genetics: "superb" }; // Outputs: false console.log(bobaFett === jangoFett);
bobaFett์ jangoFett๋ ์์ฑ๋ค์ ๊ฐ์ง๋ง ๊ฐ์ฒด ์์ ๋ค์ ํ์ค ๊ฐ์ง ์๋ค. ์๋ง๋ ๊ทธ๊ฒ์ด ===๋ฅผ ์ฌ์ฉํด์ ์ผ๊น?
๋ค์์ ๋ณด์
// Outputs: false console.log(bobaFett == jangoFett);
์ด์ ๋ ๋ด๋ถ Javascript๊ฐ testing equility์ ์ ๊ทผ์ ๋๊ฐ๋ฅผ ๋ค๋ฅด๊ฒ ๋ณด๊ธฐ ๋๋ฌธ์ ๋๋ค. stirngs์ numbers์ ๊ฐ์ ๊ธฐ์ด์ ์ธ ๊ฒ์ ๊ทธ๋ค์ ๊ฐ์ผ๋ก ๋น๊ต๋ฅผ ํ์ง๋ง ๋ฐ๋ฉด์ ๋ฐฐ์ด,date, plain objects๋ ๊ทธ๋ค์ ์ฐธ์กฐ๋ฅผ ๋น๊ตํฉ๋๋ค. ์ฐธ์กฐ์ ๋น๊ต๋ ๊ธฐ๋ณต์ ์ผ๋ก ๊ฐ์ฒด ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์์น์ ์ฐธ์กฐ๋ฅผ ์ ๊ณตํ๋ค๋ฉด ๋ณด๋ ๊ฑฐ์ ์ฒดํฌ ํฉ๋๋ค. ๋ค์์ ์์ ์ ๋๋ค.
var jangoFett = { occupation: "Bounty Hunter", genetics: "superb" }; var bobaFett = { occupation: "Bounty Hunter", genetics: "superb" }; var callMeJango = jangoFett; // Outputs: false console.log(bobaFett === jangoFett); // Outputs: true console.log(callMeJango === jangoFett);
ํํธ, jangoFett์ bobaFett๋ ๊ฐ์ ์์ฑ๋ค๊ณผ ํจ๊ป ๋๊ฐ์ ์ ๊ฐ์ฒด๋ ์ฐธ์กฐํ๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ค์ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ธ์คํด์ค์ด๋ค. ํํธ jangoFett์ callMeJango๋ ๋๋ค๊ฐ์ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ๋ค.
์ด ๋๋ฌธ์, ํฅ๋ฏธ๋ก์ด ๋น๊ต ์ข ๋ฅ์ ๋ํ ์๋ก์ด ์์ด๋์ด๊ฐ ํ์ํ๋ค. ๋น์ ์ ๋๊ฐ๊ฐ ๊ฐ์ ์ธ์คํด์ค์ ์กด์ฌํ๋์ง ์ฒดํฌ๋ฅผ ์ํ๋์? ๊ทธ๋๋ JavaScript์ ๋ด๋ถ ๋น๊ณ ๋ฌธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ํ ๋น์ ์ด ๋๊ฐ์ ๊ฐ์ฒด ๊ฐ์ ๊ฐ์ธ์ง๋ฅผ ์ฒดํฌ๋ฅผ ์ํ๋์? ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด ๊ทธ๋๋ ๋ ๋ง์ ์ผ์ด ํ์ํ ๊ฒ์ ๋๋ค.
์ฌ๊ธฐ๋ โ๊ฐ์ด ๊ฐ์โ ๊ฐ์ฒด์ ์ฒดํฌ๋ฅผ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ทผํฉ๋๋ค.
function isEquivalent(a, b) { // Create arrays of property names var aProps = Object.getOwnPropertyNames(a); var bProps = Object.getOwnPropertyNames(b); // If number of properties is different, // objects are not equivalent if (aProps.length != bProps.length) { return false; } for (var i = 0; i < aProps.length; i++) { var propName = aProps[i]; // If values of same property are not equal, // objects are not equivalent if (a[propName] !== b[propName]) { return false; } } // If we made it this far, objects // are considered equivalent return true; } // Outputs: true console.log(isEquivalent(bobaFett, jangoFett));
๋ณธ๋ค๋ฉด, ๊ฐ์ ๊ฐ์ ๊ฐ์ฒด์ โ๊ฐ์ด ๊ฐ์โ์ ๊ฐ์ฒด์ ๋ชจ๋ ์์ฑ์ ๋ฐ๋ณตํ๋ฉฐ ๊ทธ๊ฒ๋ค์ ๋น๊ตํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋จ์ํ ์คํ์ ์ํ ์ผ์ ์ฐ๋ฆฌ์ ์์ ๋ฅผ ์ํ ์ผ์ ๋๋ค. ๊ฑฐ๊ธฐ์๋ ๋ง์ ๊ฒฝ์ฐ๊ฐ ์กฐ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด
์์ฑ๊ฐ์ค์ ๊ฐ์ฒด ์์ ์ด๋ผ๋ฉด
์์ฑ๊ฐ์ด NaN์ด๋ผ๋ฉด
a ์์ฑ์ undefined์ด๊ณ b๋ ์์ฑ์ด ์์๋
robust๋ ์ฒดํฌ ๊ฐ์ฒด๋ค์ ๋ฉ์๋๋ โ๊ฐ ๊ฐ์โ ๊ทธ๊ฒ์ ์ฌ๋ฌ๊ฐ์ง ์ฃ์ง ์ผ์ด์ค๋ฅผ ํ ์คํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ต๋ณ์ด ์จ๋ค. ๋๊ฐ Underscore์ Lo-Dash๋ _.isEqual์ ์ด๋ฆ์ผ๋ก ์คํ ํฉ๋๋ค. ๊น์ ๊ฐ์ฒด์ ๋น๊ต๋ ์ ๋๊ฑฐ ๋น์ ์ ์๋์ ๊ฐ์ ์์ค ์ฝ๋ค๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
// Outputs: true console.log(_.isEqual(bobaFett, jangoFett));
๋๋ Javascript์ drip์ ํฌ๋งํ๊ณ ๊ฐ์ฒด๋ฅผ ์ด๋ป๊ฒ ๋น๊ตํ๋์ง ์์ ๋ณด์๋ค.
















