JavaScriptã®æ§é åã¯ããŒã³ã¢ã«ãŽãªãºã ã®å æ¬çã¬ã€ãããªããžã§ã¯ãã®ãã£ãŒãã³ããŒã«ãããæ©èœãå¶éãå®è·µçãªå¿çšäŸã解説ããŸãã
JavaScriptã®æ§é åã¯ããŒã³: ãªããžã§ã¯ãã®ãã£ãŒãã³ããŒããã¹ã¿ãŒãã
JavaScriptã§ã¯ããªããžã§ã¯ããé åã®ã³ããŒãäœæããããšã¯äžè¬çãªã¿ã¹ã¯ã§ããåçŽãªä»£å ¥ïŒ`=`ïŒã¯ããªããã£ããªå€ã«ã¯æå¹ã§ããããªããžã§ã¯ãã«å¯ŸããŠã¯åç §ãäœæããã ãã§ããããã¯ãã³ããŒããããªããžã§ã¯ããžã®å€æŽãå ã®ãªããžã§ã¯ãã«ã圱é¿ãäžããããšãæå³ããŸããç¬ç«ããã³ããŒãäœæããã«ã¯ããã£ãŒãã³ããŒã®ã¡ã«ããºã ãå¿ èŠã§ããæ§é åã¯ããŒã³ã¢ã«ãŽãªãºã ã¯ãç¹ã«è€éãªããŒã¿æ§é ãæ±ãéã«ããããå®çŸããããã®åŒ·åã§å€çšéãªæ¹æ³ãæäŸããŸãã
æ§é åã¯ããŒã³ãšã¯ïŒ
æ§é åã¯ããŒã³ã¢ã«ãŽãªãºã ã¯ãJavaScriptå€ã®ãã£ãŒãã³ããŒãäœæã§ããJavaScriptã®çµã¿èŸŒã¿ã¡ã«ããºã ã§ããåçŽãªä»£å ¥ãã·ã£ããŒã³ããŒã®ã¡ãœããïŒ`Object.assign()`ãã¹ãã¬ããæ§æ`...`ãªã©ïŒãšã¯ç°ãªããæ§é åã¯ããŒã³ã¯å šãæ°ãããªããžã§ã¯ããšé åãäœæãããã¹ãããããã¹ãŠã®ããããã£ãååž°çã«ã³ããŒããŸããããã«ãããã³ããŒããããªããžã§ã¯ããå ã®ãªããžã§ã¯ãããå®å šã«ç¬ç«ããŠããããšãä¿èšŒãããŸãã
ãã®ã¢ã«ãŽãªãºã ã¯ãWebã¯ãŒã«ãŒéã®éä¿¡ãHistory APIã䜿çšããããŒã¿ä¿åã®å éšã§ã䜿çšãããŠããŸãããã®ä»çµã¿ãçè§£ããããšã§ãã³ãŒããæé©åããäºæãã¬åäœãé¿ããããšãã§ããŸãã
æ§é åã¯ããŒã³ã®ä»çµã¿
æ§é åã¯ããŒã³ã¢ã«ãŽãªãºã ã¯ããªããžã§ã¯ãã°ã©ããèµ°æ»ããééããåãªããžã§ã¯ããšé åã®æ°ããã€ã³ã¹ã¿ã³ã¹ãäœæããããšã§æ©èœããŸãã以äžãå«ãæ§ã ãªããŒã¿åãæ±ããŸãïŒ
- ããªããã£ãåïŒæ°å€ãæååãçåœå€ãnullãundefinedïŒ - å€ã§ã³ããŒãããŸãã
- ãªããžã§ã¯ããšé å - ååž°çã«ã¯ããŒã³ãããŸãã
- Date - åãã¿ã€ã ã¹ã¿ã³ããæã€æ°ããDateãªããžã§ã¯ããšããŠã¯ããŒã³ãããŸãã
- æ£èŠè¡šçŸ - åããã¿ãŒã³ãšãã©ã°ãæã€æ°ããRegExpãªããžã§ã¯ããšããŠã¯ããŒã³ãããŸãã
- Blobããã³Fileãªããžã§ã¯ã - ã¯ããŒã³ãããŸãïŒãã ãããã¡ã€ã«ããŒã¿å šäœã®èªã¿åãã䌎ãå ŽåããããŸãïŒã
- ArrayBufferããã³TypedArray - åºã«ãªããã€ããªããŒã¿ãã³ããŒããŠã¯ããŒã³ãããŸãã
- MapãšSet - ååž°çã«ã¯ããŒã³ãããã¯ããŒã³ãããããŒãšå€ãæã€æ°ããMapãšSetãäœæãããŸãã
ãã®ã¢ã«ãŽãªãºã ã¯åŸªç°åç §ãåŠçããç¡éååž°ãé²ããŸãã
æ§é åã¯ããŒã³ã®äœ¿çšæ³
ãã¹ãŠã®JavaScriptç°å¢ã«çŽæ¥ã®`structuredClone()`颿°ãããããã§ã¯ãããŸãããïŒå€ããã©ãŠã¶ã§ã¯ãã€ãã£ããµããŒããæ¬ ããŠããå ŽåããããŸãïŒããã®åºæ¬çãªã¡ã«ããºã ã¯æ§ã ãªã³ã³ããã¹ãã§äœ¿çšãããŠããŸããããã«ã¢ã¯ã»ã¹ããäžè¬çãªæ¹æ³ã®äžã€ã¯ãWebã¯ãŒã«ãŒãiframeéã®éä¿¡ã«äœ¿çšããã`postMessage` APIãä»ããããšã§ãã
æ¹æ³1: `postMessage`ã䜿çšããïŒå¹ åºãäºææ§ã®ããæšå¥šïŒ
ãã®ã¢ãããŒãã¯ãå éšã§æ§é åã¯ããŒã³ã¢ã«ãŽãªãºã ã䜿çšãã`postMessage` APIãæŽ»çšããŸããäžæçãªiframeãäœæãã`postMessage`ã䜿çšããŠãªããžã§ã¯ããéä¿¡ãããããåãåããŸãã
function structuredClone(obj) {
return new Promise(resolve => {
const { port1, port2 } = new MessageChannel();
port1.onmessage = ev => resolve(ev.data);
port2.postMessage(obj);
});
}
// Example Usage
const originalObject = {
name: "John Doe",
age: 30,
address: { city: "New York", country: "USA" }
};
async function deepCopyExample() {
const clonedObject = await structuredClone(originalObject);
console.log("Original Object:", originalObject);
console.log("Cloned Object:", clonedObject);
// Modify the cloned object
clonedObject.address.city = "Los Angeles";
console.log("Original Object (after modification):", originalObject); // Unchanged
console.log("Cloned Object (after modification):", clonedObject); // Modified
}
deepCopyExample();
ãã®æ¹æ³ã¯ãããŸããŸãªãã©ãŠã¶ãç°å¢ã§å¹ åºãäºææ§ããããŸãã
æ¹æ³2: ãã€ãã£ãã®`structuredClone`ïŒã¢ãã³ãªç°å¢ïŒ
å€ãã®ã¢ãã³ãªJavaScriptç°å¢ã§ã¯ãçŸåšãçµã¿èŸŒã¿ã®`structuredClone()`颿°ãçŽæ¥æäŸãããŠããŸããããã¯ãå©çšå¯èœãªå Žåã«ãã£ãŒãã³ããŒãå®è¡ããããã®æãå¹ççã§ç°¡åãªæ¹æ³ã§ãã
// Check if structuredClone is supported
if (typeof structuredClone === 'function') {
const originalObject = {
name: "Alice Smith",
age: 25,
address: { city: "London", country: "UK" }
};
const clonedObject = structuredClone(originalObject);
console.log("Original Object:", originalObject);
console.log("Cloned Object:", clonedObject);
// Modify the cloned object
clonedObject.address.city = "Paris";
console.log("Original Object (after modification):", originalObject); // Unchanged
console.log("Cloned Object (after modification):", clonedObject); // Modified
}
else {
console.log("structuredClone is not supported in this environment. Use the postMessage polyfill.");
}
`structuredClone`ã䜿çšããåã«ã察象ã®ç°å¢ã§ãµããŒããããŠãããã確èªããããšãéèŠã§ãããµããŒããããŠããªãå Žåã¯ã`postMessage`ããªãã£ã«ãä»ã®ãã£ãŒãã³ããŒä»£æ¿ææ®µã«ãã©ãŒã«ããã¯ããŠãã ããã
æ§é åã¯ããŒã³ã®å¶é
匷åã§ã¯ãããŸãããæ§é åã¯ããŒã³ã«ã¯ããã€ãã®å¶éããããŸãïŒ
- 颿°: 颿°ã¯ã¯ããŒã³ã§ããŸããããªããžã§ã¯ãã颿°ãå«ãå Žåãã¯ããŒã³ããã»ã¹äžã«å€±ãããŸããã¯ããŒã³ããããªããžã§ã¯ãã§ã¯ããã®ããããã£ã¯`undefined`ã«èšå®ãããŸãã
- DOMããŒã: DOMããŒãïŒãŠã§ãããŒãžã®èŠçŽ ãªã©ïŒã¯ã¯ããŒã³ã§ããŸãããã¯ããŒã³ããããšãããšãšã©ãŒãçºçããŸãã
- ãšã©ãŒ: ç¹å®ã®ãšã©ãŒãªããžã§ã¯ããã¯ããŒã³ã§ãããæ§é åã¯ããŒã³ã¢ã«ãŽãªãºã ã¯ãããã«ééãããšãšã©ãŒãã¹ããŒããããšããããŸãã
- ãããã¿ã€ããã§ãŒã³: ãªããžã§ã¯ãã®ãããã¿ã€ããã§ãŒã³ã¯ä¿æãããŸãããã¯ããŒã³ããããªããžã§ã¯ãã¯ã`Object.prototype`ããããã¿ã€ããšããŠæã¡ãŸãã
- ããã©ãŒãã³ã¹: ãã£ãŒãã³ããŒã¯ãç¹ã«å€§èŠæš¡ã§è€éãªãªããžã§ã¯ãã®å Žåãèšç®ã³ã¹ããé«ããªãå¯èœæ§ããããŸããç¹ã«ããã©ãŒãã³ã¹ãéèŠãªã¢ããªã±ãŒã·ã§ã³ã§æ§é åã¯ããŒã³ã䜿çšããéã¯ãããã©ãŒãã³ã¹ãžã®åœ±é¿ãèæ ®ããŠãã ããã
æ§é åã¯ããŒã³ã䜿çšããå Žé¢
æ§é åã¯ããŒã³ã¯ãããã€ãã®ã·ããªãªã§äŸ¡å€ããããŸãïŒ
- Webã¯ãŒã«ãŒ: ã¡ã€ã³ã¹ã¬ãããšWebã¯ãŒã«ãŒéã§ããŒã¿ãæž¡ãéãæ§é åã¯ããŒã³ãäž»èŠãªã¡ã«ããºã ã§ãã
- History API: `history.pushState()`ãš`history.replaceState()`ã¡ãœããã¯ããã©ãŠã¶ã®å±¥æŽã«ããŒã¿ãä¿åããããã«æ§é åã¯ããŒã³ã䜿çšããŸãã
- ãªããžã§ã¯ãã®ãã£ãŒãã³ããŒ: ãªããžã§ã¯ãã®å®å šã«ç¬ç«ããã³ããŒãäœæããå¿ èŠãããå Žåãæ§é åã¯ããŒã³ã¯ä¿¡é Œæ§ã®é«ã解決çãæäŸããŸããããã¯ãå ã®ãªããžã§ã¯ãã«åœ±é¿ãäžããã«ã³ããŒã倿Žãããå Žåã«ç¹ã«äŸ¿å©ã§ãã
- ã·ãªã¢ã©ã€ãºãšãã·ãªã¢ã©ã€ãº: äž»ãªç®çã§ã¯ãããŸããããæ§é åã¯ããŒã³ã¯åºæ¬çãªåœ¢åŒã®ã·ãªã¢ã©ã€ãºãšãã·ãªã¢ã©ã€ãºãšããŠäœ¿çšã§ããŸãïŒãã ããéåžžãæ°žç¶åã«ã¯JSONã奜ãŸããŸãïŒã
æ§é åã¯ããŒã³ã®ä»£æ¿æ¡
æ§é åã¯ããŒã³ãããŒãºã«é©ããŠããªãå ŽåïŒäŸãã°ããã®å¶éãããã©ãŒãã³ã¹ã®æžå¿µã®ããïŒããããã®ä»£æ¿æ¡ãæ€èšããŠãã ããïŒ
- JSON.parse(JSON.stringify(obj)): ããã¯ãã£ãŒãã³ããŒã®ããã®äžè¬çãªã¢ãããŒãã§ãããå¶éããããŸããJSONã«ã·ãªã¢ã©ã€ãºã§ãããªããžã§ã¯ãã«ããæ©èœããïŒé¢æ°ã¯äžå¯ãDateã¯æååã«å€æããããªã©ïŒãè€éãªãªããžã§ã¯ãã«å¯ŸããŠã¯æ§é åã¯ããŒã³ãããé ããªãããšããããŸãã
- Lodashã® `_.cloneDeep()`: Lodashã¯ãå€ãã®ãšããžã±ãŒã¹ãåŠçããåªããããã©ãŒãã³ã¹ãæäŸããå ç¢ãª`cloneDeep()`颿°ãæäŸããŸãããããžã§ã¯ãã§æ¢ã«Lodashã䜿çšããŠããå Žåã¯è¯ãéžæè¢ã§ãã
- ã«ã¹ã¿ã ãã£ãŒãã³ããŒé¢æ°: ååž°ã䜿çšããŠç¬èªã®ãã£ãŒãã³ããŒé¢æ°ãäœæããããšãã§ããŸããããã«ãããã¯ããŒã³ããã»ã¹ãå®å šã«å¶åŸ¡ã§ããŸãããããå€ãã®åŽåãå¿ èŠã§ããšã©ãŒãçºçãããããªããŸãã埪ç°åç §ãæ£ããåŠçããããã«ããŠãã ããã
å®è·µçãªäŸãšãŠãŒã¹ã±ãŒã¹
äŸ1: 倿Žåã®ãŠãŒã¶ãŒããŒã¿ã®ã³ããŒ
ãŠãŒã¶ãŒç®¡çã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠãããšæ³åããŠãã ããããŠãŒã¶ãŒããããã¡ã€ã«ãç·šéããåã«ãçŸåšã®ããŒã¿ã®ãã£ãŒãã³ããŒãäœæãããå ŽåããããŸããããã«ããããŠãŒã¶ãŒãç·šéããã£ã³ã»ã«ããå ŽåããæŽæ°ããã»ã¹äžã«ãšã©ãŒãçºçããå Žåã«ãå ã®ããŒã¿ã«æ»ãããšãã§ããŸãã
let userData = {
id: 12345,
name: "Carlos Rodriguez",
email: "carlos.rodriguez@example.com",
preferences: {
language: "es",
theme: "dark"
}
};
async function editUser(newPreferences) {
// Create a deep copy of the original data
const originalUserData = await structuredClone(userData);
try {
// Update the user data with the new preferences
userData.preferences = newPreferences;
// ... Save the updated data to the server ...
console.log("User data updated successfully!");
} catch (error) {
console.error("Error updating user data. Reverting to original data.", error);
// Revert to the original data
userData = originalUserData;
}
}
// Example usage
editUser({ language: "en", theme: "light" });
äŸ2: Webã¯ãŒã«ãŒãžã®ããŒã¿éä¿¡
Webã¯ãŒã«ãŒã䜿çšãããšãèšç®éã®å€ãã¿ã¹ã¯ãå¥ã®ã¹ã¬ããã§å®è¡ã§ãããããã¡ã€ã³ã¹ã¬ãããå¿çããªããªãã®ãé²ãããšãã§ããŸããWebã¯ãŒã«ãŒã«ããŒã¿ãéä¿¡ããéã«ã¯ãããŒã¿ãé©åã«è»¢éãããããã«æ§é åã¯ããŒã³ã䜿çšããå¿ èŠããããŸãã
// Main thread
const worker = new Worker('worker.js');
let dataToSend = {
numbers: [1, 2, 3, 4, 5],
text: "Process this data in the worker."
};
worker.postMessage(dataToSend);
worker.onmessage = (event) => {
console.log("Received from worker:", event.data);
};
// worker.js (Web Worker)
self.onmessage = (event) => {
const data = event.data;
console.log("Worker received data:", data);
// ... Perform some processing on the data ...
const processedData = data.numbers.map(n => n * 2);
self.postMessage(processedData);
};
æ§é åã¯ããŒã³ã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
- å¶éãçè§£ãã: ã¯ããŒã³ã§ããªãããŒã¿ã®çš®é¡ïŒé¢æ°ãDOMããŒããªã©ïŒãèªèããé©åã«å¯ŸåŠããŠãã ããã
- ããã©ãŒãã³ã¹ãèæ ®ãã: å€§èŠæš¡ã§è€éãªãªããžã§ã¯ãã®å Žåãæ§é åã¯ããŒã³ã¯é ããªãå¯èœæ§ããããŸããããŒãºã«å¯ŸããŠæãå¹ççãªè§£æ±ºçã§ãããã©ãããè©äŸ¡ããŠãã ããã
- ãµããŒãã確èªãã: ãã€ãã£ãã®`structuredClone()`颿°ã䜿çšããå Žåã¯ã察象ã®ç°å¢ã§ãµããŒããããŠãããã確èªããŠãã ãããå¿ èŠã§ããã°ããªãã£ã«ã䜿çšããŠãã ããã
- 埪ç°åç §ãåŠçãã: æ§é åã¯ããŒã³ã¢ã«ãŽãªãºã ã¯åŸªç°åç §ãåŠçããŸãããããŒã¿æ§é å ã®ãããã«æ³šæããŠãã ããã
- äžèŠãªããŒã¿ã®ã¯ããŒã³ãé¿ãã: å®éã«ã³ããŒããå¿ èŠãããããŒã¿ã®ã¿ãã¯ããŒã³ããŠãã ãããäžéšã®ã¿ã倿Žããå¿ èŠãããå Žåã«ã倧ããªãªããžã§ã¯ããé åå šäœãã¯ããŒã³ããã®ã¯é¿ããŠãã ããã
çµè«
JavaScriptã®æ§é åã¯ããŒã³ã¢ã«ãŽãªãºã ã¯ããªããžã§ã¯ããé åã®ãã£ãŒãã³ããŒãäœæããããã®åŒ·åãªããŒã«ã§ãããã®æ©èœãšå¶éãçè§£ããããšã§ãWebã¯ãŒã«ãŒéä¿¡ãããªããžã§ã¯ãã®ãã£ãŒãã³ããŒãŸã§ãããŸããŸãªã·ããªãªã§å¹æçã«äœ¿çšã§ããŸããä»£æ¿æ¡ãæ€èšãããã¹ããã©ã¯ãã£ã¹ã«åŸãããšã§ãç¹å®ã®ããŒãºã«æãé©ããæ¹æ³ã䜿çšããŠããããšã確èªã§ããŸãã
åžžã«ããã©ãŒãã³ã¹ãžã®åœ±é¿ãèæ ®ããããŒã¿ã®è€éããšãµã€ãºã«åºã¥ããŠæ£ããã¢ãããŒããéžæããããšãå¿ããªãã§ãã ãããæ§é åã¯ããŒã³ãä»ã®ãã£ãŒãã³ããŒæè¡ãç¿åŸããããšã§ãããå ç¢ã§å¹ççãªJavaScriptã³ãŒããæžãããšãã§ããŸãã