eval()
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2015å¹´7æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
è¦å:
æååãã JavaScript ãå®è¡ãããã¨ã¯ãé常ã«å¤§ããªã»ãã¥ãªãã£ãªã¹ã¯ãä¼´ãã¾ããeval() ã使ç¨ããã¨ãæªæã®ããè
ãä»»æã®ã³ã¼ããå®è¡ãããã¨ããã¾ãã«ãç°¡åã«ãªãã¾ããä¸è¨ã® eval() ã使ããªãã§ãã ãã!ãåç
§ãã¦ãã ããã
eval() 颿°ã¯ãæååã¨ãã¦è¡¨ç¾ããã JavaScript ã³ã¼ããè©ä¾¡ãã¾ããã½ã¼ã¹ã¯ã¹ã¯ãªããã¨ãã¦è§£éããã¾ãã
試ãã¦ã¿ã¾ããã
console.log(eval("2 + 2"));
// äºæ³ãããçµæ: 4
console.log(eval(new String("2 + 2")));
// äºæ³ãããçµæ: 2 + 2
console.log(eval("2 + 2") === eval("4"));
// äºæ³ãããçµæ: true
console.log(eval("2 + 2") === eval(new String("2 + 2")));
// äºæ³ãããçµæ: false
æ§æ
eval(script)
弿°
script-
JavaScript ã®å¼ãæãã¾ãã¯ä¸é£ã®æã表ãæååã§ããå¼ã«ã¯ãæ¢åãªãã¸ã§ã¯ãã®å¤æ°ããã³ããããã£ãå«ãããã¾ããããã¯ã¹ã¯ãªããã¨ãã¦è§£éããã¾ãã®ã§ã
import宣è¨ï¼ã¢ã¸ã¥ã¼ã«ã®ä¸ã«åå¨ãããï¼ã¯è¨±å¯ããã¦ãã¾ããã
è¿å¤
ä¸ããããã³ã¼ãã®è©ä¾¡çµæã®å¤ãè¿ãã¾ããè©ä¾¡çµæã空ã®å ´åã¯ãundefined ãè¿ãã¾ãããã script ãæååããªããã£ãã§ãªããã°ã eval() ã¯å¼æ°ã夿´ããã«è¿ãã¾ãã
ä¾å¤
ã³ã¼ããè©ä¾¡ãã¦ããéã«çºçããããããä¾å¤ãçºçãã¾ãããã script ãã¹ã¯ãªããã¨ãã¦è§£éã§ããªãã£ãå ´å㯠SyntaxError ã«ãªãã¾ãã
解説
eval() ã¯ã°ãã¼ãã«ãªãã¸ã§ã¯ãã®é¢æ°ããããã£ã§ãã
eval() 颿°ã®å¼æ°ã¯æååã§ãã
ã½ã¼ã¹æååãã¹ã¯ãªããæ¬ä½ã¨ãã¦è©ä¾¡ãã¾ããã¤ã¾ããæã¨å¼ã®ä¸¡æ¹ã使ç¨å¯è½ã§ããã³ã¼ãã®å®äºå¤ãè¿ãã¾ããå¼ã®å ´åã¯ãå¼ãè©ä¾¡ãããå¤ã§ããå¤ãã®æã宣è¨ãåæ§ã«å®äºå¤ãæã¡ã¾ããããã®çµæã¯æå¤ãªãã®ã«ãªããã¨ãããã¾ãï¼ä¾ãã°ã代å
¥ã®å®äºå¤ã¯ä»£å
¥ãããå¤ã§ããã let ã®å®äºå¤ã¯ undefined ã§ãï¼ããã®ãããæã®å®äºå¤ã«ã¯é ¼ããªããã¨ããå§ããã¾ãã
峿 ¼ã¢ã¼ãã§ã¯ã eval ã¨ããååã®å¤æ°ã宣è¨ãããã eval ã«ä»£å
¥ããããããã¨ã¯ SyntaxError ã«ãªãã¾ãã
"use strict";
const eval = 1; // SyntaxError: Unexpected eval or arguments in strict mode
eval() ã®å¼æ°ãæååã§ãªãå ´åãeval() ã¯å¼æ°ã夿´ããã«è¿ãã¾ããæ¬¡ã®ä¾ã§ã¯ãããªããã£ãã®ä»£ããã« String ãªãã¸ã§ã¯ããæ¸¡ãã¨ã eval() ã¯æååãè©ä¾¡ããã®ã§ã¯ãªãã String ãªãã¸ã§ã¯ããè¿ãã¾ãã
eval(new String("2 + 2")); // "2 + 2" ãå«ã String ãªãã¸ã§ã¯ããè¿ã
eval("2 + 2"); // 4 ãè¿ã
ä¸è¬çãªæ¹æ³ã§ãã®èª²é¡ããã¾ãåé¿ããã«ã¯ãeval() ã«æ¸¡ãåã«ãèªåã§å¼æ°ãæååã«å¤æãããã¨ãã§ãã¾ãã
const expression = new String("2 + 2");
eval(String(expression)); // 4 ãè¿ãã¾ã
ç´æ¥ã¾ãã¯éæ¥ eval
eval() ã®å¼ã³åºãã«ã¯ãç´æ¥ eval ã¨éæ¥ eval ã® 2 ã¤ã®ã¢ã¼ããããã¾ããç´æ¥ eval ã¯ããã®ååã示ãã¨ãããã°ãã¼ãã«ãª eval 颿°ã eval(...) ã§ç´æ¥å¼ã³åºããã¨ãæãã¾ãããã以å¤ã®ãã¹ã¦ã¯ãã¨ã¤ãªã¢ã¹å¤æ°çµç±ãã¡ã³ãã¼ã¢ã¯ã»ã¹ããã®ä»ã®å¼çµç±ãã¾ãã¯ãªãã·ã§ãã«ãã§ã¼ã³ ?. æ¼ç®åã使ç¨ãã¦å¼ã³åºããã¨ãå«ãã¦ã鿥çãªãã®ã§ãã
// ç´æ¥å¼ã³åºã
eval("x + y");
// eval ãè¿ãããã«ã«ã³ãæ¼ç®åã使ç¨ãã鿥å¼ã³åºã
(0, eval)("x + y");
// ãªãã·ã§ãã«ãã§ã¼ã³ã«ãã鿥å¼ã³åºã
eval?.("x + y");
// eval ãæ ¼ç´ãè¿ãããã«å¤æ°ã使ç¨ãã鿥å¼ã³åºã
const myEval = eval;
myEval("x + y");
// ã¡ã³ãã¼ã¢ã¯ã»ã¹ã«ãã鿥å¼ã³åºã
const obj = { eval };
obj.eval("x + y");
鿥 eval ã¯ãã³ã¼ããå¥åã® <script> ã¿ã°ã®ä¸ã§è©ä¾¡ãããããã«è¦ããã¨ãã§ãã¾ããããã¯ã¤ã¾ã次ã®ãããªæå³ã§ãã
-
鿥 eval ã¯ãã¼ã«ã«ã¹ã³ã¼ãã§ã¯ãªãã°ãã¼ãã«ã¹ã³ã¼ãã§åä½ããè©ä¾¡ãããã³ã¼ãã¯å¼ã³åºãããã¹ã³ã¼ãå ã®ãã¼ã«ã«å¤æ°ã«ã¢ã¯ã»ã¹ãããã¨ã¯ããã¾ããã
jsfunction test() { const x = 2; const y = 4; // ç´æ¥å¼ã³åºãããã¼ã«ã«ã¹ã³ã¼ããä½¿ç¨ console.log(eval("x + y")); // çµæã¯ 6 // 鿥å¼ã³åºããã°ãã¼ãã«ã¹ã³ã¼ããä½¿ç¨ console.log(eval?.("x + y")); // x ãã°ãã¼ãã«ã¹ã³ã¼ãã§å®ç¾©ããã¦ããªããããä¾å¤ãçºç } -
鿥çãª
evalã¯å¨å²ã®ã³ã³ããã¹ãã®å³æ ¼ããç¶æ¿ãããã½ã¼ã¹æååèªä½ã«"use strict"ãã£ã¬ã¯ãã£ããããå ´åã«ã®ã¿ 峿 ¼ã¢ã¼ã ã«ãªãã¾ããjsfunction nonStrictContext() { eval?.(`with (Math) console.log(PI);`); } function strictContext() { "use strict"; eval?.(`with (Math) console.log(PI);`); } function strictContextStrictEval() { "use strict"; eval?.(`"use strict"; with (Math) console.log(PI);`); } nonStrictContext(); // Logs 3.141592653589793 strictContext(); // Logs 3.141592653589793 strictContextStrictEval(); // Uncaught SyntaxError: Strict mode code may not include a with statement䏿¹ãç´æ¥ eval ã¯ãå¼ã³åºãã³ã³ããã¹ãã®å³æ ¼ããç¶æ¿ãã¾ãã
jsfunction nonStrictContext() { eval(`with (Math) console.log(PI);`); } function strictContext() { "use strict"; eval(`with (Math) console.log(PI);`); } function strictContextStrictEval() { "use strict"; eval(`"use strict"; with (Math) console.log(PI);`); } nonStrictContext(); // Logs 3.141592653589793 strictContext(); // Uncaught SyntaxError: Strict mode code may not include a with statement strictContextStrictEval(); // Uncaught SyntaxError: Strict mode code may not include a with statement -
ããã½ã¼ã¹æååã峿 ¼ã¢ã¼ãã§è§£éããã¦ããªãå ´åã
varã§å®£è¨ããã夿°ã¨ 颿°å®£è¨ ã¯å¨å²ã®ã¹ã³ã¼ãã«å ¥ã£ã¦ãã¾ãã¾ãã峿 ¼ã¢ã¼ãã®ã³ã³ããã¹ãã§ã®ç´æ¥ eval ã§ãã£ãå ´åãã¾ãã¯evalã®ã½ã¼ã¹æååèªä½ã峿 ¼ã¢ã¼ãã§ãã£ãå ´åãvarã¨é¢æ°å®£è¨ã¯å¨å²ã®ã¹ã³ã¼ãã«ãæ¼ããããã¨ã¯ããã¾ãããjs// ã³ã³ããã¹ããã½ã¼ã¹æååã峿 ¼ã¢ã¼ãã§ã¯ãªãããã var ã¯å¨å²ã®ã¹ã³ã¼ãã§å¤æ°ã使ãã¾ãã eval("var a = 1;"); console.log(a); // 1 // ã³ã³ããã¹ãã¯å³æ ¼ã§ã¯ããã¾ãããã eval ã®ã½ã¼ã¹ã¯å³æ ¼ãªã®ã§ã b ã¯è©ä¾¡ãããã¹ã¯ãªããã«ã¹ã³ã¼ãããã¾ãã eval("'use strict'; var b = 1;"); console.log(b); // ReferenceError: b is not defined function strictContext() { "use strict"; // ã³ã³ããã¹ãã¯å³æ ¼ã§ãããããã¯éæ¥çãªãã®ã§ãæååã¯å³æ ¼ã§ã¯ããã¾ããã eval?.("var c = 1;"); // å³å¯ãªã³ã³ããã¹ãã§ã®ãã£ã¬ã¯ãã£ã eval ãªã®ã§ã d ã¯ã¹ã³ã¼ãããã¾ãã eval("var d = 1;"); } strictContext(); console.log(c); // 1 console.log(d); // ReferenceError: d is not definedè©ä¾¡ãããæååå ã®
letããã³const宣è¨ã¯ã常ã«ãã®ã¹ã¯ãªããã«ã¹ã³ã¼ãããã¾ãã -
ãã£ã¬ã¯ãã£ã eval ã¯è¿½å ã®ã³ã³ããã¹ãå¼ã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ããä¾ãã°ã颿°ã®æ¬ä½ã§
new.targetã使ç¨ãããã¨ãã§ãã¾ããjsfunction Ctor() { eval("console.log(new.target)"); } new Ctor(); // [Function: Ctor]
ç´æ¥ eval() ã使ããªãã§ãã ãã!
ç´æ¥ eval() ã¯ããã¤ãã®åé¡ãå¼ãèµ·ããã¾ãã
eval()ã¯å¼ã³åºãå ã®æ¨©éã§æ¸¡ãããã³ã¼ããå®è¡ãã¾ããæªæã®ãã第ä¸è ã«å½±é¿ãåããå¯è½æ§ã®ããæååã§eval()ãå®è¡ããã¨ããã®ã¦ã§ããã¼ã¸ãæ¡å¼µæ©è½ã®æ¨©éã«ããã¦ãã¦ã¼ã¶ã¼ã®ãã·ã³ä¸ã§æªæã®ããã³ã¼ããå®è¡ãã¦ãã¾ãå¯è½æ§ãããã¾ããããã«éè¦ãªãã¨ã«ããµã¼ããã¼ãã£ã®ã³ã¼ããeval()ãï¼ç´æ¥ eval ã§ããã°ï¼å¼ã³åºãããã¹ã³ã¼ããè¦ããã¨ãã§ãããããæ»æè ããã¼ã«ã«å¤æ°ãèªã¿åã£ãã夿´ããããããã¨ãã§ãã¦ãã¾ãã¾ãã- ç¾ä»£ã® JavaScript ã§ã¯å¤ãã®æ§é ã JS ã¨ã³ã¸ã³ã«ãã£ã¦æé©åããã¦ããããã
eval()ã¯ä»ã®æ¹æ³ãããä½éã§ãã - ç¾ä»£ã® JavaScript ã¤ã³ã¿ã¼ããªã¿ã¼ã¯ JavaScript ãæ©æ¢°èªã«å¤æãã¾ããããã¯ã夿°ã®ååã®æ¦å¿µããã¹ã¦æ¶æ»
ãããã¨ãæå³ãã¾ãããããã£ã¦ã
eval()ã使ç¨ããã¨ããã©ã¦ã¶ã¼ã¯é·ãé«ä¾¡ãªå¤æ°åæ¤ç´¢ãå®è¡ãã¦ã夿°ãæ©æ¢°èªã®ã©ãã«åå¨ãã¦ããããææ¡ãããã®å¤ãè¨å®ãã¾ããããã«ãeval()ã夿°ã®åã®å¤æ´ãªã©ããã®å¤æ°ã«æ°ãã夿°ãããããå¯è½æ§ããããçæããããã¹ã¦ã®æ©æ¢°èªãåè©ä¾¡ãã¦è£æ£ãããããå¯è½æ§ãããã¾ãã - ã¹ã³ã¼ãã
eval()ã«ãã£ã¦æ¨ç§»çã«ä¾åããã¦ããå ´åããããã¡ã¤ã¤ã¼ã¯ããåãããããã¾ããããããªãã¨eval()ã¯å®è¡æã«æ£ãã夿°ãèªã¿è¾¼ããã¨ãã§ããªãããã§ãã
eval() ãé¢é£ã®ã¡ã½ããã使ç¨ãããã¨ã§ãæé©åããããå®å
¨ã«é¿ãããã¨ãã§ããç¨éã¯ããããããã¾ãã
鿥 eval() ã®ä½¿ç¨
ãã®ã³ã¼ããèãã¦ã¿ã¦ãã ããã
function looseJsonParse(obj) {
return eval(`(${obj})`);
}
console.log(looseJsonParse("{ a: 4 - 1, b: function () {}, c: new Map() }"));
鿥 eval ã使ç¨ãã¦å³æ ¼ã¢ã¼ããå¼·å¶ããã ãã§ãã³ã¼ãã¯ãã£ã¨è¯ããªãã¾ãã
function looseJsonParse(obj) {
return eval?.(`"use strict";(${obj})`);
}
console.log(looseJsonParse("{ a: 4 - 1, b: function () {}, c: new Map() }"));
ä¸è¨ã® 2 ã¤ã®ã³ã¼ãã¹ããããã¯åãããã«åä½ããããã«è¦ããããããã¾ããããããã§ã¯ããã¾ãããåè ã¯ç´æ¥ç eval ã使ç¨ãã¦ããã®ã§ãè¤æ°ã®åé¡ãçºçãã¾ãã
-
ããå¤ãã®ç¯å²ãæ¤æ»ãããããéå¸¸ã«æéããããã¾ããè©ä¾¡ãããæååä¸ã®
c: new Map()ã«æ³¨ç®ãã¦ãã ããã鿥ç eval ã®ãã¼ã¸ã§ã³ã§ã¯ããªãã¸ã§ã¯ãã¯ã°ãã¼ãã«ã¹ã³ã¼ãã§è©ä¾¡ãããã®ã§ãã¤ã³ã¿ã¼ããªã¿ã¼ã¯MapãMapã¨ããååã®ãã¼ã«ã«å¤æ°ã§ã¯ãªããã°ãã¼ãã«ãªMap()ã³ã³ã¹ãã©ã¯ã¿ã¼ãåç §ãã¦ããã¨ã¿ãªããã¾ããããããç´æ¥ç eval ã使ç¨ããã³ã¼ãã§ã¯ãã¤ã³ã¿ã¼ããªã¿ã¼ã¯ãããæ³å®ãããã¨ãã§ãã¾ãããä¾ãã°ã次ã®ä¾ã§ã¯ãè©ä¾¡ãããæååã®Mapã¯window.Map()ãåç §ãã¾ãããjsfunction looseJsonParse(obj) { class Map {} return eval(`(${obj})`); } console.log(looseJsonParse(`{ a: 4 - 1, b: function () {}, c: new Map() }`));ãããã£ã¦ããã®
eval()ãã¼ã¸ã§ã³ã§ã¯ããã©ã¦ã¶ã¼ã¯é«ä¾¡ãªã«ãã¯ã¢ããå¼ã³åºããè¡ããMap()ã¨ãããã¼ã«ã«å¤æ°ããããã©ããã確èªãã¾ãã -
峿 ¼ã¢ã¼ãã使ç¨ãã¦ããªãå ´åã
eval()ã½ã¼ã¹å ã®var宣è¨ã¯å¨å²ã®ã¹ã³ã¼ãã®å¤æ°ã«ãªãã¾ããããã¯ãæååãå¤é¨å ¥åããåå¾ãããå ´åãç¹ã«åãååã®æ¢åã®å¤æ°ãããå ´åã«ããããã°ãã«ãã課é¡ã«ã¤ãªããã¾ãã -
ç´æ¥ç eval ã¯ãå¨å²ã®ã¹ã³ã¼ãã®ãã¤ã³ãã£ã³ã°ãèªã¿è¾¼ãã ãã夿´ããããããã¨ãã§ãã¾ãã
-
ç´æ¥ç
evalã使ç¨ããå ´åãç¹ã« eval ã½ã¼ã¹ã峿 ¼ã¢ã¼ãã§ãããã¨ã証æã§ããªãå ´åãeval()ã½ã¼ã¹ã¯ãã®å¨å²ã®ã¹ã³ã¼ãå ã®ä»»æã®å¤æ°åã«ä¾åãããã¨ãã§ãããããã¨ã³ã¸ã³ï¼ããã³ãã«ããã¼ã«ï¼ã¯ã¤ã³ã©ã¤ã³åã«é¢é£ãããã¹ã¦ã®æé©åãç¡å¹ã«ããªããã°ãªãã¾ããã
ãããã鿥ç㪠eval() ã使ç¨ããã¨ãè©ä¾¡ãããã½ã¼ã¹ãèªã¿è¾¼ãæ¢åã®ã°ãã¼ãã«å¤æ°ä»¥å¤ã®è¿½å ã®ãã¤ã³ãã£ã³ã°ã渡ããã¨ãã§ãã¾ãããè©ä¾¡ãããã½ã¼ã¹ãã¢ã¯ã»ã¹ãã¹ã追å ã®å¤æ°ãæå®ããå¿
è¦ãããå ´åã¯ãã³ã³ã¹ãã©ã¯ã¿ã¼ Function() ã使ç¨ãããã¨ãæ¤è¨ãã¦ãã ããã
Function() ã³ã³ã¹ãã©ã¯ã¿ã¼ã®ä½¿ç¨
Function() ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ãä¸è¨ã®éæ¥ç eval ã®ä¾ã¨ã¨ã¦ãããä¼¼ã¦ãã¾ããã°ãã¼ãã«ã¹ã³ã¼ãã§æ¸¡ããã JavaScript ã½ã¼ã¹ãããã¼ã«ã«ãã¤ã³ãã£ã³ã°ãèªã¿è¾¼ãã ã夿´ããããããã¨ãªãè©ä¾¡ããã®ã§ãã¨ã³ã¸ã³ã¯ç´æ¥ eval() ãå®è¡ãããããå¤ãã®æé©åãå®è¡ãããã¨ãã§ãã¾ãã
eval() 㨠Function()ã®ç°ãªãç¹ã¯ãFunction()ã«æ¸¡ãããæååã¯ã¹ã¯ãªããã¨ãã¦ã§ã¯ãªãã颿°æ¬ä½ã¨ãã¦è§£éã§ããã¨ãããã¨ã§ããä¾ãã°ã颿°æ¬ä½ã®æä¸ä½ã§ã¯ return æã使ç¨ãããã¨ãã§ãã¾ãããã¹ã¯ãªããã®ä¸ã§ã¯ä½¿ç¨ã§ãã¾ããã
Function() ã³ã³ã¹ãã©ã¯ã¿ã¼ã¯ã夿°ã弿°ã¨ãã¦æ¸¡ã㦠eval ã½ã¼ã¹å
ã§ãã¼ã«ã«ãã¤ã³ãã£ã³ã°ã使ãããå ´åã«æçã§ãã
function add(a, b) {
return a + b;
}
function runCodeWithAddFunction(obj) {
return Function("add", `"use strict";return (${obj});`)(add);
}
console.log(runCodeWithAddFunction("add(5, 7)")); // 12
eval() 㨠Function() ã¯ã©ã¡ããæé»çã«ä»»æã®ã³ã¼ããè©ä¾¡ããã®ã§ã峿 ¼ãª CSP è¨å®ã§ã¯ç¦æ¢ããã¦ãã¾ããã¾ããä¸è¬çãªç¨éã§ã¯ eval() ã Function() ã«ä»£ãããããå®å
¨ãªï¼ããã¦ãããé«éãªï¼æ¹æ³ãä»ã«ãããã¾ãã
ãã©ã±ããã¢ã¯ã»ãµã¼ã®ä½¿ç¨
ããããã£åããããããã£èªä½ã¸ã®å¤æãè¡ãããã« eval() ã使ç¨ããªãã§ãã ãããã¢ã¯ã»ã¹ããããªãã¸ã§ã¯ãã®ããããã£ãã³ã¼ããå®è¡ãããã¾ã§ããããªãå ´åã®ä¾ãèãã¦ã¿ã¾ãããããã㯠eval() ã§è¡ããã¨ãã§ãã¾ãã
const obj = { a: 20, b: 30 };
const propName = getPropName(); // returns "a" or "b"
const result = eval(`obj.${propName}`);
ãã ããããã§ eval() ã¯å¿
è¦ããã¾ãããå®éããã®ä½¿ãæ¹ã¯ãå§ãã§ãã¾ããããªããªã propName ãæå¹ãªèå¥åã§ãªãã¨æ§æã¨ã©ã¼ã«ãªãããã§ããããã«ã getPropName ãå¶å¾¡ãã颿°ã§ãªãå ´åãä»»æã®ã³ã¼ããå®è¡ãã¦ãã¾ãå¯è½æ§ãããã¾ãã代ããã«ããããã£ã¢ã¯ã»ãµã¼ã使ç¨ããã»ãããããéãã¦å®å
¨ã§ãã
const obj = { a: 20, b: 30 };
const propName = getPropName(); // "a" ã¾ã㯠"b" ãè¿ããã
const result = obj[propName]; // obj[ "a" ] 㯠obj.a ã¨åã
ãã®ã¡ã½ããã使ç¨ãã¦åå«ããããã£ã«ã¢ã¯ã»ã¹ãããã¨ãã§ãã¾ããeval() ã使ãã¨ä»¥ä¸ã®ããã«ãªãã¾ãã
const obj = { a: { b: { c: 0 } } };
const propPath = getPropPath(); // "a.b.c" ãªã©ãè¿ã
const result = eval(`obj.${propPath}`); // 0
ããã§ eval() ãåé¿ããã«ã¯ãããããã£ã®ãã¹ãåå²ããæ§ã
ãªããããã£ãã«ã¼ããããã¨ã§è¡ããã¨ãã§ãã¾ãã
function getDescendantProp(obj, desc) {
const arr = desc.split(".");
while (arr.length) {
obj = obj[arr.shift()];
}
return obj;
}
const obj = { a: { b: { c: 0 } } };
const propPath = getPropPath(); // "a.b.c" ãªã©ãè¿ã
const result = getDescendantProp(obj, propPath);
ããããã£ã®è¨å®ãåæ§ã«è¡ããã¨ãã§ãã¾ãã
function setDescendantProp(obj, desc, value) {
const arr = desc.split(".");
while (arr.length > 1) {
obj = obj[arr.shift()];
}
return (obj[arr[0]] = value);
}
const obj = { a: { b: { c: 0 } } };
const propPath = getPropPath(); // "a.b.c" ãªã©ãè¿ã
const result = setDescendantProp(obj, propPath, 1); // obj.a.b.c 㯠1 ã«ãªã
ããããå¶ç´ã®ãªãå ¥åã§ãã©ã±ããã¢ã¯ã»ããµã使ç¨ãããã¨ãå®å ¨ã§ã¯ããã¾ããããªãã¸ã§ã¯ãã¤ã³ã¸ã§ã¯ã·ã§ã³æ»æã許ãå¯è½æ§ãããã¾ãã
ã³ã¼ã«ããã¯ã®ä½¿ç¨
JavaScript 第ä¸ç´é¢æ°ãåãã¦ããã颿°ãä»ã® API ã®å¼æ°ã¨ãããã夿°ããªãã¸ã§ã¯ãã®ããããã£ã«ä¿åããããããã¨ãã§ãã¾ããå¤ãã® DOM API ã¯ãããèæ ®ãã¦ä½ããã¦ããã®ã§ã次ã®ããã«æ¸ããã¨ãã§ãã¾ãï¼ã¾ããæ¸ãã¹ãã§ãï¼ã
// setTimeout(" ... ", 1000) ã使ã代ããã«
setTimeout(() => {
// â¦
}, 1000);
// elt.setAttribute("onclick", "â¦") ã使ã代ããã«
elt.addEventListener("click", () => {
// â¦
});
æååãé£çµããã«ãã©ã¡ã¼ã¿ã¼åãã颿°ã使ããæ¹æ³ã¨ãã¦ã¯ãã¯ãã¼ã¸ã£ãä½¿ãæ¹æ³ã便å©ã§ãã
JSON ã®ä½¿ç¨
eval() ã®å¼ã³åºãã«ä½¿ããã¨ãã¦ããæååãã³ã¼ãã§ã¯ãªããã¼ã¿ï¼ä¾ãã° "[1, 2, 3]" ã§é
åã表ãï¼ãå«ããã®ã§ããã°ãJSON ã«åãæ¿ãããã¨ãæ¤è¨ãã¦ãã ããããã㯠JavaScript ã®ãµãã»ããã使ç¨ãããã¨ã§ãæååã§ãã¼ã¿ã表ç¾ãããã¨ãã§ãã¾ãã
JSON ã®æ§æã¯ JavaScript ã®æ§æã«æ¯ã¹ã¦å¶éããããå¤ãã®æå¹ãª JavaScript ãªãã©ã«ã JSON ã¨ãã¦ã¯è§£éãããªããã¨ã«æ³¨æãã¦ãã ãããä¾ãã°ãæå¾ã«ã«ã³ããä»ãããã¨ã¯ JSON ã§ã¯è¨±ããã¦ãããããªãã¸ã§ã¯ããªãã©ã«å ã®ããããã£åï¼ãã¼ï¼ã¯å¼ç¨ç¬¦ã§å²ãå¿ è¦ãããã¾ããå¾ã§ JSON ã¨ãã¦è§£æãããæååãçæããã«ã¯ãJSON ã·ãªã¢ã©ã¤ã¶ã¼ã使ãããã«ãã¦ãã ããã
ä»»æã®ã³ã¼ãã§ã¯ãªããæ³¨ææ·±ãå¶ç´ããããã¼ã¿ã渡ããã¨ã¯ãä¸è¬çã«ããèãã§ããä¾ãã°ãã¦ã§ããã¼ã¸ã®å 容ãåå¾ã§ããããè¨è¨ãããæ¡å¼µã§ããã°ãJavaScript ã³ã¼ãã®ä»£ããã« XPath ã使ã£ã¦åå¾ã«ã¼ã«ãå®ç¾©ã§ãã¾ãã
ä¾
>eval() ã®ä½¿ç¨
次ã®ã³ã¼ãã§ã¯ãeval() ãå«ãã©ã¡ãã®æã 42 ãè¿ãã¾ããæåã®ã³ã¼ãã¯æåå "x + y + 1" ãè©ä¾¡ãã¾ãã2 çªç®ã®ã³ã¼ãã¯æåå "42" ãè©ä¾¡ãã¾ãã
const x = 2;
const y = 39;
const z = "42";
eval("x + y + 1"); // 42
eval(z); // 42
è©ä¾¡ãããæå¾ã®å¼ã«ã¤ãã¦
eval() ã¯æå¾ã«è©ä¾¡ãããå¼ã®å¤ãè¿ãã¾ãã if ã«ã¤ãã¦ã¯ãè©ä¾¡ãããæå¾ã®å¼ã¾ãã¯æã«ãªãã¾ãã
const str = "if (a) { 1 + 1 } else { 1 + 2 }";
let a = true;
let b = eval(str);
console.log(`b is: ${b}`); // b is: 2
a = false;
b = eval(str);
console.log(`b is: ${b}`); // b is: 3
次ã®ä¾ã§ã¯ eval() ã使ç¨ãã¦æåå str ãè©ä¾¡ãã¦ãã¾ãããã®æååã¯ãx ã 5 ã§ããã° z ã« 42 ã¨ããå¤ãå²ãå½ã¦ããããã§ãªããã° z ã« 0 ã代å
¥ããã¨ãã JavaScript ã®æã§æ§æããã¦ãã¾ãã 2 ã¤ç®ã®æãå®è¡ãããã¨ã eval() ã¯ãããã®æãçºçãããæã®éåãè©ä¾¡ã㦠z ã«ä»£å
¥ãããå¤ãè¿ãã¾ãã
const x = 5;
const str = `if (x === 5) {
console.log("z is 42");
z = 42;
} else {
z = 0;
}`;
console.log("z is ", eval(str)); // z is 42 z is 42
è¤æ°ã®å¤ãå²ãå½ã¦ãå ´åã¯ãæå¾ã®å¤ãè¿ãã¾ãã
let x = 5;
const str = `if (x === 5) {
console.log("z is 42");
z = 42;
x = 420;
} else {
z = 0;
}`;
console.log("x is", eval(str)); // z is 42 x is 420
颿°å®ç¾©ã®æååã® eval ã«ã¯å
é ã¨æ«å°¾ã« "(" 㨠")" ãå¿
è¦
// 颿°å®£è¨
const fctStr1 = "function a() {}";
// 颿°å®£è¨
const fctStr2 = "(function b() {})";
const fct1 = eval(fctStr1); // undefined ãè¿ãã¾ãããã°ãã¼ãã«é¢æ°ã¨ã㦠`a` ã使ããããã«ãªã
const fct2 = eval(fctStr2); // 颿° `b` ãè¿ã
仿§æ¸
| 仿§æ¸ |
|---|
| ECMAScript® 2027 Language Specification > # sec-eval-x > |