1人ã®åäŸããã¹ãŠãJavaScriptã§èšè¿°ããã¯ã©ã€ã¢ã³ããšãµãŒããŒã¯ã䟿å©ã§èªã¿ããããšèšã£ãã ãã®åŸã圌ã¯ãã¡ããããŒããŒã«é£ããŠè¡ãããŸããã
-ã€ã³ã¿ãŒããããã
ãªãã§ïŒ èå³æ·±ãããš-ââJavaScriptã ææ°ã®Webããã³ããã³ããšã³ãã®åºç€ã«ã¯ã代æ¿æ段ããããŸããã
JavaScriptã¯ããšããããããã§èª¬æããæšæºã©ã€ãã©ãªã§ãã æšæºã©ã€ãã©ãªãšã¯ãããã°ã©ããŒåŽã®äžå¿ èŠãªã¢ã¯ã·ã§ã³ããªãããã©ãããã©ãŒã åºæã®APIãå«ãŸãªããä»»æã®ãã©ãããã©ãŒã äžã«ååšããã¢ãžã¥ãŒã«ãã³ã³ã¹ãã©ã¯ã¿ãŒãã¡ãœãããæå³ããŸãã JavaScriptã§ã¯ãªããããã«ã³ã³ãã€ã«ãããèšèªã§èšè¿°ããå Žåã§ããã»ãšãã©ã®å Žåããã®æšæºã©ã€ãã©ãªãåŠçããå¿ èŠããããŸãã
äžè¬ã«ãVanilla JavaScriptæšæºã©ã€ãã©ãªã¯åªããŠããŸãã ããã¯ãçŸè¡ããŒãžã§ã³ã®ECMA-262èšèªä»æ§ïŒ3ãããã©ãã6ïŒã«åºã¥ãæšæºã©ã€ãã©ãªã ãã§ã¯ãããŸãããAPIã®äžéšã¯ãECMA-402åœéåAPIãªã©ã®åå¥ã®ä»æ§ã«é 眮ãããŸãã
setTimeout
ãªã©ãJavaScriptãæ³åããããæ©èœã®å€ãã¯ãWebæšæºã«é¢é£ããŠããŸãã ã³ã³ãœãŒã«ã¯ãŸã£ããæšæºåãããŠããŸãããäºå®äžã®æšæºã«äŸåããå¿ èŠããããŸãã
ããããããã¯ããã»ã©æšæºçã§ã¯ãªããã©ãã§ãç°ãªããŸãã å€ãIEã«ã¯ã
Array#forEach, Function#bind, Object.create
ãããã³ã³ã³ãœãŒã«ããªããŠãã90幎ã®æšæºES3ã©ã€ãã©ãªãããã«å©çšã§ããŸããããšãã°ãå€ãã®äººããã§ã«å°æ¥ãæ倧éã«æŽ»çšããŠããNode.jsããããŸãES6ã
ãµãŒããŒãšãã©ãŠã¶ã®äž¡æ¹ã§ãå¯èœãªéãææ°ã§ãããå¿ èŠãªæ©èœãå®è£ ããŠããããããŸã§ã®ãšããæšæºåãããŠããªãããŠãããŒãµã«ã§çã«æšæºçãªã©ã€ãã©ãªãå¿ èŠã§ãã ãã®èšäºã¯core.jsã©ã€ãã©ãªãŒã«é¢ãããã®ã§ãæšæºçãªJavaScriptã©ã€ãã©ãªãŒã«é¢ããç§ã®èããå®è£ ããŠããŸãã ããã«ããã®èšäºã¯ãææ°ã®æšæºåãããæšæºJavaScriptã©ã€ãã©ãªãŒã«é¢ããããŒãã·ãŒãã§ããããã®å±æã«ã€ããŠã®ã¡ã¢ã§ããããŸãã
ã³ã³ãã³ãããŸãã¯åºåã§åŸããããã®ïŒ
ã¢ãããŒã
ããŒã1ïŒæŸèæ
- ECMAScript 5
- ECMAScript 6
- ECMAScript 6ïŒã·ã³ãã«
- ECMAScript 6ïŒã³ã¬ã¯ã·ã§ã³
- ECMAScript 6ïŒã€ãã¬ãŒã¿ãŒ
- ECMAScript 6ïŒçŽæ
- Mozilla JavaScriptïŒé åã¡ãœããã®éçããŒãžã§ã³
- é 延å®è¡ïŒsetTimeoutãsetIntervalãsetImmediate
- ã³ã³ãœãŒã«
ããŒã2ïŒèªè»¢è»
- ããŒã¿åé¡
- èŸæž
- éšåé©çš
- æ¥ä»ã®ãã©ãŒããã
- ãªããžã§ã¯ãAPI
- é å
- æ°å
- ç¹æ®æåã®ãšã¹ã±ãŒã
ãããã«
èŠåããŸãããã«ãããã¯ãšæåã®ç« ã¯éåžžã«ãããµãããã®ã§ãããã¹ãŠãèªã¿ãããšãã欲æ±ã¯ãããŸãã-äžèšã®ç®æ¬¡ãèå³ã®ããã»ã¯ã·ã§ã³ãŸã§ã¹ã¯ããŒã«ããŠãã ããã
ïŒã¢ãããŒã
JavaScriptã§ã©ã€ãã©ãªãäœæããã«ã¯ãæšæºãšåŒã°ãã3ã€ã®äž»ãªã¢ãããŒãããããŸãã
æåã®ãã®ã¯ããªãã£ãŒã«ã®ã¿ã®äœ¿çšãæšæºåãããæ©èœã®ã¿ã§ãã æéãšãšãã«APIãå£ããªããšããå ·äœçãªä¿¡å¿µã ãã®ãããªã©ã€ãã©ãªã䜿çšããã«ã¯ããã®ç¥èã¯å¿ èŠãããŸããã察å¿ããAPIèšèªã®ç¥èã®ã¿ãå¿ èŠã§ãã äžè¬çã«ãããªãã£ã«ã¯1ã€ã®æšæºãŸãã¯ãã®äžéšã«éå®ãããŸãã ããšãã°ã es5-shimãŸãã¯es6-shim ã ãã®ãããããã©ã«ãã§å¿ èŠãªæ©èœãæäŸããã«ã¯ãè€æ°ã®ããªãã£ã«ãæ¥ç¶ããå¿ èŠããããŸãã å éšã³ã³ããŒãã³ãã¯çžäºã«è€è£œããããšãå€ãããããã®ã»ããã¯æ°çŸãããã€ãã«éããããšããããããŸãã ãããŠãç§ãæã¡ãããã¹ãŠã®æ©èœãæšæºåãããŠããããã§ã¯ãããŸããã ä»ã®ã©ã€ãã©ãªãšç«¶åããå¯èœæ§ã¯ç¡èŠã§ããŸãããã©ã€ãã©ãªãäœæãããšãã«äŸåé¢ä¿ãšããŠãããã䜿çšããããšã¯ãããŸããã
2ã€ç®ã¯ã ç¬èªã®åå空éã«ãããŠãŒãã£ãªãã£ã®ã»ããã§ã ã ã¢ãžã¥ã©ãŒã·ã¹ãã ã«ãšã¯ã¹ããŒããããã1ã€ã®ã°ããŒãã«ãªããžã§ã¯ããäœæããŸãã ããšãã°ã UndescoreãŸãã¯ãã®LoDashã®ãã©ãŒã¯ã éåžžãããã¯éåžžã«ã³ã³ãã¯ãã§ãããå¯èœæ§ã¯äžé£ã®åçŽãªãŠãŒãã£ãªãã£ã«ãã£ãŠå¶éãããŸãã ãã€ãã£ããªããžã§ã¯ããæ¡åŒµãããå€æŽãããŒã«ããã¯ãã
noConflict
ã¡ãœããããã°ãã°ååšãããããä»ã®ã©ã€ãã©ãªãšã®ç«¶åã®å¯èœæ§ã¯æå°éã§ããä»ã®ã©ã€ãã©ãªã®å®å šãªäŸåé¢ä¿ãšããŠããã§èª¬æããä»ã®ã¡ãœãããããåªããŠããŸãã
3ã€ç®ã¯ã æšæºåãããæ©èœã ãã§ãªãããã€ãã£ããªããžã§ã¯ãã®æ¡åŒµã§ã ã ããšãã°ãç¬èªã®ã¡ãœããããããã¿ã€ãé åã«è¿œå ãããšãéåžžãé¢æ°ã«é åãæž¡ãããã䟿å©ã§ãã ä»ããã®ã«ããŽãªã§ã¯ã Sugarã«ãŒã«ãã ãããŠ-MooToolsãšPrototypeã«ãªããŸãã å€ãã®äŸ¿å©ãªæ©èœãè¿œå ãããŸãããå€ãã®å Žåãã¡ãœããã¯äºãã«ã»ãŒå®å šã«è€è£œãããŸãã å€çžæ§ã¯ããã§å±éããå¿ èŠããããŸã-ããããå€çžæ§ã®å Žåããã®ãããªã©ã€ãã©ãªã¯éåžžãé åã®ãããã¿ã€ãã¡ãœããã
Function#bind
ãããã³ä»ã®ããã€ãã«å¶éãããã»ãšãã©ã®æšæºãç¡èŠããŸãã çŽäºã«é¢ããŠã¯ãããã§ã¯ãã¹ãŠãéåžžã«æªãã§ãã ãã®ãããªã©ã€ãã©ãªã¯ãå€ãã®å Žåãåãååã§ç°ãªãã·ã°ããã£ãæã€ã¡ãœããã䜿çšããŠãã€ãã£ããªããžã§ã¯ããæ¡åŒµããŸãã 競åãé¿ããããã«ãæçµã¢ããªã±ãŒã·ã§ã³ãéçºãããšãã¯ãããªãã¡ã€ã«ãã«ãŠã³ãããã«ãã€ãã£ããªããžã§ã¯ããå±éããè€æ°ã®ã©ã€ãã©ãªã䜿çšããªãã§ãã ããããŸããã©ã€ãã©ãªãèšè¿°ãããšãããã®ãããªäŸåé¢ä¿ã¯äžè¬ã«åãå ¥ããããŸããã
1ã€ã®æ±çšæšæºã©ã€ãã©ãªã®ä»£ããã«ãäžå¿ èŠãªãã©ãã«ãªãã§åžæããæ©äŒãæäŸããããã«ã Undescore / LoDash / Sugar + es5-shimães6-shimães6-symbolãsetImmediate.js / asapãMoment.jsããå¯ãéããåŒãåºãå¿ èŠããããŸã/ Intl.jsãã³ã³ãœãŒã«ãã㌠...ãªã©ã
ïŒãããã®ã¢ãããŒãã®ãããããããã¹ããåããŸãããã core.jsã®æŠå¿µã¯æ¬¡ã®ãšããã§ãã
- æšæºã©ã€ãã©ãªã«ã¯ãç¹å®ã®ãã©ãããã©ãŒã ã®APIãæäœããæ©èœãå«ããå¿«é©ãªäœæ¥ã«å¿ èŠãªæå°éã®ãã®ããã¹ãŠå«ãŸããŠããå¿ èŠããããŸãã
- æšæºã¯ç§ãã¡ã®ãã¹ãŠã§ãã ã©ã€ãã©ãªã®äž»èŠãªéšåã¯ã芪åã§ãã å¿ èŠãªæ©èœããã¹ãŠæšæºåãããŠããããã§ã¯ãããŸããã
- ã·ã¹ãã ã§äœ¿çšå¯èœãªæ©èœãä»æ§ãŸãã¯äºå®äžã®æšæºã«åŸã£ãŠå®è£ ãããŠããå Žåããã€ãã£ãã®ãŸãŸã«ããŸãããæ©èœãæšæºåãããŠããªãå Žåãå°æ¥ã®ç«¶åãé¿ããããã«åŒ·å¶çã«çœ®ãæããŸãã
- ã©ã€ãã©ãªã¯ã³ã³ãã¯ãã§ååã«å§çž®ããå¿ èŠããããŸãã
- ã¢ãžã¥ãŒã«æ§ãå¿ èŠãªæ©èœã®ã¿ãçµã¿ç«ãŠãæ©èœã
- æçµçãªã¢ããªã±ãŒã·ã§ã³ãäœæããŸã-ããªãã¯çã§ãããç¥ã§ããããã€ãã£ããªããžã§ã¯ããå±éããã©ã€ãã©ãªã䜿çšãããã¹ãŠã®æš©å©ãæã£ãŠããŸãã äž»ãªããšã¯ã1ã€ã®ã©ã€ãã©ãªã ãããããè¡ããšããããšã§ãã
- ã©ã€ãã©ãªãŸãã¯npmã¢ãžã¥ãŒã«ãäœæããŸã-ãã€ãã£ããªããžã§ã¯ããå±éããã©ã€ãã©ãªã䜿çšããããšã¯ã§ããŸããã æçµã¢ããªã±ãŒã·ã§ã³ãäœæããããã°ã©ããŒã®ç«¶åãéåœã¥ãããªã¹ã¯ã ãã®å Žåãæ¡åŒµããã«çµã¿ç«ãŠãããå¯èœæ§ããããŸãã
ïŒéåžžã®ãã«ãã®å Žåã core.jsã®æäœã¯éåžžã«æçœã§ãã
console.log(Array.from(new Set([1, 2, 3, 2, 1]))); // => [1, 2, 3] console.log('*'.repeat(10)); // => '**********' Promise.resolve(32).then(console.log); // => 32 setImmediate(console.log, 42); // => 42
ïŒãã€ãã£ããªããžã§ã¯ããæ¡åŒµããªãã¢ã»ã³ããªã®å Žåãæ©èœã¯ã°ããŒãã«
core
ãªããžã§ã¯ããŸãã¯ã¢ãžã¥ã©ãŒã·ã¹ãã ã«ãšã¯ã¹ããŒããããŸãã ããšãã°ã
Promise
ã³ã³ã¹ãã©ã¯ã¿ãŒã¯
core.Promise
ãšããŠäœ¿çšã§ãã
Array.from
ã¡ãœããã¯
core.Array.from
ãšããŠ
Array.from
ã ã©ã€ãã©ãªã®è¿œå ã§ã¯ãªããæ¢åã®ãããã¿ã€ãã«è¿œå ããããšãç®çãšããã¡ãœããã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒãéçã«ãªããŸããããšãã°ã
core.String.repeat
ã¯
String.prototype.repeat
ã¡ãœããã®éçããŒãžã§ã³ã§ãã
var log = core.console.log; log(core.Array.from(new core.Set([1, 2, 3, 2, 1]))); // => [1, 2, 3] log(core.String.repeat('*', 10)); // => '**********' core.Promise.resolve(32).then(log); // => 32 core.setImmediate(log, 42); // => 42
ããªãã£ã«ã®ã¿ãããããå«ãã¢ã»ã³ããªã¯ãããããè¿œå ããã ãã§ãã å®éãéåžžã®ã¢ã»ã³ããªã䜿çšããäŸã§ã¯ãããªãã£ã«ã®ã¿ã䜿çšãããŠããŸãã
ïŒ Node.jsãžã®ã€ã³ã¹ããŒã«ïŒ
npm i core-js
ã¢ã»ã³ããªã®1ã€ãæ¥ç¶ããŠã以äžããéžæã§ããŸãã
// : require('core-js'); // : var core = require('core-js/library'); // , : require('core-js/shim');
ãã©ãŠã¶çšã®ãã«ã ïŒ
- æå€§ïŒ éçº ã æ¬çª ïŒgzipãé€ã21.8 kbïŒ
- ãã€ãã£ããªããžã§ã¯ãã®æ¡åŒµãªãïŒ development ã production ïŒgzipãé€ã21.8 kbïŒ
- Polyphilesã®ã¿ïŒ éçº ã çç£ ïŒgzipãé€ã16.7 kbïŒ
ïŒãããã®ã¢ã»ã³ããªã®ãããã«ãæºè¶³ã§ããªãå Žåã¯ãç¬èªã®ã¢ã»ã³ããªãäœæã§ããŸãã ããšãã°ããã€ãã£ããªããžã§ã¯ããå±éããã«ãã³ã³ãœãŒã«ã¢ãžã¥ãŒã«ãšåçŽãªæ¥ä»åœ¢åŒã®ã¿ãå¿ èŠã§ãã ãããè¡ãã«ã¯ãNode.jsãã€ã³ã¹ããŒã«ããŸãããã®åŸãã¢ã»ã³ããªã«å¿ èŠãªäŸåé¢ä¿ãæã€grunt-cliãcore-jsãã€ã³ã¹ããŒã«ããã¢ã»ã³ãã«ããŸãã
npm i -g grunt-cli npm i core-js cd node_modules/core-js && npm i grunt build:date,console,library --path=custom uglify
ãã®çµæããã¡ã€ã«
custom.js
ã
custom.min.js
éé4.8kbããã³
custom.min.map
ãååŸããŸãã
library
ãã©ã°ã¯ããã€ãã£ããªããžã§ã¯ããå±éããã«ã¢ã»ã³ããªãæããŸãã ãã㧠ãå¿ èŠãªæ©èœãå±ããã¢ãžã¥ãŒã«ã確èªã§ããŸã ïŒæåŸã®åïŒã
ïŒããŒã1ïŒæŸèæ
誰ããç解ããŠããªãå ŽåãæŸèæã¯ãèšäºã®æèã§ã¯ãã©ã€ãã©ãªã§å©çšå¯èœãªæšæºåãããæ©èœã®å€æè ãæå³ããŸãã ããã§ã¯ãè¡ããŸãããïŒ
ïŒECMAScript 5
ãããã誰ããECMAScript 5ãæšæºã©ã€ãã©ãªã«è¿œå ãããã®ãç¥ã£ãŠããŸãã ES5ããµããŒãããŠããªãã»ãšãã©ãã¹ãŠã®ãã©ãŠã¶ãŒã¯æ¶æ» ããŸããã å€ãIEãé€ããŸãã ãããŸã§ã顧客ã¯IE8ã®ãµããŒããããããŠæãæ·±å»ãªå Žåã¯IE6ã®ãµããŒãããã°ãã°èŠæ±ããŸãã è¿ãå°æ¥ãç¶æ³ãå€ããããšãé¡ã£ãŠããŸãã æã人æ°ã®ããES5ã®èŠªåã¯ãã®es5-shim㧠ãããã€ãã®æ©èœã¯SugarãMooToolsãPrototypeã«ãããŸãããäžéšã®ã¿ã§ãã ããã¯ç®æ°ããããã¯ã»ã©é ãã®ã§ãäžå¿ èŠãªè©³çŽ°-ç°¡åãªèª¬æãšãå¿ èŠã«å¿ããŠããã€ãã®å®è£ æ©èœãªãã§è¡ãããšãã§ããŸãã ãã¡ãããã³ãŒããIE8-ããµããŒãããŠèšè¿°ãããŠããå Žåãèšè¿°åãæäœããããšã«çåã®äœå°ã¯ãªãããšãèŠããŠããããšãéèŠã§ãã
ïŒé åã¡ãœãã
ïŒé åã®ãããã¿ã€ãã¡ãœããããå§ããŸãããã ããã¯èª°ã«ã§ãããç¥ãããŠããŸãïŒ
é åïŒindexOfã¯ãæå®ãããå€ã«çããæåã®èŠçŽ ã®ã€ã³ããã¯ã¹ãè¿ããŸããå€ãèŠã€ãããªãå Žåã¯
-1
è¿ããŸãã
é åïŒlastIndexOfã¯åã®ãã®ãšäŒŒãŠããŸãããæåŸã®èŠçŽ ã®ã€ã³ããã¯ã¹ãè¿ããŸãã
é åïŒforEachã¯ãé åã®åèŠçŽ ã«å¯ŸããŠé¢æ°ãåŒã³åºããŸãã
ArrayïŒmapã¯ãæå®ãããé åã®åèŠçŽ ã«å¯Ÿããé¢æ°åŒã³åºãã®çµæãå«ãæ°ããé åãè¿ããŸãã
é åïŒãã£ã«ã¿ã¯ããã§ãã¯é¢æ°ã®æ¡ä»¶ãæºãããã®é åã®ãã¹ãŠã®èŠçŽ ãå«ãæ°ããé åãè¿ããŸãã
é åïŒeveryã¯ãé åå ã®ãã¹ãŠã®èŠçŽ ããã§ãã¯é¢æ°ã®æ¡ä»¶ãæºãããã©ããã確èªããŸãã
é åïŒsomeã¯ããã§ãã¯é¢æ°ã®æ¡ä»¶ãæºããé åã®èŠçŽ ãå°ãªããšã1ã€ãããã©ããã確èªããŸãã
ArrayïŒreduceã¯ãé¢æ°ã䜿çšããŠå·Šããå³ã«é åãç³ã¿èŸŒã¿ãŸãã
é åïŒreduceRightã¯ãé¢æ°ã䜿çšããŠé åãå³ããå·Šã«ç³ã¿èŸŒã¿ãŸãã
[1, 2, 3, 2, 1].indexOf(2); // => 1 [1, 2, 3, 2, 1].lastIndexOf(2); // => 3 [1, 2, 3].forEach(function(val, key){ console.log(val); // => 1, 2, 3 console.log(key); // => 0, 1, 2 }); [1, 2, 3].map(function(it){ return it * it; }); // => [1, 4, 9] [1, 2, 3].filter(function(it){ return it % 2; }); // => [1, 3] function isNum(it){ return typeof it == 'number'; } [1, '2', 3].every(isNum); // => false [1, '2', 3].some(isNum); // => true function add(a, b){ return a + b; } [1, 2, 3].reduce(add); // => 6 [1, 2, 3].reduceRight(add, ''); // => '321'
ãããã®ã¡ãœããã¯åºæ¬çã«å®è£ ãããŠããŸããã1ã€ã®æ©èœããããŸãã é åã¡ãœããã¯ãžã§ããªãã¯ã§ãããé åã ãã§ãªããé åã«äŒŒããªããžã§ã¯ãã®ã³ã³ããã¹ãã§åŒã³åºãããšãã§ããŸã ããã®è©³çŽ°ã«ã€ããŠã¯ã 以äžã§èª¬æããŸã ã ãã®ãããES5ä»æ§ã«ãããšãæååã¯é åã®ãããªãªããžã§ã¯ãã§ãããæååã®æåã¯ã€ã³ããã¯ã¹ã«ãã£ãŠååŸã§ããŸããããšãã°ã
'string'[2] // => 'r'
ã§ãããå€ãIEã§ã¯ããã§ã¯ãããŸããã ãããã®ã¡ãœãããæååã®ã³ã³ããã¹ãã§é©çšãããå Žåãæååãé åã«ãã£ã¹ãããŸãã åãåé¡ã解決ããã«ã¯ãå¿ èŠã«å¿ããŠãå€ãIEã®
Array#slice
ãš
Array#join
ã眮ãæããŸãã
Array.prototype.map.call('123', function(it){ return it * it; }); // => [1, 4, 9] Array.prototype.slice.call('qwe', 1); // => ['w', 'e'] Array.prototype.join.call('qwe', '|'); // => 'q|w|e'
ããŠãå€ä»£ã®çå®ãå¿ããªãã§ãã ãããfor
for-in
ã«ãŒãã§é åããã€ãã¹ããªã
for-in
ãã ãã ã ããã¯é ãã ãã§ãªããIE8-ãµããŒããå¿ èŠãªå ŽåãããŒãé©åã§ãããã©ããã確èªããããšã匷å¶ããŸã-ããã§ãªããã°ãé åã®èŠçŽ ã ãã§ãªãããã®ãããã¿ã€ãã®ã¡ãœããããã€ãã¹ããŸã:)
ïŒéçã¡ãœããArray.isArrayã¯åãã«ããŽãªã«å±ããŸãã ãã®ã¡ãœããã¯ããªããžã§ã¯ãããããã¿ã€ããã§ãŒã³ã§ã¯ãªããå éšã¯ã©ã¹ã«ããé åã§ãããã©ããããã§ãã¯ããŸãã 䟿å©ã§ãããæ®éçã§ã¯ãããŸããã ãªããžã§ã¯ãã®åé¡ã«ã€ããŠã¯ãèšäºã®ç¬¬2éšã§ããèªè»¢è»ã§è©³çŽ°ã«èª¬æããŸã ã
Array.isArray([1, 2, 3]); // => true Array.isArray(Object.create(Array.prototype)); // => false
ïŒãªããžã§ã¯ãAPI
ECMAScript 3ã«åºã¥ããã¹ãŠã®ECMAScript 5ãªããžã§ã¯ãAPIã¡ãœããã®å®å šãªãšãã¥ã¬ãŒã·ã§ã³ã¯äžå¯èœã§ãããéšåçã§ã-å€ãã®å Žåã«å¯èœã§ãã ES5ã¯ã次ã®ã«ããŽãªã®ã¡ãœããããªããžã§ã¯ãAPIã«è¿œå ããŸãããããã¿ã€ãã®äœæïŒäœæ/åä¿¡ïŒããªããžã§ã¯ãããŒã®ååŸãèšè¿°åã®äœ¿çšã
ïŒ Object.createã¡ãœããã¯ããããã¿ã€ããããªããžã§ã¯ããäœæããŸãã
null
ãæž¡ãããšã«ããããããã¿ã€ããªãã§ãªããžã§ã¯ããäœæã§ããŸãããããã¯ECMAScript 3ã«åºã¥ããŠè¡ãããšã¯äžå¯èœã§ãã
iframe
åºã¥ãæ¿ãããŽãã䜿çšããå¿ èŠããããŸãã ããããªã第2éšã§ç§ãã¡ã«æããã«ãããã®ã§ãããïŒ ãªãã·ã§ã³ã§ã
Object.defineProperties
ã«äŒŒãïŒèšè¿°åãªããžã§ã¯ããåãå ¥ããŸãã
function Parent(/*...*/){ /*...*/ } Parent.prototype = {constructor: Parent /*, ... */} function Child(/*...*/){ Parent.call(this /*, ...*/); // ... } // ES3 ( inherit extend'): function Tmp(){} Tmp.prototype = Parent.prototype; Child.prototype = new Tmp; Child.prototype.constructor = Child; // ES5: Child.prototype = Object.create(Parent.prototype, {constructor: {value: Child}}); var dict = Object.create(null); dict.key = 42; console.log(dict instanceof Object); // => false console.log(dict.toString) // => undefined console.log(dict.key) // => 42
ïŒ Object.getPrototypeOfã¡ãœããã¯ããªããžã§ã¯ãã®ãããã¿ã€ããè¿ããŸãã ECMAScript 3ã§ã¯ããªããžã§ã¯ãã®ãããã¿ã€ããååŸããä¿èšŒãããæ¹æ³ã¯ãããŸããã ãªããžã§ã¯ãã«
constructor
ããããã£ãå«ãŸããå Žåããããããããã¿ã€ãã¯
constructor.prototype
ãŸãã
Object.create
ã§äœæããããªããžã§ã¯ãã®å Žåããããã¿ã€ããå«ãã·ã³ãã«ãè¿œå ããããŒãåãåã£ããšãã«ãããç¡èŠããŸã ã ãã ãããæ£ããã
constructor
ããããã£ãæå®ããã«ãããã¿ã€ãããªãŒããŒã©ã€ããããã³ã³ã¹ãã©ã¯ã¿ã€ã³ã¹ã¿ã³ã¹ã§ã¯ã
Object.getPrototypeOf
ã¯æ£ããæ©èœããŸããã
var parent = {foo: 'bar'} , child = Object.create(parent); console.log(Object.getPrototypeOf(child) === parent); // => true function F(){} console.log(Object.getPrototypeOf(new F) === F.prototype); // => true F.prototype = {constructor: F /*, ...*/}; console.log(Object.getPrototypeOf(new F) === F.prototype); // => true F.prototype = {}; console.log(Object.getPrototypeOf(new F) === F.prototype); // IE8-
ïŒ Object.keysã¡ãœããã¯ããªããžã§ã¯ãã®ç¬èªã®åæããŒã®é åãè¿ããŸãã Object.getOwnPropertyNamesã¯ããªããžã§ã¯ãèªäœã®ããŒã®é åãè¿ããŸãã ããã³éäžå Žã
Object.keys
ã䜿çšãããšããã¹ãŠãã·ã³ãã«ã«æããŸã
Object.keys
for-in
ãä»ããŠãªããžã§ã¯ãã
Object.keys
ããããããã£ãç¬èªã®ãã®ã§ãããã©ããã確èªããŸãã IEã®ãåæäžå¯èœãªãåæããããã£ã®ãã°ã§ã¯ãªãå Žåã ãã®ããããã®ãããªããããã£ãåå¥ã«ç¢ºèªããå¿ èŠããããŸãã åæ§ã«ã䜿çšå¯èœãªé衚瀺ããããã£ã®ãªã¹ããè¿œå ãã§ãã¯ãããšã
Object.getOwnPropertyNames
ã
Object.getOwnPropertyNames
ãŸãã
console.log(Object.keys({q: 1, w: 2, e: 3})); // => ['q', 'w', 'e'] console.log(Object.keys([1, 2, 3])); // => ['0', '1', '2'] console.log(Object.getOwnPropertyNames([1, 2, 3])); // => ['0', '1', '2', 'length']
ïŒèšè¿°åã®ãã¹ãŠãæªãã®ã§ãECMAScript 3ã¯ãããããµããŒãããŠããŸããã ã²ãã¿ãŒ/ã»ãã¿ãŒãèšå®ããæ¹æ³ã¯ãããŸããã
Object#__define[GS]etter__
æã£ãŠãããã
Object.defineProperty
æ¬ èœããŠãã
Object.defineProperty
æ¶æ» ããŸããã å€ãIEã§ã¯ã VBScriptã䜿çšããŠåé¯åããããšã§ãgetter / setterã䜿çšããŠãªããžã§ã¯ããäœæã§ããŸãããããã¯å¥ã®ãããã¯ã§ãã
enumerable: false
ããããã£ã¯ãããŸãããèšå®ããããšã¯ã§ããŸãããã ObjectïŒpropertyIsEnumerableã䜿çšããŠãã®ãããªãã®ãã©ããã確èªããããšãã§ããŸã ã IE8ã«ã¯èšè¿°åãæäœããããã®ã¡ãœããããããŸãããããã§ãªãå Žåã¯ããé©åã§ãïŒDOMãªããžã§ã¯ãã§ã®ã¿æ©èœããŸãïŒã ãããã£ãŠãIE8-ã§ã§ããããšã¯ã¹ã¿ãã ãã§ãã Object.definePropertyããã³Object.definePropertiesã®èšè¿°åã®
value
ã«ãã£ãŠããããã£
value
èšå®ãã Object.getOwnPropertyDescriptorã§
value
ãš
enumerable
ãæ£çŽã«ååŸã
value
ã
ïŒ
Object.freeze, Object.preventExtensions, Object.seal
ã©ãã§ããïŒ ã¹ã¿ããé€ãããšãã¥ã¬ãŒã·ã§ã³ãäžå¯èœã«ãªãã ãã§ãªãã次ã®ãããªèŠ³ç¹ããããŸãã
Object.freezeãObject.preventExtensionsãObject.sealãwithãevalãããŠãç§ã¯åœŒå¥³ã«å®å šã«åæããŸãã
ããªãã¯ãããã決ããŠå¿ èŠãšããªãã ããã¯ã¬ã€ãžãŒããããšã ããããé¢ããŠãã ããã
-ãã§ãªãã¯ã¹ã»ã¬ã€ãŒã³ãã«ãã¡ãŒ
ïŒãã®ä»
ïŒECMAScript 5ã¯ã FunctionïŒbindãä»ããŠã³ã³ããã¹ããã€ã³ãã£ã³ã°ãšåºæ¬çãªéšåã¢ããªã±ãŒã·ã§ã³æ©èœãè¿œå ããŸããã ãã®æ¹æ³ã¯çŽ æŽãããã§ãããJavaScriptã§éšåçãªã¢ããªã±ãŒã·ã§ã³ãšã³ã³ããã¹ããã€ã³ãã£ã³ã°ã®å¯èœæ§ã解ãæŸã€ã«ã¯ãããã ãã§ã¯ååã§ã¯ãããŸããããããã¯ã¯ïŒå¯Ÿå¿ããã»ã¯ã·ã§ã³ã§è©³ãã説æãããŠããŸãã
var fn = console.log.bind(console, 42); fn(43); // => 42 43
ïŒ Date.nowã¡ãœããã¯ãçŸåšã®æå»ãæ°å€è¡šçŸã§è¿ããŸããçµæã¯
+new Date
ãšåãã§ãã
Date.now(); // => 1400263401642
ïŒ StringïŒtrimã¡ãœããã¯ãè¡ã®å é ãšæ«å°Ÿãã空çœãåé€ããŸãã
'\n \n'.trim(); // => ''
JSON
ã¢ãžã¥ãŒã«ã«ã€ããŠã¯ãIE8ã§ãµããŒããããŠããããã®ã©ã€ãã©ãªã®ãã¬ãŒã ã¯ãŒã¯å ã§ã¯ãå®è£ ããçç±ã¯ãããŸããã ããªãã絶察ã«å å²æ代ã®IEã§ãããå¿ èŠãšãããªãã°-誰ãäŸãã°ãã®èŠªåã䜿ãããšãæ°ã«ããŸããã
ïŒECMAScript 6
ECMAScript 5ä»æ§ã¯ã決ããŠåãå ¥ããããªãã£ãECMAScript 4ä»æ§ã®ä»£ããã«æ¥ãã§æžãããŠãããåäžçŽã«æ¡çšãããECMAScript 3ã«ã¯ããŸãæ¡åŒµãããŠããŸããã§ããã æ°æ©èœã®è¿œå ã¯åçµãããECMAScript 7ã®ææ¡ã«ã¯ãã¹ãŠã®äž»èŠãªå€æŽãå ãããããã©ããä»æ§ãžã®æè¿ã®å€æŽã®ã»ãšãã©ã¯ãã°ä¿®æ£ã§ãã ãããã£ãŠãæšæºã©ã€ãã©ãªã§ã¯ãäž»ã«ES6ã«çŠç¹ãåœãŠãŸãã
çŸåšã®ãšã³ãžã³ã§ãµããŒããããŠããããšã¯ã ãã®è¡šã«ã¯ã£ãããšè¡šããŠããŸã ã
- ãšãããã Firefoxã®ãµããŒãã«ããããã§ã«å€ãã®æ©èœãå©çšå¯èœã§ãã
- ïŒ v8ïŒChromeãOperaãNode.jsïŒã§ãå€ãã®ãªãã·ã§ã³ãå©çšå¯èœã§ããããªãã·ã§ã³ã®ããªãã®éšåãããã©ã«ãã§ãããã¯ãããŠããŸãããã©ãŠã¶ã§æå¹ã«ããã«ã¯ããå®éšçãªJavaScriptãæå¹ã«ãããããã¯ã¹ããã§ãã¯ããå¿
èŠããããŸãïŒããŒãµãŒã¯ãªã³ã¯
chrome://flags/#enable-javascript-harmony
ïŒãããã³Node.jsã¯--harmony
ãã©ã°ã§å®è¡ãããŸããPromise
ãWeakMap
ãWeakMap
ãªã©ããã©ã°ããªããŠã䜿çšã§ãããã®ããããChrome 38Symbol
ãMap
ãSet
ãã€ãã¬ãŒã¿ããã䜿çšã§ããŸãã Node.jsã¯ãã®ç¹ã§é ããŠããŸããç¹ã«å®å®ãããã©ã³ãã§ã¯ãv8ã¯ãã£ãã«æŽæ°ãããªãããã§ãã ããããããã¯ããŠãŒã¶ãŒã®ãã©ãŠã¶ãšã¯ç°ãªãã誰ããã©ã°ã§å®è¡ããããšãæ°ã«ããŸããã - IEã¯ãã€ãã®ããã«æªãã§ããã11çªç®ã®ããŒãžã§ã³ã®ã³ã¬ã¯ã·ã§ã³ã§ã¯ãããã€ãã®æ©èœãè¿œå ãããŸããã è¿ãå°æ¥ã圌ãã¯å€ããçŽæããŸã ã
- 圌ãã¯Safariã« ES6æ©èœãè¿œå ããããšããŸããã ããã¯åœŒããè¿œå ããã»ãšãã©ãã¹ãŠãæšæºãæºããããäžå¿ èŠãªåé¡ãåŒãèµ·ããã®ã§ãè¿œå ããªãæ¹ãè¯ãã§ãããã ãªã³ã¯ã¯åé¡ã®ã»ãã®äžéšã§ãã
æã人æ°ã®ããES6ã®èŠªåã¯ã paulmillrã®es6 - shimã§ãã
æšæºã®ECMAScript 6ã©ã€ãã©ãªã®äžéšãããšãã°
Proxy
ïŒããã¯æãããããæ©èœã®1ã€ã§ãïŒãECMAScript 5ãå®è£ ããããšã¯ã§ããŸãããããã«ECMAScript 3ãå®è£ ããããšã¯ã§ããŸããããã»ãšãã©ã¯å®å šã§ã¯ãªãã«ããŠããå°ãªããšãéšåçã«ãäžæ£ãã«å®è£ ã§ããŸãã
ããªããã»ããµECMAScript 6+ã«ã€ããŠå°ã
æ§æã«ã€ããŠã¯ããã®ã©ã€ãã©ãªã®ãã¬ãŒã ã¯ãŒã¯å ã§ã¯ããµããŒããè¿œå ã§ããŸããã ãã ããECMAScript 6+ã®æ§æãECMAScript 3ãŸãã¯5ã«å€æããããªããã»ããµãããã§å©ãã«ãªããŸãããããã®èšå€§ãªæ°ããããŸããæ°åã®äžè¬çãªãã®ã ããèããŠã¿ãŸãããã
ãã®ãããªå€ããŠåŒ·åãªãããžã§ã¯ãã Google TraceurããããŸãã èªã¿åãäžèœãªã³ãŒããçæããããªãéãã©ã³ã¿ã€ã ã䜿çšããããã䜿çšãæåŠããŸããã
å¥ã®ãããžã§ã¯ãã¯ç§ã«ãšã£ãŠã¯ããã«é åçãªããã§ã-6to5 ããã®ãããžã§ã¯ãã¯æ°é®®ã§ãé©ãã»ã©éãéçºãããŠããŸããèªã¿ãããã³ãŒããçæãããžã§ãã¬ãŒã¿ãŒãã³ã³ãã€ã«ããããã«äœ¿çšããã©ã³ã¿ã€ã ãªãžã§ãã¬ãŒã¿ãŒãé€ããç¬èªã®ã©ã³ã¿ã€ã ã䜿çšããŸããããããã代ããã«ã圌ã¯ç©æ¥µçã«æšæºES6ã©ã€ãã©ãªã䜿çšããŸã-äŸãã°ãïŒ
Symbol.iterator
ãããã©ã«ãã¯es6-shimããã³es6-symbolã§ãããããã¯ã©ã€ãã©ãªã«ç°¡åã«çœ®ãæããããããããã®ããªããã»ããµã¯çæ³çãªãã¢ã«ãªããŸããã³ãŒããECMAScript 5ã«å€æããŸãããäž»ã«æšæºã©ã€ãã©ãªã«é¢ãããã®ã§ããïŒã®
Object.defineProperties
ãããªã¡ãœããã¹ã¿ãã§ã¯ãã»ãšãã©ãã¹ãŠãå€ãIEã§ãæ©èœããŸãã
æšæºã©ã€ãã©ãªã®ããªããã»ããµãšããªãã£ãŒã«ã䜿çšããŠãECMAScript 6ãæ倧éã«äœ¿ãå§ããããšãã§ããŸãããããããããã€ãã®ããããªããšãé€ããŠã6to5ã§ES6ãã³ã³ãã€ã«ããæ©èœãåã
ãéåžžã«ã·ã³ãã«ãªãµã³ãããã¯ã¹ãšãæ¥ç¶ãããcore.jsã©ã€ãã©ãªãã¹ã±ããããŸãããäŸã«ã¯ããªã³ã¯ããããŸãããã ãããã®ã©ã€ãã©ãªã¯ECMAScript 6æ§æã«äžåçµã³ä»ããããŠããªããããã»ãšãã©ã®äŸã§ã¯ECMAScript 5æ§æã䜿çšããŸãã
ãŸããä»ã§ã¯ãECMAScriptã®6ã®æ°ãããã¶ã€ããŒã®ããã®æšæºã©ã€ãã©ãªã«ç§»åããã³ã³ã»ããã¯ãå¥ã®ç« ã§èª¬æããŸãïŒèšå·ãïŒã³ã¬ã¯ã·ã§ã³ãïŒã€ãã¬ãŒã¿ãšïŒã®çŽæãæ®ãã¯ããã§æ€èšããŠãããŸãã
ïŒ Object.assign
ãã®æ¹æ³ã¯å€ãã®äººã«æåŸ ãããŠããŸãããObject.assign cornyã¯ããœãŒã¹ãªããžã§ã¯ãã®ç¬èªã®åæããããã£ããã¹ãŠã¿ãŒã²ãããªããžã§ã¯ãã«ã³ããŒããŸããäŸïŒ
var foo = {q: 1, w: 2} , bar = {e: 3, r: 4} , baz = {t: 5, y: 6}; Object.assign(foo, bar, baz); // => foo = {q: 1, w: 2, e: 3, r: 4, t: 5, y: 6}
ãŸã
Object.mixin
ãåæäžå¯èœãªããããã£ãã³ããŒããèšè¿°åãèæ ®ã«å ¥ããããŒã¯ãŒããä»ããŠååŸãã芪ãåå²ãåœãŠããã¡ãœãããè¿œå ããããšãèšç»ãããŠããŸãã
super
ããããã圌ãã¯ãã®è¿œå ã延æããããšã«ããŸããããã®é¡äŒŒç©ã¯ãã©ã€ãã©ãªã®èªè»¢è»éšåã«ãããŸãã
ïŒ Object.is
JavaScriptã®æ¯èŒæŒç®åã¯éåžžãããªãå¥åŠã«åäœããŸãã
==
ãã£ã¹ãã®ãããªæŒç®åã§ããå¿ããŠãã ãã
===
ïŒ
NaN === NaN // => false 0 === -0 // => true, : 1/0 === 1/-0 // => false
ãã®å Žåã®ããã«ãèšèªã«ã¯å éšSameValueæ¯èŒã¢ã«ãŽãªãºã ããããŸããããã®ããã«
NaN
ãã
NaN
ãšã
+0
ãããŠ
-0
æçãªã ECMAScript 6ã§ã¯ãããããæŒç®å
is
ããã³ãšããŠåŒãåºãããã£
isnt
ãã®ã§ãããèšèªã®æ¯èŒæŒç®åã¯ãã§ã«ååã§ã¯ãªãããšãèªèããŠãããåŸæ¹äºææ§ã®ããã«ãObject.isã¡ãœãããšããŠåãåºãããŸãããäŸïŒ
Object.is(NaN, NaN); // => true Object.is(0, -0); // => false Object.is(42, 42); // => true, '===' Object.is(42, '42'); // => false, '==='
ïŒãŸããES6以éã§ã¯ãå¥ã®æ¯èŒã¢ã«ãŽãªãºã ãç©æ¥µçã«äœ¿çšãããŸã-SameValueZeroããã
NaN
ã¯çãã
NaN
ãåã®ãã®ãš
-0
ã¯ç°ãªããçãã
+0
ã§ãã圌ãã¯ãããŒã®äžææäŸïŒã³ã¬ã¯ã·ã§ã³ãçµç±ã³ã¬ã¯ã·ã§ã³ã«åå ããèŠçŽ ãã§ãã¯ãããšããããã䜿çšãããïŒã
Array#includes
ã
ïŒ Object.setPrototypeOf
ES6ã§ã¯ãæ¢åã®ãªããžã§ã¯ãã®ãããã¿ã€ããã€ã³ã¹ããŒã«ããã¡ãœããã衚瀺ãããŸã
Object.setPrototypeOf
ãäŸïŒ
function Parent(){} function Child(){} Object.setPrototypeOf(Child.prototype, Parent.prototype); new Child instanceof Child; // => true new Child instanceof Parent; // => true function fn(){} Object.setPrototypeOf(fn, []); typeof fn == 'function'; // => true fn instanceof Array; // => true var object = {}; Object.setPrototypeOf(object, null); object instanceof Object; // => false
èšèªã®ãããã¿ã€ãã®æ¹åãæ©äŒ-å°ãªããšãæåã®äŸ-ã·ã³ãã«ã§æçœãªãããã¿ã€ãã®ç¶æ¿ãECMAScript 5ã«ãªãããšãèãããšããã®ããã«äžèŠå¿ èŠãªã®ã¯å¥åŠã§ãããã®ã¡ãœãããªãã§æ¢åã®ãªããžã§ã¯ãã®ãããã¿ã€ããå€æŽããå¯äžã®æ¹æ³ã¯éæšæºã®ããããã£
__proto__
ã§ããçŸæç¹ã§ã¯ãIE10-ãé€ãçŸåšã®ãã¹ãŠã®ãã©ãŠã¶ãŒã§ãçŸåšã®å®è£ ïŒãããã¿ã€ãã®ã²ãã¿ãŒ/ã»ãã¿ãŒïŒã§ãµããŒããããŠããŸã
Object
ã
ããªããã£ãã§ãäžå¿ èŠãªãã§ãã¯ããªããžã§ã¯ãã®æ»ã
Object.setPrototypeOf
ããªããã°ãããŒãžã§ã³ã¯ã·ã³ãã«ã«èŠããã§ããã-ã»ãã¿ãŒ
__proto__
ãåŒãåºããŠãããããæ©èœãäœããŸãïŒ
var setPrototypeOf = Function.call.bind(Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set);
ãã ããå¥ã®åé¡ãããã«è¡šç€ºãããŸã-v8ã®å€ãããããã©ããé¢é£ããããŒãžã§ã³ã§ã¯ãã»ãã¿ãŒ
__proto__
ãé¢æ°ãšããŠäœ¿çšã§ããŸãããå®è£
Object.setPrototypeOf
ã®å ŽåãããŒã§å€ãèšå®ããã ãã§ã
__proto__
ã
ç§ãã¡ã¯çããŠããŸãïŒ
- IE10ã®å Žåããšãã¥ã¬ãŒã·ã§ã³
Object.setPrototypeOf
ã¯äžå¯èœã§ãããããå®å šã«ååšããŸããã - å€ãããŒãžã§ã³ã§ã¯V8
Object.setPrototypeOf
ç®æšã®é£éã«ãããã¿ã€ããååšããªãå Žåã¯åäœããŸããObject.prototype
ãŸãã¯ããããã£ã¯__proto__
ãããšãã°ãçµç±äžæžãObject.defineProperty
ã
ãŸããECMAScript 6ãšã©ã€ãã©ãªã¯äœæ¥ã®ããžãã¯ãå€æŽããŠã
Object#toString
ãŸãããã®ãããã¯ã¯æ·±å»ã§ãããèšäºã®åŸåã§ïŒã«ã€ããŠèª¬æããŸãã
ïŒé åã¡ãœãã
éçã¡ãœãã
Array.from
ããã³
Array.of
-ãžã§ããªãã¯ããããã以å€ã®é¢æ°ã®ã³ã³ããã¹ãã§å®è¡ãããå Žåããããã¯
Array
ãã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŸããããã«ã€ããŠè©³ããç¥ãããå Žåã¯ããã®èšäºã§æ°ããé åã¡ãœããã«ã€ããŠè©³ãã説æããŠããŸãã
ïŒã®ECMAScript 6ã¯ãéåžžã«æçšãªæ¹æ³ãè¿œå ãããŸã-
Array.from
ãããã¯ãå埩å¯èœã§é åã®ãããªãªããžã§ã¯ããžã®æ±çšãã£ã¹ãã§ããã»ãšãã©ã®å Žåã
Array.prototype.slice.call
éå§äœçœ®ãšçµäºäœçœ®ãæå®ããã«çœ®ãæããããŸããããã«ããã®ã¡ãœããã¯ããªãã·ã§ã³ã®ãããã³ãŒã«ããã¯ãšãã®å®è¡ã³ã³ããã¹ããåãå ¥ããŸãããããã»ã³ãŒã«ããã¯ãªãã§å埩å¯èœãªè»¢éã®å Žåãçµæã¯ããªãã¬ãŒã¿ã®äœ¿çšã«é¡äŒŒããŠããïŒåºããé åãªãã©ã«ã§-
[...iterable]
ãäŸïŒ
Array.from(new Set([1, 2, 3, 2, 1])); // => [1, 2, 3] Array.from({0: 1, 1: 2, 2: 3, length: 3}); // => [1, 2, 3] Array.from('123', Number); // => [1, 2, 3] Array.from('123', function(it){ return it * it; }); // => [1, 4, 9]
ïŒåã®ãã®ãšã¯ç°ãªãã Array.ofã¡ãœããã¯çŸåšã»ãšãã©å®çšçã§ã¯ãããŸããããµãã¯ã©ã¹ã«ã¯ããŸã
Array
é åãªãã©ã«ã®é¡äŒŒç©ãšããŠå¿ èŠã§ã
[]
ãäŸïŒ
Array.of(1); // => [1] Array.of(1, 2, 3); // => [1, 2, 3]
ïŒã¡ãœããã¢ã¬ã€ïŒã®æ€çŽ¢ããã³ã¢ã¬ã€ïŒfindIndexã¯ãã³ãŒã«ããã¯åŒã³åºããŠæ€çŽ¢é åãæèŒããŸãããäŸïŒ
function isOdd(val){ return val % 2; } [4, 8, 15, 16, 23, 42].find(isOdd); // => 15 [4, 8, 15, 16, 23, 42].findIndex(isOdd); // => 2 [4, 8, 15, 16, 23, 42].find(isNaN); // => undefined [4, 8, 15, 16, 23, 42].findIndex(isNaN); // => -1
ïŒé åã¡ãœããïŒé åïŒfillã¯ãæž¡ãããå€ã§é åãåããŸãããªãã·ã§ã³ã®åŒæ°-éå§äœçœ®ãšçµäºäœçœ®ãäŸïŒ
Array(5).map(function(){ return 42; }); // => [undefined à 5], .map "" Array(5).fill(42); // => [42, 42, 42, 42, 42]
ïŒæååã¡ãœãã
ããã§ã¯ãã¹ãŠãç°¡åã§ãã æååïŒã«ã¯ïŒæè¿ãŸã§-
String#contains
ãå«ãŸããŠããŸããããå€ãååã§å©çšã§ããéãïŒ
Array#includes
åŒãå¯ããããŸããïŒãæååå ã®éšåæååããã§ãã¯ããŸããæååïŒstartsWithããã³æååïŒendsWithã¯ãæååãç¹å®ã®éšåæååã§éå§ãŸãã¯çµäºãããã©ããã確èªããŸããããã3ã€ã®ã¡ãœããã¯ãè¿œå ã®åŒæ°-éå§äœçœ®ãåããŸããäŸïŒ
'foobarbaz'.includes('bar'); // => true 'foobarbaz'.includes('bar', 4); // => false 'foobarbaz'.startsWith('foo'); // => true 'foobarbaz'.startsWith('bar', 3); // => true 'foobarbaz'.endsWith('baz'); // => true 'foobarbaz'.endsWith('bar', 6); // => true
StringïŒrepeatã¡ãœããã¯ãæå®ãããåæ°ã ãç¹°ãè¿ãããæååãè¿ããŸããäŸïŒ
'string'.repeat(3); // => 'stringstringstring'
ã©ã€ãã©ãªã«ã¯ããã«ããã€ãæåãšæ£çŽãªïŒè¡å埩åã®ãµããŒããæ¹åããããã® ECMAScript 6/7ã¡ãœããããŸã è¿œå ãããŠããŸãã;é åå埩åãæååã«äœ¿çšãããŸããä»ã圌ãã¯ç§ãåã«ããããå¿ èŠãšããªããšããçç±ã ãã§ã¯ãããŸãããè¿ãå°æ¥ããããè¿œå ããã®ã¯è¯ãããšã§ãã
ïŒæ°åãæ±ã
ECMAScript 6ã¯ãèšå€§ãªæ°ã®æ°åŠé¢æ°ãšå®æ°ãè¿œå ããŸãã説æãšäŸã¯ãªãããªã³ã¯ã®ã¿ïŒNumber.EPSILONãNumber.parseFloatãNumber.parseIntãNumber.isFiniteãNumber.isIntegerãNumber.isNaNãNumber.MAX_SAFE_INTEGERãNumber.MIN_SAFE_INTEGERãNumber.isSafeIntegerãMath.acoshãMath.asinhãMath.atanhãMath.cbrtãMath.clz32ãMath.coshãMath.expm1ãMath.hypotãMath.imulãMath.log1pãMath.log10ãMath.log2ãMath.signãMath.sinhãMath.tanhãMath.truncã
ïŒ ECMAScriptã®6ïŒèšå·
JavaScriptã§ã¯ããªããžã§ã¯ãã®ããããã£ãé衚瀺ã«ããã®ã¯ããªãæªãã§ãããã©ã€ããŒãããŒã¿ã¯ã¯ããŒãžã£ã«æ ŒçŽã§ããŸããããã«ããããªããžã§ã¯ãã®ãããã¿ã€ãã§ã¯ãªããã³ã³ã¹ãã©ã¯ã¿å ã§ããããæäœããã¡ãœããã宣èšããå¿ èŠããããŸããECMAScriptã®5以éã§ã¯ãããªãã宣èšããããšãã§ããŸã
enumerable: false
é衚瀺ãªããžã§ã¯ãã®ãªã¹ãããããããã£ããšã財ç£
for-in
ãšäž
Object.keys
ããããã¯ä¿¡é Œæ§ã®é«ãé ãºããæäŸããŠããŸãããã -ããŒã¯äžæã§ã¯ãªãããããã¯ããªããããããã䜿çšããå¿ èŠã®ååã®ç«¶åãæããŠããŠããããããã¯ã¢ããããŠç°¡åã«ããããšãã§ã
Object.defineProperty
ããªããžã§ã¯ãèšè¿°åãããã¯ããªãé¢åã§ãã
ECMAScript 6ã§ã¯ãã«ãã»ã«åãç°¡çŽ åããããã«ã以åã¯NameãšåŒã°ããŠããæ°ããããŒã¿åSymbolãå°å ¥ãããŠããŸããã·ã³ãã«ã¯ããªããžã§ã¯ãã®äžæã®ããŒãšããŠäœ¿çšããããã®ãã®ã§ããäŸïŒ
var Person = (function(){ var NAME = Symbol('name'); function Person(name){ this[NAME] = name; } Person.prototype.getName = function(){ return this[NAME]; }; return Person; })(); var person = new Person(''); console.log(person.getName()); // => '' console.log(person['name']); // => undefined console.log(person[Symbol('name')]); // => undefined, Symbol for(var key in person)console.log(key); // => 'getName', console.log(typeof Symbol()); // => 'symbol'
ã·ã³ãã«ã¯å®å šã«ãã©ã€ããŒãã§ã¯ãããŸãã-ã¡ãœãã
Object.getOwnPropertySymbols
ã¯ãªããžã§ã¯ãèªäœã®ã·ã³ãã«ãè¿ããŸããããã«ãããã¯ããŒã³äœæãªã©ã®äœã¬ãã«ã®æäœããããã°ã§ããŸãã#WeakMapã«åºã¥ããŠãçã«ãã©ã€ããŒããªããŒã¿ã®ã¹ãã¬ãŒãžãå®è£ ã§ããŸããç§èŠã§ã¯ããã®åé¡ã«å¯Ÿããããæåãã解決çã¯ãå®å šã«ãã©ã€ããŒããªããŒãžã§ã³ã®ãã£ã©ã¯ã¿ãŒãè¿œå ããããšã§ãã
çŸæç¹ã§ããã£ã©ã¯ã¿ãŒã¯v38ã§å©çšå¯èœã§ããChrome38ïŒä»¥åã®ããŒãžã§ã³- ïŒå®éšçæ©èœã®ãã©ã°ä»ãïŒãããFirefoxã®ãã€ããªãŒãã«ãã§33ããå§ãŸããŸããIEã§éããªãçŽæãããŸããäž»èŠãªææ°ãã©ãŠã¶ã
ïŒãã¡ãããES5ã«åºã¥ããæ¬æ Œçãªããªãã£ãªãã¯ãªãã£ã©ã¯ã¿ãŒã¯äžå¯èœã§ãããåºæ¬çãªæ©èœïŒãªããžã§ã¯ãã®éé
for-in
ãæ»ãäžå¯
Object.keys
ããŒã«é¢ä¿ããªãäžæã®ããŒã®äœæïŒã¯ãããšãã°æ¬¡ã®ããã«éåžžã«ç°¡åã«å®è£ ãããŸãã
window.Symbol || (function(){ var id = 0; window.Symbol = function(description){ if(this instanceof Symbol)throw new TypeError('Symbol is not a constructor'); var symbol = Object.create(Symbol.prototype) , tag = 'Symbol(' + description + ')_' + (++id + Math.random()).toString(36); symbol.tag = tag; Object.defineProperty(Object.prototype, tag, { configurable: true, set: function(it){ Object.defineProperty(this, tag, { enumerable : false, configurable: true, writable : true, value : it }); } }); return symbol; } Symbol.prototype.toString = function(){ return this.tag; } })();
åŒã³åºããããšã
Symbol
ããšãã°
"Symbol(description)_m.y9oth2pcqaypsyvi"
ãäžæã®ããŒæååãçæãããã®ããŒã®
Object.prototype
ã»ãã¿ãŒãèšå®ããŸãããæåãããã£ã¹ããããããŒæååã«ãã£ãŠå€ãèšå®ããããšãããšãã»ãã¿ãŒã¯
enumerable: false
ããããã£ãçŸåšã®ãªããžã§ã¯ãã«èšå®ããŸãããã ãããã®ãããªãã·ã³ãã«ãã«ã¯èšå€§ãªæ°ã®ãã€ãã¹ããããŸããããã«äžéšã瀺ããŸãã
- ã»ãã¿ãŒã¯æ¬¡ã®ããã«æžã
Object.prototype
ãŠããŸããç¹ã«æªçšããªãã§ãã ãããããã©ãŒãã³ã¹ã«åœ±é¿ããå¯èœæ§ããããŸãã - : IE8- ( #
Object.defineProperty
),Object.prototype
, «» . - ,
Object.prototype
(,Object.create(null)
), «» . -
Symbol() in {}
true
â . -
typeof Symbol()
'object'
â JavaScript . -
Object.getOwnPropertySymbols
âObject.getOwnPropertyNames
, ,Object.getOwnPropertyNames
, , «».
ïŒæ±ºå®ãéåžžã«çãããå Žåãããã§äœãããŠããŸããïŒãããžã§ã¯ãã«å¿ èŠãªæåæ°ãå°ãªããèªåèªèº«ãå«ãŸãªããªããžã§ã¯ãã§ãããã䜿çšããäºå®ããªãå Žå
Object.prototype
ããã®ãœãªã¥ãŒã·ã§ã³ã¯æ©èœããŸãããã以å€ã®å Žåã¯ãã©ã€ãã©ãªã«ããã€ãã®ãã«ããŒãè¿œå ããŸãã
Symbol.pure
å©çšã§ãããã€ãã£ããªæåãªãã°ãããã¯æåãè¿ãããªã-ã§ã»ãã¿ãŒãè¿œå ããããšãªããç¬èªã®æååã®ããŒãè¿ã
Object.prototype
ããããŠ
Symbol.set
ãå©çšå¯èœãªå Žåããã€ãã£ãã·ã³ãã«ã¯-ã¡ããã©ãªããžã§ã¯ãã®ããŒå€ã«æ·èšãªã-䜿çšããŠã®å€ãèšå®ãããŸãããã®åå§çãªæ¹æ³ã§ãäžèšã®åé¡ã®ååãåãé€ããŸããåŒã³åºãã®ä»£ããã«ããŒã¿ãã«ããŒã䜿çšããŠäžèšã§äœ¿çšããäŸã¯æ¬¡ã®ããã«ãªããŸãã
Object.defineProperty
enumerable: false
Symbol
var Person = function(){ var NAME = Symbol.pure('name'); function Person(name){ Symbol.set(this, NAME, name); } Person.prototype.getName = function(){ return this[NAME]; }; return Person; }();
ïŒåè¿°ã®ãšãããã¡ãœãã
Object.getOwnPropertySymbols
ã¯è¿œå ããŸããããããŠãæååãšæåã®äž¡æ¹ã®ãã¹ãŠã®ããŒããã€ãã¹ããããã®ãæšæºåããããå€ããå°ãªããæ®éçãªæ¹æ³ãå¿ èŠã§ãã ECMAScriptã®6ã¯ãè¿œå ã®ã¢ãžã¥ãŒã«
Reflect
æåã®å Žæã§ã¯ã -ãã©ã°ã®ã»ããã®ããã«
Proxy
ããšãã¥ã¬ãŒãããèœåããªããããå®éã«ã¯
Proxy
ã¢ãžã¥ãŒã«
Reflect
ã¯å¿ èŠãããŸããããã ãã
Reflect.ownKeys
ãªããžã§ã¯ãã®ãã¹ãŠã®ããŒãè¿ãã¡ãœããããããŸã-æååãšæåã®äž¡æ¹ãã€ãŸã
Object.getOwnPropertyNames + Object.getOwnPropertySymbols
ããã®ã¡ãœãããè¿œå ããŸããäŸïŒ
var O = {a: 1}; Object.defineProperty(O, 'b', {value: 2}); O[Symbol('c')] = 3; Reflect.ownKeys(O); // => ['a', 'b', Symbol(c)]
ïŒ ES6ã¯ããã£ã©ã¯ã¿ãŒã®ã°ããŒãã«ãªã±ãŒã¹ã®ãããªæªãããã®ãè¿œå ããŸãããããæäœããããã®ããã€ãã®æ¹æ³ããããŸã -Symbol.forãš Symbol.keyForã§ãã
Symbol.for
ã¬ãžã¹ã¿ã§æ€çŽ¢ããããŒæååã§æåãè¿ããŸãããèŠã€ãããŸãã-æ°ããæåãäœæããã¬ãžã¹ã¿ã«è¿œå ããŠè¿ããŸãã
Symbol.keyFor
éä¿¡ãããæåãã¬ãžã¹ã¿å ã§äžèŽããæååãè¿ããŸããäŸïŒ
var symbol = Symbol.for('key'); symbol === Symbol.for('key'); // true Symbol.keyFor(symbol); // 'key'
ããã«ãã©ã€ãã©ãªã¯ã·ã³ãã«ïŒ
Symbol.iterator
ãšïŒã
Symbol.toStringTag
ç©æ¥µçã«äœ¿çšããŸãã
ïŒ ECMAScriptã®6ïŒã³ã¬ã¯ã·ã§ã³
ECMAScript 6ã«ã¯ã4ã€ã®æ°ããã¿ã€ãã®ã³ã¬ã¯ã·ã§ã³ã
Map, Set, WeakMap
ãã
WeakSet
ãŸãïŒããã³ãåä»ãé åããããŸãããä»ã®ãšããã¯é åãªãã§å®è¡ã§ããŸãã
- ïŒã³ã¬ã¯ã·ã§ã³ã®èª¬æ
- ïŒãšã³ãžã³ãµããŒã
- ïŒå®è£
Map
ãšSet
- ïŒççµåã³ã¬ã¯ã·ã§ã³ã®å®è£
ïŒããã§ããããã®ã³ã¬ã¯ã·ã§ã³ã¯äœã§ããïŒ
ïŒ Map -Key-Valueã®ã³ã¬ã¯ã·ã§ã³ãJavaScriptãšã³ãã£ãã£ã¯ããŒãšããŠæ©èœã§ããŸã-ããªããã£ããšãªããžã§ã¯ãã®äž¡æ¹ãåé¿çããããŸããïŒã€ãã¬ãŒã¿ãšã¡ãœãã
.forEach
ããããèŠçŽ ã®æ°ã¯ããããã£ãä»ããŠå©çšã§ããŸã
.size
ãäŸïŒ
var a = [1]; var map = new Map([['a', 1], [42, 2]]); map.set(a, 3).set(true, 4); console.log(map.size); // => 4 console.log(map.has(a)); // => true console.log(map.has([1])); // => false console.log(map.get(a)); // => 3 map.forEach(function(val, key){ console.log(val); // => 1, 2, 3, 4 console.log(key); // => 'a', 42, [1], true }); map.delete(a); console.log(map.size); // => 3 console.log(map.get(a)); // => undefined console.log(Array.from(map)); // => [['a', 1], [42, 2], [true, 4]]
ïŒ Set-äžæã®å€ã®ã³ã¬ã¯ã·ã§ã³ããšåæ§ã«
Map
ãåé¿çããããŸããäŸïŒ
var set = new Set(['a', 'b', 'a', 'c']); set.add('d').add('b').add('e'); console.log(set.size); // => 5 console.log(set.has('b')); // => true set.forEach(function(it){ console.log(it); // => 'a', 'b', 'c', 'd', 'e' }); set.delete('b'); console.log(set.size); // => 4 console.log(set.has('b')); // => false console.log(Array.from(set)); // => ['a', 'c', 'd', 'e']
ïŒ WeakMap-ããŒãšå€ã®ã³ã¬ã¯ã·ã§ã³ããªããžã§ã¯ãã®ã¿ãããŒãšããŠæ©èœããŸãã匱ãæ¥ç¶ã䜿çšããŸã-ããŒãªããžã§ã¯ããïŒã¬ããŒãžã³ã¬ã¯ã¿ãŒã«ãã£ãŠïŒåé€ããããšãã³ã¬ã¯ã·ã§ã³ã®ããŒãšå€ã®ãã¢ãåé€ãããŸããåé¿ããæ¹æ³
.forEach
ã¯ãããŸãã
.size
ãã€ãã¬ãŒã¿ãã¡ãœãããããããã£ããããŸãããããã¯ããã©ã€ããŒãããŒã¿ãæ ŒçŽãããã1ã€ã®æ¹æ³ã§ããããããæ£çŽãã§ãããïŒæåã䜿çšããå Žåãšæ¯ã¹ãŠãªãœãŒã¹ãéäžçã«äœ¿çšããŸããå°æ¥ãæœè±¡åç §ã JavaScriptã«è¿œå ãããå Žåããã®ãããªãã©ã€ããŒããã£ãŒã«ãã«äŸ¿å©ãªæ§æã衚瀺ãããŸããäŸïŒ
var a = [1] , b = [2] , c = [3]; var wmap = new WeakMap([[a, 1], [b, 2]]); wmap.set(c, 3).set(b, 4); console.log(wmap.has(a)); // => true console.log(wmap.has([1])); // => false console.log(wmap.get(a)); // => 1 wmap.delete(a); console.log(wmap.get(a)); // => undefined // var Person = (function(){ var names = new WeakMap; function Person(name){ names.set(this, name); } Person.prototype.getName = function(){ return names.get(this); }; return Person; })(); var person = new Person(''); console.log(person.getName()); // => '' for(var key in person)console.log(key); // => 'getName'
ïŒ WeakSet-ããŠããã€ã³ããåŸããæ¯èŒçæè¿ãã©ããä»æ§ã«ç»å Žããããããã©ãŠã¶ã®ãµããŒãã¯ããªã匱ãã§ããäŸïŒ
var a = [1] , b = [2] , c = [3]; var wset = new WeakSet([a, b, a]); wset.add(c).add(b).add(c); console.log(wset.has(b)); // => true console.log(wset.has([2])); // => false wset.delete(b); console.log(wset.has(b)); // => false
ãããã®ã³ã¬ã¯ã·ã§ã³ã¯ãã¹ãŠãæºç·åœ¢æ€çŽ¢æéãæäŸããå¿ èŠããããŸããããŒã®äžææ§ã¯ãïŒSameValueZeroæ¯èŒã¢ã«ãŽãªãºã ã«ãã£ãŠæäŸãããŸãã
ïŒææ°ã®jsãšã³ãžã³ã«å¯Ÿãããããã®ã³ã¬ã¯ã·ã§ã³ã®ãµããŒãã¯äœã§ããïŒãšãŠãè¯ãã
- Firefoxããã£ã±ãã§ã
Map, Set
ãšWeakMap
ãæ¯æ©ã®ãã«ãã§ç»å ŽããŸããWeakSet
ãå埩å¯èœãªãªããžã§ã¯ãMap
ãSet
ååŸããŸããMap
ãããŠSet
ãã€ãã¬ãŒã¿ãšã¡ãœããããã.forEach
ãŸãã - v8 â Chrome, Opera Node.js , 4 . Chrome 38, .
WeakMap
WeakSet
. # . v8 ,Map
Set
.forEach
,Map
Set
, . - IE11
Map, Set
WeakMap
. .Map
Set
,.forEach
. - Safari , .
Map, Set
WeakMap
. . , , , , ,next
.forEach
, 3 , , 1Set
2Map
.
ã»ãšãã©ãã¹ãŠã®çŸåšã®å®è£ åéæ¹æ³
.add
ãš
.set
è¿ããªã
this
-ãããã®ã¡ãœããã¯åäœããŸããåéãã§ãŒã³ãåããããã«ãããããããã¯ç°¡åã«æ±ãããŸãã
ã³ã¬ã¯ã·ã§ã³ãã€ãã¬ãŒã¿ã§åæåããã«ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã®ã©ãããŒã§ãååã§ããããã«ãããã³ã¬ã¯ã·ã§ã³ãäœæãããèŠçŽ ãè¿œå ãããŸããã€ãã¬ãŒã¿ã«ã€ããŠã¯ã次ã®ç« ã§èª¬æããŸãã
ããŠãã³ã¬ã¯ã·ã§ã³èªäœã®å€çžæ§ãããã«æ€èšããŠãã ããããããã®ã³ã¬ã¯ã·ã§ã³ã®æ¬æ Œçãªå®è£ -é«éã§ãããªããã¯ãªãŒã³ã§ãECMAScript 5ã«åºã¥ãã¡ã¢ãªãªãŒã¯ïŒWeakMapçšïŒã¯ãããŸãããã劥åœãªåŠ¥åæ¡ãèŠã€ããããšãã§ããŸãã
ïŒããããšã»ããã®å®è£
ã»ãšãã©ã®ããªãã£ã«ã¯å®è£ ãè¡šããŸã
Map
ãïŒã€ã³ã¹ã¿ã³ã¹
Map
-2ã€ã®é åãããŒãšå€ãèŠçŽ ãåãåããšãããŒã®é åã§äžèŽãããã®ãæ¢ããçµæã®ã€ã³ããã¯ã¹ã®å€ã®é åããèŠçŽ ãè¿ããŸãããŸãã¯ãåé€ãæé©åããããã®ä»£æ¿æ段ã¯ããšã³ããªãªããžã§ã¯ãã®ãã§ãŒã³ã§ããäž¡æ¹ã®å Žåã«äœãåé¡ã«ãªã£ãŠããŸããïŒããã¯éåžžã«é ããèŠçŽ ãèŠã€ããé£ããã¯OïŒnïŒãuniqæäœã®è€éãã¯OïŒn 2ïŒã§ããããã¯ã©ã®ããã«ç§ãã¡ãè ãããŸããïŒ ããã«å°ããªãã¹ãããããŸãïŒ
var array = []; for(var i = 0; i < 100000; i++)array.push([{}, {}]); array = array.concat(array); console.time('Map test'); var map = new Map(array); console.timeEnd('Map test'); console.log('Map size: ' + map.size);
200,000ã®ãªããžã§ã¯ãã®ãã¢ïŒå°æ¥ã®Key-ValueïŒã®é åãäœæããŸãããã®ãã¡100,000ã¯äžæã§ããããã®é åããã³ã¬ã¯ã·ã§ã³ãäœæããŸã
Map
ãããšãã°ãFirefoxã§
ãã€ãã£ãã®ãã®ããã¹ãããŸããã
Map
ã
Map test: Map test: 46.25 Map size: 100000
ãããŠä»
Map
ãæã人æ°ã®ãã ECMAScript 6ã®æ奜家ã®ãã®ã§ãã
Map test: Map test: 506823.31 Map size: 100000
çŽ8.5åãæ°ããèŠçŽ ãããããè¿œå ããããšãããšãæ¢ã«è¿œå ãããŠãã100,000åãŸã§äžŠã¹æ¿ããå¿ èŠããããŸãããã®ããšããããã®ã¢ãããŒãã¯éåžžã«å°ããªã³ã¬ã¯ã·ã§ã³ã«ã®ã¿é©ããŠãããšçµè«ä»ããããšãã§ããŸãã
ããã·ã¥ããŒãã«ã䜿çšããŠããµããªãã¢ããªãã£ã«ã®é床ãå®çŸã§ããŸãã ECMAScript 5ã§ã¯ã
Object
æååã®ã¿ãããŒãšããŠäœ¿çšããŠããŸããäžèšã§ãã¹ãããããªãã¡ã€ã«ã«ã¯ãå°ããªæé©åããããŸã-ã³ã¬ã¯ã·ã§ã³ã¢ã€ãã ãèŠã€ããå¹³åçãªè€éããOïŒ1ïŒã«æžããåçŽãªé¢æ°ã«ããããŒæååãŸãã¯æ°åã®æ€çŽ¢ã€ã³ããã¯ã¹ïŒ
function fastKey(key){ if(typeof key === 'string')return '$' + key; else if(typeof key === 'number')return key; return null; };
åæ§ã«ãä»ã®ããªããã£ããžã®ã¯ã€ãã¯ã¢ã¯ã»ã¹ãå®è£ ã§ããŸãããããã
Map
ããªããã£ããšããŠã®ã¿å¹æçã«äœ¿çšã§ããããŒãšããŠããªãå¿ èŠãªã®ã§ããããïŒïŒããã«å¯ŸåŠ
Object.create(null)
ããŸãããªããžã§ã¯ãããŒã®äžæã®èå¥åæååãååŸããã³ååŸããããšã¯äžå¯èœã§ãããããã£ãŠãã«ãŒã«ããããã«ç Žãå¿ èŠããããŸããå¿ èŠã«å¿ããŠããªããžã§ã¯ãã«ããŒãèšå®ããããã®èå¥åãæã€ã·ã³ãã«ãè¿œå ããŸãããããã®ãããªãã®ïŒ
var STOREID = Symbol('storeId') , id = 0; function fastKey(it){ // 'S' 'P' if(it !== Object(it))return (typeof it == 'string' ? 'S' : 'P') + it; // - if(!Object.hasOwnProperty.call(it, STOREID))it[STOREID] = ++id; // 'O' return 'O' + it[STOREID]; }
Map
2ã€ã®é åãŸãã¯èŠçŽ ãªããžã§ã¯ãã®ãã§ãŒã³ã§
Object
ã¯ãªããããŒãšå€ã®2ã€ã®ããã·ã¥ã«å®è£ ããŸããè¿œå ã®é åºã§ã³ã¬ã¯ã·ã§ã³ããã©ããŒã¹ããããã«å¥ã®ããŒ/å€ã¹ãã¢ã¯å¿ èŠãããŸããïŒãã¹ãŠã®ãšã³ãžã³ã§ã¯ããªããžã§ã¯ãããŒã¯æ°åããŒãé€ããè¿œå ã®é åºã§æ ŒçŽãããŸãããããã§ã¯ãã¹ãŠã®ããŒã«ãã¬ãã£ãã¯ã¹æåããããããååšããŸãããåèšïŒ
Map test: Map test: 669.93 Map size: 100000
ãã¡ããããã€ãã£ãã®ãã®ãããé ãã§ãããããŸããããšæããŸããã¯ããããŒãªããžã§ã¯ãã«é ãããããã£ãèšè¿°ããŸã-ããŒãšããŠïŒfrozen-objectsã䜿çšããããšã¯ã§ããŸãããã蚱容å¯èœãªé床ãåŸãããŸãã
Set
1ããã·ã¥ã§åæ§ã«å®è£ ãããŸãã
ïŒççµåã³ã¬ã¯ã·ã§ã³ã®å®è£
匱çµåã³ã¬ã¯ã·ã§ã³ã®å®è£ ã¯ããã«ç°¡åã§ããã€ãã¬ãŒã¿ãã¡ãœãã
.forEach
ãããããã£ã¯ãããŸãã
.size
ãã³ã¬ã¯ã·ã§ã³ãªããžã§ã¯ãã«ããŒãšå€ãä¿åããå Žåãããã¯ãã¯ãççµåã§ã¯ãªããªããŸã-ããŒ/å€ã¯åé€ãããã
Set
andã®åé€ãããããŒãžã§ã³ãååŸã
Map
ãŸããå€ããå°ãªããåççãªè§£æ±ºçã¯é·ãéç¥ãããŠããŸã-ããŒã«å€ãä¿åãããã®èå¥åã®ã¿ãã³ã¬ã¯ã·ã§ã³ãªããžã§ã¯ãã«ä¿åããããšã§ããå€ã¯ããŒã«ä¿åããããããä¿åãããããŒã¿ã®ãã©ã€ãã·ãŒã¯ããªãã¡ã€ã«ã§å€±ãããŸãã
倧å¹
ã«ç°¡çŽ åãããå®è£
ã¯æ¬¡ã®ããã«ãªããŸãã
window.WeakMap || (function(){ var id = 0 , has = Function.call.bind(Object.prototype.hasOwnProperty) , WEAKDATA = Symbol('WeakData') , ID = Symbol('ID'); window.WeakMap = function(){ if(!(this instanceof WeakMap))throw TypeError(); this[ID] = id++; } Object.assign(WeakMap.prototype, { 'delete': function(key){ return this.has(key) && delete key[WEAKDATA][this[ID]]; }, has: function(key){ return key === Object(key) && has(key, WEAKDATA) && has(key[WEAKDATA], this[ID]); }, get: function(key){ if(key === Object(key) && has(key, WEAKDATA))return key[WEAKDATA][this[ID]]; }, set: function(key, value){ if(key !== Object(key))throw TypeError(); if(!has(key, WEAKDATA))key[WEAKDATA] = {}; key[WEAKDATA][this[ID]] = value; return this; } }); })();
ããŒåç §ãåé€ãããšãããããã³ã¬ã¯ã·ã§ã³ã«æ®ã£ãŠããªãããšããããŠããã«å¿ããŠã¡ã¢ãªããªãŒã¯ããªãããšã確èªããŸãããïŒ
// <- snapshot 1 var array = []; for(var i = 0; i < 100000; i++)array[i] = {}; var wm = new WeakMap(); for(var i = 0; i < 100000; i++)wm.set(array[i], {}); // <- snapshot 2 array = null; // <- snapshot 3
ãã ããå Žåã«ãã£ãŠã¯ãã¡ã¢ãªãªãŒã¯ã®åé¡ãæ®ãããšããããŸããã³ã¬ã¯ã·ã§ã³ãªããžã§ã¯ããåé€ãããåŸãå€ã¯ããŒã«é¢é£ä»ãããããŸãŸã«ãªããããŒã§ãã£ããªããžã§ã¯ããåé€ããããŸã§ã¡ã¢ãªãªãŒã¯ãçºçããŸãããã®ãããã³ã¬ã¯ã·ã§ã³
WeakMap
ãããŒãããé·çãããããã«ã·ã¹ãã ãèšèšãã䟡å€ããããŸãã誰ããã¡ã¢ãªãªãŒã¯ã®åé¡ãåé¿ããããšããŠããŸãããããã¯é£è§£æ§ã®ã«ããŽãª- ãŸã£ããåãã±ãŒã¹ã§ã®ã¡ã¢ãªãªãŒã¯ã§ãããã®åé¡ã¯
å®è£
WeakSet
ã«æ®ããŸãããæå°åãããŸã-éããªããžã§ã¯ãã«ãªãå¯èœæ§ã®ããå€ã®ä»£ããã«ãã³ã¬ã¯ã·ã§ã³å ã®ååšãã©ã°ã®ã¿ãããŒã«ä¿åãããŸãã
ïŒ ECMAScriptã®6ïŒã€ãã¬ãŒã·ã§ã³
ECMAScript 6ã¯ãã€ãã¬ãŒã¿ãããã³ã«ãå°å ¥ããŸããããã¯ãã³ã¬ã¯ã·ã§ã³ã暪æããããã®æ®éçãªæ¹æ³ãªã©ã§ããæ§æçãªæ§é ãããã«é©çšãããããããããã«ã€ããŠãèæ ®ããŸãããããããããŸã第äžã«ãããã¯æšæºã©ã€ãã©ãªãŸãã¯æ§æã®äžéšã§ã¯ãªããæŠå¿µã§ããã€ãã¬ãŒã¿ãããã³ã«ã«ã¯ä»¥äžãå«ããããšãã§ããŸãã
- ïŒã€ãã¬ãŒã¿ã€ã³ã¿ãŒãã§ã€ã¹
- ïŒå埩å¯èœãªããžã§ã¯ãã®ã€ã³ã¿ãŒãã§ãŒã¹ãã·ã³ãã«
Symbol.iterator
- ïŒãžã§ãã¬ãŒã¿ãŒ
- ïŒãµã€ã¯ã«
for-of
- ïŒçµã¿èŸŒã¿ã³ã³ã¹ãã©ã¯ã¿ã®ã€ãã¬ãŒã¿ã€ã³ã¹ã¿ã³ã¹ãšããããè¿ãã¡ãœãã
- ïŒå埩å¯èœãªãªããžã§ã¯ããåãå ¥ããã¡ãœãããšã³ã³ã¹ãã©ã¯ã¿ãŒ
- ïŒã¹ãã¬ããæŒç®å
- ïŒé å/ãžã§ãã¬ãŒã¿ãŒã®å å è¡šèš
æ§æã¯ããã®äžéšã§ããããããã®ç« ã§ã¯
$for
ããããã®æ§ææ§æã®æ©èœã®äžéšãå®è£ ããã¢ãžã¥ãŒã«ãæ€èšããŸããã©ã€ãã©ãªãïŒES6 +ããªããã»ããµã§äœ¿çšããå Žåã¯ããã®ã¢ãžã¥ãŒã«ãªãã§å®å šã«ãã«ãã§ããŸãã
ïŒ ã€ãã¬ãŒã¿ã¯ã
.next
ãã£ãŒã«ããæã€ãªããžã§ã¯ããè¿ãã¡ãœãããæã€ãªããžã§ã¯ãã§ã
.done
-ã€ãã¬ãŒã¿ã®ãã©ããŒã¹ãå®äºãã
.value
çŸåšã®ã¹ãããã®å€ã§ããäŸã¯ãæ£ã®æ°ã®å埩åãäœæããã¡ãœããã§ããããã«ããã0ããæå®ãããæŽæ°ïŒ sandboxïŒãŸã§ã®ãã¹ãŠã®æŽæ°ããã€ãã¹ã§ããŸãã
function NumberIterator(number){ var i = 0; return { next: function(){ return i < number ? {done: false, value: i++} : {done: true}; } } } var iter = NumberIterator(3); iter.next(); // => {done: false, value: 0} iter.next(); // => {done: false, value: 1} iter.next(); // => {done: false, value: 2} iter.next(); // => {done: true}
ïŒ å埩å¯èœãªããžã§ã¯ãïŒå埩å¯èœïŒ-
Symbol.iterator
å埩åãè¿ãã¡ãœãããããŒã«å«ããªããžã§ã¯ãããããã£ãŠãå埩åãå埩å¯èœã«
Symbol.iterator
ããã«ã¯ããè¿ãããŒã«ããã¡ãœãããå¿ èŠ
this
ã§ããããšãã°ãæ°åãå埩å¯èœã«ããŸãïŒ sandboxïŒïŒ
Number.prototype[Symbol.iterator] = function(){ return NumberIterator(this); } Array.from(10); // => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ã«æ³šæããŠãã ãã
Symbol.iterator
ã Firefoxã¯ã€ãã¬ãŒã¿ãããã³ã«ããµããŒãããŠããŸãããå®å®ãããã«ãã§ã¯ïŒæåã¯ãŸã ãªãã代ããã«
Symbol.iterator
æååã䜿çšãããŸã
"@@iterator"
ãã·ã³ãã«ã¯ããã€ããªãŒãã«ããããã³ã§ããç»å ŽããŸãã
Symbol.iterator
ããæååã¯ã€ãã¬ãŒã¿ãããã³ã«ã§åŒãç¶ã䜿çšãããŸã
"@@iterator"
ã Firefoxã®ã€ãã¬ãŒã¿ãããã³ã«ãå£ããªãããã«ãã©ã€ãã©ãªå ã§ãããŒ
Symbol.iterator
ïŒååšããªãå Žåã¯äœæïŒãšããŒã®äž¡æ¹ã§ã€ãã¬ãŒã¿ãååŸããã¡ãœãããè€è£œããŸã
"@@iterator"
ã v8ã§ã¯ãChrome 38ã«ã€ãã¬ãŒã¿ãããã³ã«ãå®å šã«ãµããŒããããŸããã
ïŒ Generator-äžæåæ¢ã§ããæ©èœãæ¡åŒµã€ãã¬ãŒã¿ã€ã³ã¿ãŒãã§ã€ã¹ãæã€ãªããžã§ã¯ããè¿ããŸããæ§æã«ã€ããŠã¯è©³ãã説æããŸãããããšãã°ããã®èšäºãåç §ããŠãã ãããããªããã»ããµã®å Žåãããããææªã®éšåã¯ECMAScript 6ã§ãããžã§ãã¬ãŒã¿ã䜿çšããå Žåã®å埩å¯èœãªæ°å€ã®äŸã¯ãéåžžã«åçŽã«èŠããŸãïŒ sandboxïŒã
Number.prototype[Symbol.iterator] = function*(){ for(var i = 0; i < this;)yield i++; } Array.from(10); // => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
ïŒ ã«ãŒãã¯
for-of
å埩å¯èœãªãªããžã§ã¯ãããã€ãã¹ããããã«èšèšãããŠããŸããå埩å¯èœãªæ°å€ã䜿çšããäŸã§ã¯ã次ã®ããã«æ©èœããŸãïŒ sandboxïŒïŒ
for(var num of 5)console.log(num); // => 0, 1, 2, 3, 4
ïŒã§ã®ECMAScript 6 iskaropkiãç¹°ãè¿ã
String, Array, Map, Set
ãš
Arguments
ãããã«ã
Array, Map
ãããã«
Set
ã¯ã¡ãœããã
.keys, .values
ãã
.entries
ãããããããŒãå€ãããã³ããŒãšå€ã®ãã¢ã®å埩åãè¿ããŸããCore.jsã¯ãããŒã¿ã€ãã¬ãŒã¿ãšã¡ãœãããè¿œå ããŸããã«ãŒããšãšãã«ã
for-of
次ã®ããã«ãªããŸãïŒ sandboxïŒïŒ
var string = 'abc'; for(var val of string)console.log(val); // => 'a', 'b', 'c' var array = ['a', 'b', 'c']; for(var val of array)console.log(val); // => 'a', 'b', 'c'. - .values for(var val of array.values())console.log(val); // => 'a', 'b', 'c' for(var key of array.keys())console.log(key); // => 0, 1, 2 for(var [key, val] of array.entries()){ console.log(key); // => 0, 1, 2 console.log(val); // => 'a', 'b', 'c' } var map = new Map([['a', 1], ['b', 2], ['c', 3]]); for(var [key, val] of map){ // - .entries console.log(key); // => 'a', 'b', 'c' console.log(val); // => 1, 2, 3 } for(var val of map.values())console.log(val); // => 1, 2, 3 for(var key of map.keys())console.log(key); // => 'a', 'b', 'c' for(var [key, val] of map.entries()){ console.log(key); // => 'a', 'b', 'c' console.log(val); // => 1, 2, 3 } var set = new Set([1, 2, 3, 2, 1]); for(var val of set)console.log(val); // => 1, 2, 3. - .values for(var val of set.values())console.log(val); // => 1, 2, 3 for(var key of set.keys())console.log(key); // => 1, 2, 3. .keys .values for(var [key, val] of set.entries()){ // Set .entries console.log(key); // => 1, 2, 3 console.log(val); // => 1, 2, 3 } var list = (function(){return arguments})(1, 2, 3); for(var val of list)console.log(val); // => 1, 2, 3
- å®éã®Firefoxã«ã¯ãiteratorãé€ãããããã¹ãŠã®ã€ãã¬ãŒã¿ãŒããããŸã
arguments
ããµã€ã¯ã«ã¯æ©èœããŸãããç¬èªã®å»æ¢ããããããã³ã«ã«åºã¥ããŠããŸãã - v8ã§ã¯ã
for-of
Chrome 38ããå§ãŸãã«ãŒãã¯ïŒã¢ã¬ã€ã®ç Žå£ãé€ããŠïŒæ£ããæ©èœãããé€ããã¹ãŠã®ããŒã¿å埩åã䜿çšå¯èœã§ãarguments
ãå€ãããŒãžã§ã³ïŒãã©ã°ä»ãïŒã§ã¯ãå埩å¯èœãªãªããžã§ã¯ãã§ã¯ãªãå埩åãå¿ èŠã§ããã - IEã§ã¯ããã¡ããããã®ã«ãŒãã¯ãŸã æ©èœãããã€ãã¬ãŒã¿ãŒã¯ãããŸããã
ïŒãã®ãµã€ã¯ã«ã®æ§æãµããŒãã§ã¯ãã¹ãŠãéåžžã«æªãã®ã§ãES6 +ããªããã»ããµã䜿çšããªã人ã®ããã«ãåæ§ã®æ©èœ
for-of
ïŒ sandboxïŒãå®è£ ãããã«ããŒãã©ã€ãã©ãªã«è¿œå ããŸãã
$for(new Set([1, 2, 3, 2, 1])).of(function(it){ console.log(it); // => 1, 2, 3 }); // 2 $for - entries - 2 $for([1, 2, 3].entries(), true).of(function(key, value){ console.log(key); // => 0, 1, 2 console.log(value); // => 1, 2, 3 }); // 2 .of - $for('abc').of(console.log, console); // => 'a', 'b', 'c' // , false $for([1, 2, 3, 4, 5]).of(function(it){ console.log(it); // => 1, 2, 3 if(it == 3)return false; });
ïŒãªããžã§ã¯ãã®ãããã¿ã€ã
arguments
ã¯-
Object.prototype
ã§ããããã€ãã¬ãŒã¿ããããã¿ã€ãã«å ¥ããã¡ãœããã眮ãããšã¯ã§ããŸããããã€ãã£ããªããžã§ã¯ããæ¡åŒµããã«ã core.jsãã©ã€ãã©ãªãšããŠãã«ããããªãã·ã§ã³ããããŸãããããã®çç±ãããæã ã¯ããªããžã§ã¯ããå埩å¯èœã§ãããã©ããããã¹ãããã«ã¯ããã«ããŒã®ã«ããã«ãå®è¡ããã€ãã¬ãŒã¿ãªããžã§ã¯ããååŸãã-
$for.isIterable(foo)
ã¢ããã°ãšããŠ
Symbol.iterator in foo
ããã³
$for.getIterator(foo)
ã¢ããã°ãšããŠ
foo[Symbol.iterator]()
ïŒ
var list = (function(){return arguments})(1, 2, 3); console.log($for.isIterable(list)); // => true console.log($for.isIterable({})); // => false var iter = $for.getIterator(list); console.log(iter.next()); // => {value: 1, done: false} console.log(iter.next()); // => {value: 2, done: false} console.log(iter.next()); // => {value: 3, done: false} console.log(iter.next()); // => {value: undefined, done: true}
ïŒã§ã®ECMAScript 6ã€ã®ã€ãã¬ãŒã¿ãåæåããããã«äœ¿çšãããŠããïŒã³ã¬ã¯ã·ã§ã³
Map, Set, WeakMap, WeakSet
ãé åãåŸã«ïŒã
Array.from
èªåã®äºæ³æ¹æ³
Promise.all, Promise.race
ã§ä»äºã«ïŒçŽæã
ïŒé¢æ°ãã³ã³ã¹ãã©ã¯ã¿ãŒãããã³é åãªãã©ã«ãåŒã³åºããšãã«é©çšãããã¹ãã¬ããæŒç®åããå埩å¯èœãªãªããžã§ã¯ããå¿ èŠãšããŸãããããã¯æšæºã©ã€ãã©ãªããã¯ã»ã©é ããããã¯ã§ããä»ãã䜿çšããããšããèŠæããããŸã-æ¯ã®äžã®ããªããã»ããµãäŸïŒ
[...new Set([1, 2, 3, 2, 1])]; // => [1, 2, 3] console.log(1, ...[2, 3, 4]); // => 1, 2, 3, 4 var map = new Map([[1, 'a'], [2, 'b']]); new Array(...map.keys(), 3); // => [1, 2, 3]
ïŒä»ã®ãã¹ãŠã®å Žåãé å/ãžã§ãã¬ãŒã¿ãŒå å è¡šèšïŒé å/ãžã§ãã¬ãŒã¿ãŒã®æœè±¡åïŒïŒã€ãã¬ãŒã¿ãŒãããã³ã«ã«ãå±ããŸãã以åã¯ECMAScript 6ãã©ããã«å«ãŸããŠããŸãããã Firefoxã§ã¯é·ãéãµããŒããããŠããŸããããECMAScript 7ãŸã§å»¶æãããŸãããããã¯ããã£ã«ã¿ãŒåŠçãšå€æã䜿çšããŠãå埩å¯èœãªãªããžã§ã¯ãããé åãŸãã¯ã€ãã¬ãŒã¿ãŒãçæããæ©èœã§ããã€ãŸã æ§æ
filter
ããã³
map
ä»»æã®iteriruemuhãªããžã§ã¯ãã«ã€ããŠãæåŸã®é åã®ç Žå£ã¯ãµããŒããããŠããŸããããFFã§åäœããäŸãé€ããŸãããã¹ãŠã6to5ãšTraceurã§æ©èœããŸããäŸïŒ
var ar1 = [for(i of [1, 2, 3])i * i]; // => [1, 4, 9] var set = new Set([1, 2, 3, 2, 1]); var ar2 = [for(i of set)if(i % 2)i * i]; // => [1, 9] var iter = (for(i of set)if(i % 2)i * i); iter.next(); // => {value: 1, done: false} iter.next(); // => {value: 9, done: false} iter.next(); // => {value: undefined, done: true} var map1 = new Map([['a', 1], ['b', 2], ['c', 3]]); var map2 = new Map((for([k, v] of map1)if(v % 2)[k + k, v * v])); // => Map {aa: 1, cc: 9}
ç§ã«é¢ããŠã¯-çŽ æŽãããããšã§ãããããåãªãæ§æã§ãã
ïŒ ES6ããªããã»ããµã䜿çšããäºå®ããªã人ã®ããã«ãã¢ãžã¥ãŒã«ã®äžéšãšããŠãåæ§ã®çµ¶å¯Ÿçãªèªè»¢è»ãè¿œå ããŸã
$for
ãåŒã³åºãã
$for
ã€ãã¬ãŒã¿é«åºŠãªæ¹æ³ãè¿ã
of
ãäžã
filter, map
ããã³
array
ãã¡ãœãã
filter
ãšã¯
map
ãã€ãã¬ãŒã¿ãè¿ããŸããããã«ãããåã®ã€ãã¬ãŒã¿ã®å€ããã£ã«ã¿ãªã³ã°ãŸãã¯å€æããŸãããã®å埩åã¯ãå埩åãšåãã¡ãœããã«ãã£ãŠæ¡åŒµãããŸã
$for
ããã®ã¡ãœãã
array
ã¯ãçŸåšã®ã€ãã¬ãŒã¿ãé åã«å€æãããªãã·ã§ã³ã®ãããã³ãŒã«ããã¯ãåãå ¥ããŸããããããã¹ãŠã®ã¡ãœããã«ã¯ã2çªç®ã®ãªãã·ã§ã³ã®åŒæ°ãå®è¡ã³ã³ããã¹ãããããŸãã
$for
ãã©ã°ãåãå ¥ããå Žå
entries
ããã§ãŒã³å ã®ãã¹ãŠã®ã³ãŒã«ããã¯ã¯ãåŒæ°ã®ãã¢ã§èµ·åãããŸãã
äŸïŒ
var ar1 = $for([1, 2, 3]).array(function(v){ return v * v; }); // => [1, 4, 9] var set = new Set([1, 2, 3, 2, 1]); var ar1 = $for(set).filter(function(v){ return v % 2; }).array(function(v){ return v * v; }); // => [1, 9] var iter = $for(set).filter(function(v){ return v % 2; }).map(function(v){ return v * v; }); iter.next(); // => {value: 1, done: false} iter.next(); // => {value: 9, done: false} iter.next(); // => {value: undefined, done: true} var map1 = new Map([['a', 1], ['b', 2], ['c', 3]]); var map2 = new Map($for(map1, true).filter(function(k, v){ return v % 2; }).map(function(k, v){ return [k + k, v * v]; })); // => Map {aa: 1, cc: 9}
ãªãã©ã«ã§ã¯ãES5ã®é¢æ°ã¯ããæ±ãã«ããã§ãããç¢å°é¢æ°ã§ã¯ãæ§æç解ã䜿çšããã®ãšã»ãŒåãã«ãªããŸãã
å埩åã«å¯Ÿããä»ã®æäœãã¢ãžã¥ãŒã«
$for
ã«è¿œå ããããšãã§ããŸããããã«ãããå埩å¯èœãªãªããžã§ã¯ãããã©ããŒã¹ããã³å€æããæ®éçã§æ zyãªïŒå埩åãããã³ã«ãªã©ïŒæ¹æ³ãæäŸãããŸããããããå°æ¥ã®ããã«å»¶æããŸãããŸãã¯å€åå°çã«ã
ã©ã€ãã©ãªã¯ããã«2ã€ã®ã€ãã¬ãŒã¿ïŒïŒtimesãïŒtwoïŒãè¿œå ããŸããïŒ
Dict
ã³ã³ã¹ãã©ã¯ã¿ã¯å埩å¯èœãªãªããžã§ã¯ããæåŸ ããŸãããã€ãã¬ãŒã¿ã«é¢é£ä»ãããããã¹ãŠã®ãã€ã¯ããã®ç« ã«ãã©ãã°ããŸããã
ïŒ ECMAScriptã®6ïŒçŽæ
éåææ§ãšJavaScriptã¯ãå€ãã®äººã«ãšã£ãŠã»ãŒå矩èªã§ããããã¯ECMAScript 5æšæºã®éåææ§ã«ãããããŸã£ããäœããããŸããããªã©ã§ãã£ãŠãããã®ãããªåºæ¬çãªæè¡
setTimeout
ãš
setInterval
W3CãšWHATWGã®ãŠã§ãåºæºãèšããããŠããããããã«ã€ããŠïŒè©±ããå°ããæåã®ã¯ã©ã¹ã®ãªããžã§ã¯ããšããŠæ©èœããªãéããã³ãŒã«ããã¯ã®è»¢éã¯äŸ¿å©ã§ããããã«ãããã³ãŒã«ããã¯hellãçºçããŸããéåæé¢æ°ã®äžŠåããã³é 次å®è¡ãç°¡çŽ åãã1ã€ã®æ¹æ³ã¯ãasync.jsãªã©ã®ã©ã€ãã©ãªã䜿çšããããšã§ãã
éåæããã°ã©ãã³ã°ãç°¡çŽ åããå¥ã®ã¢ãããŒãã¯ãPromiseãã³ãã¬ãŒãã§ããéåæé¢æ°ãè¿ãããšãã§ããpromiseãªããžã§ã¯ãã䜿çšããŠããã®çµæããµãã¹ã¯ã©ã€ãã§ããŸããçµæããµãã¹ã¯ã©ã€ãã§ããã¡ãœããã¯ãæ°ãããããã¹ãè¿ããŸããããã¯ããããã¹ããã§ãŒã³ã«é 眮ããããšã«ãããã³ãŒããããé©åã«æ§æããã®ã«åœ¹ç«ã¡ãŸãããŸããPromiseã¯ãšã©ãŒåŠçã®åé¡ã解決ããŸããéåæã³ãŒãã§
try-catch
ã¯æ©èœãããã³ãŒã«ããã¯åŒæ°ã§ãšã©ãŒãæž¡ãå¿ èŠããããã³ãŒããããã«æ··ä¹±ããå ŽåããããŸãã promiseãã§ãŒã³ã®æåŸã«ãã¡ãœãã
reject
ãšthrowã®äž¡æ¹ã§ã¹ããŒããããã¹ãçºçããå¯èœæ§ããããŸã
throw
ãQãRSVPã®
ãããªPromiseã©ã€ãã©ãªãäžè¬çã§ããæéãçµã€ã«ã€ããŠãæšæºãç»å ŽããŸããPromises / A +ããã¹ãŠã®ãããã¹ã¯éåæã«è§£æ±ºãããã¡ãœããã䜿çšããŠçµæããµãã¹ã¯ã©ã€ãã§ããŸã
.then
ïŒæåã®åŒæ°ã¯æ£åžžçµäºæã«å®è¡ãããé¢æ°ã2çªç®ã¯ãšã©ãŒãçºçããå ŽåïŒã
ãã®ãããéåæã³ãŒãã§ã®äœæ¥ãæçµçã«æšæºåããããã«ãECMAScript 6 ã¯Promises / A +æšæºãšäºææ§ããããã»ãšãã©ã®æ©èœãæå°éã«æããªãããpromiseå®è£ ãè¿œå ããŸããããããã«ã€ããŠã¯ç¹ã«èª¬æããŸããã詳现ã«ã€ããŠã¯ãã¡ãïŒç¿»èš³ã§ãããå°ãæ代é ãã§ãïŒããã¡ããŸãã¯ãã¡ããã芧ãã ããã ES6 Promiseã¯v8ãšFirefoxã§ãã§ã«å©çšå¯èœã§ããããªãã¡ã€ã«ããããŸã-es6-promiseãšnative-promise-onlyã
ïŒã®ECMAScript 6ã®çŽæã®å®æœã¯ãã³ã³ã¹ãã©ã¯ã¿ã§
Promise
2ã³ãŒã«ããã¯ãæž¡ãããé¢æ°ããåãå ¥ãã-æåã¯ã第äºã«é害ãçºçããçŽæããããšãã§ããŸããããã«
then
ãES6 promiseã«ã¯ã¡ãœãããå«ãŸããŠããŸããããã¯ãæåã®åŒæ°ã
catch
çç¥ããå Žåã®çç¥åœ¢ã§ãã
then
ãããã䜿çšãããšãšã©ãŒããµãã¹ã¯ã©ã€ãã§ããŸããäŸïŒ
var log = console.log.bind(console); function sleepRandom(time){ return new Promise(function(resolve, reject){ // resolve , reject - // setTimeout(resolve, time * 1e3, 0 | Math.random() * 1e3); }); } log(''); // => sleepRandom(5).then(function(result){ log(result); // => 869, 5 . return sleepRandom(10); }).then(function(result){ log(result); // => 202, 10 . }).then(function(){ log(' '); // => throw Error('!'); }).then(function(){ log(' - '); }).catch(log); // => Error: '!'
ç§ã¯çŽæãšã³ãžã³ãæšæºã«å®å šã«é©å¿ãããã®ãé¢åã ã£ãã®ã§ãcore.jsã® promise ã«ãŒãã«ã¯ãã€ãã£ãã®çŽæã®ã¿ã®ã©ã€ãã©ãªã«åºã¥ããŠãããããããã³ãŒãã¯ã»ãšãã©æ®ã£ãŠããŸãããéåææ§ã確ä¿ããããã«
process.nextTick
ãå€çžæ§ïŒsetImmediateã®ã¡ãœããã䜿çšãããŸãã
ïŒãã«ããŒã®ãã¢ã¯ããããããæ£åžžã«å®äºããããŸãã¯æž¡ãããå€ã§ãšã©ãŒãçºçãããããã¹
Promise.resolve
ã
Promise.reject
è¿ããŸãã圌
Promise.resolve
ãçŽæãåãå ¥ããå Žåã圌ã¯ãããè¿ããŸãããŸããä»ã®thenableïŒããšãã°ãjQuery DeferredïŒãpromiseã«å€æããããã«äœ¿çšããããšãã§ããŸããæšæºã®å€ãããŒãžã§ã³ã§ã¯ããã®ããã®å¥ã®ã¡ãœããããããŸãã-
Promise.cast
ãäŸïŒ
Promise.resolve(42).then(log); // => 42 Promise.reject(42).catch(log); // => 42 Promise.resolve($.getJSON('/data.json')); // => ES6 promise
ïŒãã«ããŒ
Promise.all
ã¯ãæž¡ãããå埩å¯èœãªã³ã¬ã¯ã·ã§ã³ã®ãã¹ãŠã®ãããã¹ã解決ããããšãã«è§£æ±ºããããããã¹ãè¿ããŸãïŒv8ã§ã¯ãé åã§ã®ã¿æ©èœããããã«ãªããŸãããã©ã€ãã©ãªå ã§ãŸã ä¿®æ£ãéå§ããŠããŸãããä»ã®äœãã§äœ¿çšããæå³ã¯ãããŸããïŒãçŽæã§ã¯ãªãã³ã¬ã¯ã·ã§ã³ã®èŠçŽ ã¯ããéããŠçŽæã«å°ãã
Promise.resolve
ãŸããäŸïŒ
Promise.all([ 'foo', sleepRandom(5), sleepRandom(15), sleepRandom(10) // 15 - ]).then(log); // => ['foo', 956, 85, 382]
ïŒãã«ããŒ
Promise.race
ã¯åã®ãã®ãšäŒŒãŠããŸãããæž¡ãããã³ã¬ã¯ã·ã§ã³ããå°ãªããšã1ã€ã®ãããã¹ã解決ããããšè§£æ±ºããããããã¹ãè¿ããŸããç§ã®è¬èãªæèŠã§ã¯ããšã¯ç°ãªã
Promise.all
ãå®å šã«ã¯å°ãéããŸãããããã¯ç¡æå³ã§ãããã®å©ãããªããã°ãçŽæã解決ãããæéãå¶éããã®ãå°ãç°¡åã«ãªããŸããäŸïŒ
function timeLimit(promise, time){ return Promise.race([promise, new Promise(function(resolve, reject){ setTimeout(reject, time * 1e3, Error('Await > ' + time + ' sec')); })]); } timeLimit(sleepRandom(5), 10).then(log); // => 5 853 timeLimit(sleepRandom(15), 10).catch(log); // Error: Await > 10 sec
ïŒ ECMAScriptã®7ã§ææ¡ãããŠããå ããŠããããã§ãã£ãŠãçŽæããŠãéåæJavaScriptã¯ãå©äŸ¿æ§ã®é¢ã§æ¹åã®äœå°ããããéåæé¢æ°æ§æã®ããŒã¯ãŒããæ¡åŒµ
async / await
ã«åºã¥ããŠãããïŒçºé»æ©ãçºé»æ©ãšçŽæãªã¿ãŒã³ã®çŽæ:)ãã®æ§æã¯ããã§ã«ãµããŒããããŠããããš Traceurãããã³ 6to5ãäŸïŒ
var delay = time => new Promise(resolve => setTimeout(resolve, time)); async function sleepRandom(time){ await delay(time * 1e3); return 0 | Math.random() * 1e3; } async function sleepError(time, msg){ await delay(time * 1e3); throw Error(msg); } (async () => { try { log(''); // => log(await sleepRandom(5)); // => 936, 5 . var [a, b, c] = await Promise.all([ sleepRandom(5), sleepRandom(15), sleepRandom(10) ]); log(a, b, c); // => 210 445 71, 15 . await sleepError(5, '!'); log(' '); } catch(e){ log(e); // => Error: '!', 5 . } })();
ãããŠãPromiseã¯æšæºã®éåæJavaScript APIã®å€ããå€æŽããŸããã°ããŒãã«é¢æ°ã¯æ¢ã«æšæºåãããŠããŸãïŒpolyphilïŒ
fetch
-
XMLHttpRequest
ãããçŽæããã·ã³ãã«ã§äŸ¿å©ãªã©ãããŒããªãã¡ãŒã¯ãè¿œå ããããšç§ã¯ã·ã³ãã«ãè¿œå ãããšæããŸãããå€ãã®å Žåãå¿ èŠã«å¿ããŠãæ©èœ
delay
åã®äŸã®æ©èœãšåæ§ã«ãæå®ããæéåŸã«è§£æ±ºãããã®çŽæãè¿ã-ãããªãã
setTimeout
ããããã
delay
ããã®ã©ã€ãã©ãªã«è¿œå ãããšããã§ãããã
ïŒ Mozillaã®JavaScriptã®ïŒé åã®ã¡ãœããã®éçããŒãžã§ã³
äžèšã®ã€ãã¬ãŒã¿ãããã³ã«ã調ã¹ãŸãããããã¯ãJavaScriptã§ã³ã¬ã¯ã·ã§ã³ãã¯ããŒã«ããããã®å¯äžã®æšæºã§ã¯ãããŸãããããã·ã³ãã«ã§ãããéããããå€ããã®ããããŸãããããã¯é åã®ãããªãªããžã§ã¯ãã§ãã
JavaScriptã«ã¯é åã«å ããŠãJavaScriptã«é¡äŒŒããå€ãã®ãšã³ãã£ãã£ããããŸãããåæã«é åã¯ãããŸãããé åã®ãããªãããã®ãªããžã§ã¯ãã«ã¯ãã¹ãããå¯èœ
.length
ãªããŒïŒ0ã
.length
ïŒã«ããé·ããšèŠçŽ ãå«ãŸããŠããŸãããç©ŽããçºçããŸãããããã¯
Array.prototype
ããããå«ãŸããŠããããããããé åã¡ãœããããããŸãããããã¯ããªããžã§ã¯ã
arguments
ãæååïŒæ£åŒã«ã¯IE8 +ïŒãåä»ãé åïŒé åããã ãããèªäœã¯å«ãŸããŸãã
Array.prototype
ïŒãDOMèŠçŽ ã®ã³ã¬ã¯ã·ã§ã³ãjQueryãªããžã§ã¯ããªã©ã§ãã
ã»ãŒãã¹ãŠã®é åãããã¿ã€ãã¡ãœããã¯ãžã§ããªãã¯ã§ãïŒä»æ§å€æã¬ããŒããšããŠïŒ-ãæå³çã«æ±çšãæ©èœïŒãèµ·åãããã³ã³ããã¹ãã®ãªããžã§ã¯ããé åã§ããå¿ èŠã¯ãããŸããããã¶ã
.concat
ããã§ã¯ãªããå€ãã®äººããã®ãããªãã¶ã€ã³ã«ç²ŸéããŠãããšæããŸãïŒ
Array.prototype.slice.call(arguments, 1); // [].slice.call(arguments, 1);
é¢åã§äžæçã
ECMAScript 6ã¯ïŒ
Array.from
ã¡ãœãããè¿œå ããŸããããã«ãããå埩å¯èœãªé åã®ãããªãªããžã§ã¯ããé åã«ãã£ã¹ãã§ããŸãã
Array.from(arguments).slice(1);
ããã¯äŸ¿å©ã«æããŸãããå®ãã¯ãããŸãã-æãåçŽãªæäœã§ãã£ãŠããã»ãšãã©ã®å Žåãã€ãã¬ãŒã¿ãŒã®ããªãéããããã³ã«ãä»ããŠããªããžã§ã¯ãå šäœãé åã«ãã£ã¹ãããå¿ èŠããããŸãã
Mozillaã®JavaScript ããŒãžã§ã³1.6ã§ãããã«å¿ããŠ2005幎ã«Firefoxã§ãé åã¡ãœããã®éçããŒãžã§ã³ãé åã¡ãœãããšãšãã«è¿œå ãããåŸã«ECMAScript 5ã®äžéšã«ãªããŸããã圌ãã¯ECMAScriptã®ç¬¬5çãŸãã¯ç¬¬6çã«ã¯å ¥ããŸããã§ããããé·ãéStrawmanéçºãã©ã³ãã«ååšããŠããŸããããç§ã¯å人çã«ECMAScriptã®å°æ¥ã®ããŒãžã§ã³ã®1ã€ã«ç»å Žããããšãæã¿ãŸããããããã©ã€ãã©ãªã«è¿œå ããŸã-ãããã¯åºæ¬çã«å®è£ ãããŠããããã§ã«é²ç«å¯ŸçãæœãããŠãããããèªè»¢è»ã§ã¯ãªãæŸèæãšããŠåé¡ããŸãã
Array.slice(arguments, 1); Array.join('abcdef', '+'); // => 'a+b+c+d+e+f' var form = document.getElementsByClassName('form__input'); Array.reduce(form, function(memo, it){ memo[it.name] = it.value; return memo; }, {}); // => , {name: '', age: '42', sex: 'yes, please'}
ïŒé 延å®è¡ïŒsetTimeoutãsetIntervalãsetImmediate
ïŒ setTimeoutãsetInterval
ããããããã¹ãŠã®éåžžã§å§ãŸã
setTimeout
ãš
setInterval
ãå€ãã®äººã¯ãæšæºïŒW3CãWHATWGïŒã«åŸã£ãŠããããã®é¢æ°ãã³ãŒã«ããã¯ãšé 延æéã«å ããŠã転éãããã³ãŒã«ããã¯ãéå§ããè¿œå ã®åŒæ°ãåãããšãç¥ããŸãããããããããã§ã¯ããã€ãã®ããã«ãåé¡ã¯IEã«ãããŸããIE9ã§ã¯
setTimeout
ã
setInterval
2ã€ã®åŒæ°ã®ã¿ãåããããã¯è€æ°è¡ã®ã©ãããŒã§åŠçãããŸãã
// : setTimeout(log.bind(null, 42), 1000); // : setTimeout(log, 1000, 42);
ïŒ setImmediate
JavaScriptã¯ã·ã³ã°ã«ã¹ã¬ããã§ãããæã«ã¯éåžžã«è¿·æã§ããã¯ã©ã€ã¢ã³ãã§ã®é·æéã®éãã³ã³ãã¥ãŒãã£ã³ã°ã¯ããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ãäžæãããµãŒããŒã§ã¯ãåŠçãèŠæ±ããŸãããã®å Žåãéãã¿ã¹ã¯ã軜ããµãã¿ã¹ã¯ã«åå²ããéåæã§å®è¡ãããã®éã§å ¥åºåãè¡ãããšãã§ããŸãã
ãŸããJavaScriptã§ã¯ïŒãããŸã§ã®ãšããïŒæ«å°Ÿååž°ã¯æé©åãããŠããŸãããé¢æ°ãç¹å®ã®åæ°ã ãååž°çã«åŒã³åºããããšããšã©ãŒãçæãã
RangeError: Maximum call stack size exceeded
ãŸãããã®æ°ã¯ããã©ãããã©ãŒã ã«å¿ããŠãæ°çŸããæ°äžãŸã§å€åããŸããéåæååž°åŒã³åºãã¯ãã¹ã¿ãã¯ãªãŒããŒãããŒãé²ããŸãã確ãã«ãååž°åŒã³åºãã¯éåžžãéåžžã®ã«ãŒãã«ç°¡åã«æžãæãããããããæãŸããæ¹æ³ã§ãã
ãã®ãããªåé¡ã解決ããã«ã¯ã次ã䜿çšã§ããŸã
setTimeout
æå°éã®é 延ã§ããããéåžžã«ãã£ãããšå€æããŸããæå°
setTimeout
ä»æ§é 延ã¯4ããªç§ã§ãäžéšã®ãã©ãããã©ãŒã ã§ã¯ããã«é·ããªããŸããåèšãæ倧ãææ°ã®ãã©ãŠã¶ãŒã§ã¯1ç§ãããæ倧250åãããšãã°IE8ã§ã¯æ倧64åã®ååž°åŒã³åºããå¹æçãªé 延å®è¡ãè¡ãæ¹æ³ãããããããµã€ã¯ã«ããããšãå¿ èŠã§ãããå¿ èŠã§ãã
ç§ãNode.jsã«ããå Žå
process.nextTick
ãã¯ã©ã€ã¢ã³ããåŸ ããªãã£ããšããããå©ããæ¥ãŸããã IE10ã§ãMicrosoftã¯setImmediateã¡ãœãããè¿œå ããŸããããã®ã¡ãœããã¯ãI / Oãå®äºããçŽåŸã«å®è¡ããã¿ã¹ã¯ãèšå®ããW3Cãæšæºåããããšãææ¡ããŸããã圌ã¯åŸã®Node.jsã«ç»å ŽããŸãã FFãšChromiumã¯è¿œå ãæ¥ãã§ããŸããã人æ°ã®ãã®ããªã¥ãã§ã¢ã¹ã
é¢æ°ã®å¹æçãªé 延å®è¡ãå®è£ ããã«ã¯ãéåžžã«å€ãã®æ¹æ³ããããŸããããŸããŸãªãã©ãããã©ãŒã ã§æ倧ã®ããã©ãŒãã³ã¹ãå®çŸããã«ã¯ãå€ãã®ãã©ãããã©ãŒã ã䜿çšããå¿ èŠããããŸãïŒäžèšã®ããªãã£ãŒã«ã®ã¡ãœãããšåæ§ïŒãããã¯ïŒ
- Node.jsã®å€ãããŒãžã§ã³ã®å Žå-
process.nextTick
- ææ°ã®ãã©ãŠã¶ã®å Žå-
postMessage
- WebWorkersã®å Žå-
MessageChannel
- IE8ã®å Žå--
script.onreadystatechange
- ãããŠããããã®æ¹æ³ã圹ã«ç«ããªãã£ãå Žå-
setTimeout
æå°éã®é 延ã§
setImmediate(function(arg1, arg2){ console.log(arg1, arg2); // => }, ' ', ' '); clearImmediate(setImmediate(function(){ console.log(' '); }));
ããã«
setImmediate
ãããé«éãªä»£æ¿æ段-ã³ã³ã»ãã
asap
ïŒã§ããã ãæ©ããã©ã€ãã©ãªïŒ-å¯èœã§ããã°ããã€ã¯ãã¿ã¹ã¯ãäœæããŸããããã¯ãå ¥åºåã®åã«å®è¡ãããŸãããã®ãããªã°ããŒãã«ã¡ãœãããèšèªã®æšæºã«è¿œå ããtc39ã§èããŠãã ããããã¶ãããã¯ã©ã€ãã©ãªã«è¿œå ãããã¹ãã§ããïŒ
ïŒã³ã³ãœãŒã«
ã³ã³ãœãŒã«ã¯ããã©ãŠã¶ãŒãšãµãŒããŒã®äž¡æ¹ã§å¯äžã®æ±çšåºåããã³ãããã°ããŒã«ã§ããåæã«ãã³ã³ãœãŒã«ã¯ECMAScriptä»æ§ã®äžéšã§ã¯ãªãããŸã£ããæšæºåãããŠããŸãããæŸæ£ãããã¢ãŠãã©ã€ã³ä»æ§ãããããã¹ãŠã®ãã©ãããã©ãŒã ã§ã®å®éã®å®è£ ã¯ç°ãªããŸãã
ïŒ IE7ã§ã¯ãã³ã³ãœãŒã«ãå®å šã«æ¬ èœããŠããŸããäžéšã®ãã©ãŠã¶ã§ã¯ãããã€ãŒã³ãã«ã°ã³ã³ãœãŒã«ãã¯
console
ãŠãŒã¶ãŒãèŠèŽããŠãããšãã«ã®ã¿å®çŸ©ãããŸãããããŠããã¡ããããã¹ãŠã®ã¡ãœããããã¹ãŠã®ãã©ãããã©ãŒã ã§å©çšã§ããããã§ã¯ãããŸãããFirebug Liteã®ã¹ã¿ã€ã«ã§ã³ã³ãœãŒã«ãçºæããã®ã§ã¯ãªããã¡ãœããã®ã¹ã¿ããäœæããŠãå¯çšæ§ã確èªããã«ã¡ãœããã䜿çšã§ããããã«ããŸãã
// : if(window.console && console.log)console.log(42); // : console.log(42);
ïŒ Firefoxãšã¯ãã æ¹æ³ã³ã³ãœãŒã«ã§ã¯ãã³ã³ããã¹ãã䜿ãæããã¹ãã§ãã
console
ãããª-ããªãã¯ã³ãŒã«ããã¯ããã¯ã¿ã€æã£ãŠããããã«ããããäžãããã®ã§ããã°ãïŒã
console.log.bind(console)
ãIEãFirebugãããã³Node.jsã§ã¯ããã€ã³ãããã«æž¡ãããšãã§ããããã¯ã¯ããã«äŸ¿å©ã§ãããããã£ãŠãã¡ãœããããªããžã§ã¯ãã«ãã€ã³ãããŸã
console
ã
// : setTimeout(console.log.bind(console, 42), 1000); [1, 2, 3].forEach(console.log, console); // : setTimeout(console.log, 1000, 42); [1, 2, 3].forEach(console.log);
ãã ããããã§1ã€ã®åé¡ããããŸããäžéšã®ãã©ãããã©ãŒã ã§ã¯ãã³ã³ãœãŒã«ã¡ãœãããåŒã³åºããšãã«ãã¡ãœããã®åŒã³åºãå ã®è¡ã衚瀺ãããŸããã³ã³ãœãŒã«ããªãŒããŒã©ã€ãããå Žåã¯ããã®è¡ã¯ãã©ã€ã³ã«ãªããŸãsore.jsããããéèŠãªå Žåã¯ãã³ã³ãœãŒã«ã¢ãžã¥ãŒã«ãªãã§ã©ã€ãã©ãªãæ§ç¯ã§ããŸãã
ã³ã³ãœãŒã«ã¯æšæºåãããŠããªããããå°ããªã®ã£ã°ãè¿œå ããŸãã
ïŒã³ã³ãœãŒã«ãžã®åºåããªãã«ããæ©èœããã¡ãããæ¬çªç°å¢ã§ã¯ãã³ãŒãã«ã³ã³ãœãŒã«ã¡ãœããåŒã³åºããæ®ããã«ããã³ãŸãã¯ããé«åºŠãªããŒã«ã䜿çšããŠããããåé€ããæ¹ãè¯ãã§ãããããã¯äŸ¿å©ã§ãããå¿ ãããå¿ èŠã§ã¯ãããŸããã
console.disable(); console.warn(' , .'); console.enable(); console.warn(' .');
ã³ã³ããã¹ããã€ã³ãã£ã³ã°ãšã³ã³ãœãŒã«ãç¡å¹ã«ããæ©èœããããšãã°TheShockã®ãã®ã©ã€ãã©ãªã«ååšããŸãã
ïŒããŒã2ïŒèªè»¢è»
ãªãã·ã§ã³ãªãããªãã·ã§ã³ãªãã
ç§ã¯äžçã®ååã欲ããã£ã-èªè»¢è»ã«ååã
-äžæ¯ã®ã«ãŒã
ãã®èšäº/ã©ã€ãã©ãªã®æèã«ãããŠãèªè»¢è»ã¯ãã¹ãŠæšæºåãããŠããªãæ©èœã§ããå®éãç§ã®æèŠã§ã¯ãæšæºèšèªã©ã€ãã©ãªã«æ¬ ããŠãããã®ã¯ãããšãçŸåšå©çšå¯èœãªãã¹ãŠã®æšæºã«åŸã£ãŠå®è£ ãããŠããŠãã§ããããã«ã¯ãES7 +ã§æäŸããããã®ãå«ãŸããŸããããã¯ããããç¹°ãè¿ãã¬ãã¥ãŒãããããšãæåŠãããããšãããã»ã©é ãããã§ãã
ïŒããŒã¿åé¡
ïŒããã§ã¯ãå®å šã«å¹³å¡ãããå§ããŸãã JavaScriptã§ã¯ECMAScriptã®5ä»æ§ã®ããã«æã£ãŠãã 6ã€ã®ããŒã¿ã®çš®é¡ãïŒ
Undefined, Null, Boolean, String, Number
ãš
Object
ã ECMAScript 6ã¯ãå¥ã®ããŒã¿å-ïŒã
Symbol
è¿œå ããŸããããŒã¿ã®ã¿ã€ããå€å¥ããã«ã¯ãæŒç®åããããŸã
typeof
ãããã¯ãŸãã«ãããå ·äœçã«ã©ã®ããã«æ©èœãããã§ããã ãããæŽå²çã«ããšãã
typeof null
ãªã¿ãŒã³
'object'
ãšè§£æ±ºããããšãããšããŒã¢ããŒã§ãããã¯æåããŸããã§ãããã¿ã€ãã®
Object
typeof
å Žå
'object'
ã
'function'
å éšã¡ãœããã®å¯çšæ§ã«å¿ããŠããŸãã¯ãè¿ããŸã
[[Call]]
ãåèšãããšãæŒç®å
typeof
ã¯ããªããã£ãã®ããŒã¿åã®ã¿ãè¿ãããã¹ãŠã®ããªããã£ãã§ã¯ãããŸããã
å€æ°ã
null
åã«ããããšæ¯èŒããã ãã§ååã§ãããã®åŸ
Object
ãæ¯åäœçŸãã®ã³ãŒããèšè¿°ãããããã«ããŒãäœæããå¿ èŠããããŸãããã¡ãããããããããšãã§ããŸã-
Object(foo) === foo
ãããããã®è§£æ±ºçã¯æéãšã¯ã»ã©é ã -ããªããã£ãããªããžã§ã¯ãã«å°ããŸãã ES6ã®åæã®ãã©ããã§ã¯ã¡ãœãããååš
Object.isObject
ããŠããŸããããã©ããããããä¿®æ£ããè©Šã¿ã®ãã
typeof null
ã«åé€ãããŸããããŸããå€æ°ããªããžã§ã¯ããã©ããã確èªããã«ã¯ãåžžã«ããå¿ èŠããããŸããããã§ãã©ãã«ãç°¡åã«å®è£ ããããã«ããŒãè¿œå ããŸããã
Object.isObject
ïŒsandboxïŒïŒ
Object.isObject = function(it){ return it != null && (typeof it == 'object' || typeof it == 'function'); } // ... typeof {}; // => 'object' typeof isNaN; // => 'function' typeof null; // => 'object' Object.isObject({}); // => true Object.isObject(isNaN); // => true Object.isObject(null); // => false
ïŒãããããªããžã§ã¯ãã®åé¡ãããèå³æ·±ãããªãã¬ãŒã¿ãŒ
instanceof
ã¯ãããã¿ã€ããã§ãŒã³ããã§ãã¯ããŸãããããã¿ã€ããããªããžã§ã¯ããäœæããå ŽåããŸãã¯ãªããžã§ã¯ãããããã¿ã€ããšããŠèšå®
Function.prototype
ããå Žåãé¢æ°ã«ã¯ãªããŸãããã€ã³ã¹ã¿ã³ã¹ããããã£
constructor
ã¯äœãä¿èšŒã§ããŸããã
constructor.name
ãã³ãŒãå§çž®ã§ãã¹ãŠã®æå³ã倱ãã ãã§ãªããIEã¯ãŸã ãµããŒããããŠããŸãããå éšããããã£ã¯ããªããžã§ã¯ãã®åé¡ã«åœ¹ç«ã¡ãŸã
[[Class]]
ããããåŒãè£ãå¯äžã®æ¹æ³ã¯ãå€ãã®äººã«ãªãã¿ã®ããæããããã¶ã€ã³ã§ã
Object.prototype.toString.call(foo).slice(8, -1)
ãäŸïŒ
Object.prototype.toString.call(1).slice(8, -1); // => 'Number' Object.prototype.toString.call([]).slice(8, -1); // => 'Array' Object.prototype.toString.call(/./).slice(8, -1); // => 'RegExp'
å éšåä»ã¯ã©ã¹ã«åºã¥ããã»ãšãã©ã®ã©ã€ãã©ãªã¯ãåã®ãŠãŒãã£ãªãã£ã®ã»ããè¿œå ïŒã
Array.isArray
ïŒObject.is ã¿ã€ãã§ç ç³ã®ããã«ã¯ã_.is ã¿ã€ãã«Undescoreãªã©
ç§ãã¡ã¯ãç°ãªãåäœã- 1ã€ã®æ®éçãªæ¹æ³
Object.classof
ãããŒã¿ã®åé¡ã®ããã®å£°æãšåæ§ã«ã
typeof!
ã®LiveScriptïŒäŸïŒã
ããã«
Object.prototype.toString.call(foo).slice(8, -1)
ããã€ãã®åé¡ããããŸãïŒ
null, undefined
ããã³ã«é©çšå¯èœãªå€ãIEã§ã¯arguments
ããã®æ§é ã¯ãè¿ããŸã"Object"
ãããã¯ãè¿œå ã®ãã§ãã¯ã§ç°¡åã«åŠçã§ããŸãã- ECMAScript 6, ?
"Object"
.Object#toString
ECMAScript 6.
çªç¶ãECMAScript 6ã«ã¯éåžžããªã©ã®ãªããžã§ã¯ãã®å éšããããã£ããããŸãã
[[Class]]
ã
Object#toString
ES6ã¯ãç¹å¥ãªå éšããããã£ããã§ãã¯ããããšã«ãããå€æ°ã
Undefined, Null, Array, String, Arguments, Function, Error, Boolean, Number, Date
ãŸãã¯
RegExp
ã«å±ããŠããããšãè¿ããæ®ãã«ã€ããŠã¯ïŒæå㧠ãã³ããæ€çŽ¢ã
Symbol.toStringTag
ãŸããã¡ãœããããã³ããèŠã€ãããããçµã¿èŸŒã¿ã®ãã¯ã©ã¹ãã®ååã§ã¯ãªãå Žå-ãããè¿ããŸãããèŠã€ãããŸãã-
Object
ã
ããžãã¯ä¿®æ£
Object#toString
ã«èµ·å ããŠãå©çãïŒ1ãæå°ã®æªããã©æ¥œãããã°ãæã ã¯åæã«å£ãããšãªããIE8-ã§ãããè¡ãããšãã§ããŸã
for-in
ããã¡ããããã®ã¢ãããŒããmethodã«å®è£ ã
Object.classof
ãŸããããŒãã¹ãšããŠãã«ã¹ã¿ã ã³ã³ã¹ãã©ã¯ã¿ãŒã®ã€ã³ã¹ã¿ã³ã¹ãåé¡ããæ©èœããããŸããäŸïŒ
var classof = Object.classof; classof(null); // => 'Null' classof(undefined); // => 'Undefined' classof(1); // => 'Number' classof(true); // => 'Boolean' classof('string'); // => 'String' classof(Symbol()); // => 'Symbol' classof(new Number(1)); // => 'Number' classof(new Boolean(true)); // => 'Boolean' classof(new String('string')); // => 'String' var fn = function(){} , list = (function(){return arguments})(1, 2, 3); classof({}); // => 'Object' classof(fn); // => 'Function' classof([]); // => 'Array' classof(list); // => 'Arguments' classof(/./); // => 'RegExp' classof(new TypeError); // => 'Error' classof(new Set); // => 'Set' classof(new Map); // => 'Map' classof(new WeakSet); // => 'WeakSet' classof(new WeakMap); // => 'WeakMap' classof(new Promise(fn)); // => 'Promise' classof([].values()); // => 'Array Iterator' classof(new Set().values()); // => 'Set Iterator' classof(new Map().values()); // => 'Map Iterator' classof(Math); // => 'Math' classof(JSON); // => 'JSON' function Example(){} Example.prototype[Symbol.toStringTag] = 'Example'; classof(new Example); // => 'Example'
ïŒèŸæž
JavaScriptã§ã¯ããªããžã§ã¯ããšèŸæžïŒé£æ³é åïŒã¯1ã€ã§ããããã«ã¯é·æããããŸã-éåžžã«äŸ¿å©ãªããã§ãããJavaScriptãªããžã§ã¯ãã·ã¹ãã ã«åºã¥ããããŒã¿äº€æ圢åŒãéåžžã«äžè¬ç
JSON
ã§ããããã€ãã¹ã§ããããšã¯ç¡é§ã§ã¯ãããŸããã
èŸæžã®å ŽåãããŒã«ãã£ãŠèŠçŽ ãååŸããããšãšãããã¿ã€ãããã¡ãœãããååŸããããšã«éãã¯ãããŸãããããã¯ããªããžã§ã¯ãïŒããã³äžæ¬åŒ§ä»ãã®è¡šèšæ³ã§æå®ããããªããžã§ã¯ãïŒã®äžã«ãããã¿ã€ããããå Žå
Object.prototype
ãèŸæžã®åºæ¬æäœãäžæããŸãããªããžã§ã¯ãã®å Žåããããã¯æ¡åŒµåã®å¶é
Object.prototype
ã§ãã
ECMAScript 6ã§ã¯ããã§ã«è¿°ã¹ãæ°ããã¿ã€ãã®ããŒå€ã³ã¬ã¯ã·ã§ã³ãç»å ŽããŸãã
Map
ããã®é床ã¯ããªããžã§ã¯ãã®é床ãããéãå ŽåããããŸãïŒããèªäœã§ã¯ãå€çžæ§åç©ã«ã¯é©çšãããŸããïŒãã»ãšãã©ã®å Žåãããã¯çœ®ãæããããŸãããã§
Map
ãªããžã§ã¯ãèŸæžãšã¯ç°ãªããåçŽãªãªãã©ã«è¡šèšã¯ãããŸãããããããã£ãžã®ã¢ã¯ã»ã¹ã¯ã¡ãœãããä»ããŠè¡ãããŸã-ããã»ã©ç°¡æœã§ã¯ãããŸããã
Map
ãã¹ãŠã®äººã«æãããããš
JSON
ã¯æ±ºããŠãªããããã»ã©æ®éçã§ã¯ãããŸãããéåžžãèŸæžããŒã«ã¯æåå以å€ã«ã¯äœãå¿ èŠãããŸããã
- ïŒåé¡ïŒ
Object.prototype
ããã³èŸæž - ïŒã³ã³ã¹ãã©ã¯ã¿ãŒ
Dict
- ïŒãããã¿ã€ããæã€èŸæžãå®å šã«äœ¿çšããããã®ã¡ãœãã
- ïŒèŸæžãæäœããæ¹æ³
- ïŒèŸæžã®ç¹°ãè¿ã
- ïŒèŠèŸŒã¿å®¢
ïŒåé¡ïŒObject.prototypeãšèŸæž
ã§
Object.prototype
ãMozilla Developer Networkã«ãã£ãŠææ¡ãããŠããããã«ãå®è£ ã«å¿ããŠã以äžããããŸãã
Object.prototype.constructor(); Object.prototype.hasOwnProperty(); Object.prototype.isPrototypeOf(); Object.prototype.propertyIsEnumerable(); Object.prototype.toLocaleString(); Object.prototype.toString(); Object.prototype.valueOf(); Object.prototype.__proto__; Object.prototype.__count__; Object.prototype.__parent__; Object.prototype.__noSuchMethod__; Object.prototype.__defineGetter__(); Object.prototype.__defineSetter__(); Object.prototype.__lookupGetter__(); Object.prototype.__lookupSetter__(); Object.prototype.eval(); Object.prototype.toSource(); Object.prototype.unwatch(); Object.prototype.watch();
ããã¯ã©ã®ããã«ç§ãã¡ãè ããããšãã§ããŸããïŒ
ããªããã£ããªé»è©±åž³ãããããŠãŒã¶ãŒããã®APIã«ã¢ã¯ã»ã¹ã§ãããšããŸãã
var phone = (function(){ var db = { '': '+7987654', '': '+7654321' }; return { has: function(name){ return name in db; }, get: function(name){ return db[name]; }, set: function(name, phone){ db[name] = phone; }, delete: function(name){ delete db[name]; } }; })();
ç§éã¯åŸãïŒ
console.log(phone.has('')); // => true console.log(phone.get('')); // => '+7987654' console.log(phone.has('')); // => false console.log(phone.get('')); // => undefined console.log(phone.has('toString')); // => true console.log(phone.get('toString')); // => function toString() { [native code] }
ããããã£ã¯ãååšããªãå Žåããããã¿ã€ããã§ãŒã³ããååŸããã
in
åæ§ã«ãã®ååšããã§ãã¯ããŸãããããã¿ã€ããã§ãŒã³ãèæ ®ããã«ããªããžã§ã¯ãã®ããããã£ã®ååšããã§ãã¯
in
ããã¡ãœãã
hasOwnProperty
ã§è¿œå /眮ãæããŸããããç§éã¯åŸãïŒ
// ... has: function(name){ return db.hasOwnProperty(name); }, get: function(name){ if(db.hasOwnProperty(name))return db[name]; }, // ... console.log(phone.get('')); // => '+7987654' phone.set('hasOwnProperty', '+7666666'); // "" console.log(phone.get('')); // TypeError: string is not a function
ç¹ã«ãé»è©±åž³ãããµãŒããŒåŽã«ããå Žåã¯ç¹ã«æ·±å»ã§ãããããã¿ã€ãã¡ãœããã¯ãªãŒããŒã©ã€ãã§ããŸãããããã£ãŠã
hasOwnProperty
ãªããžã§ã¯ãããçµã³ä»ããããŠããªãã¡ãœããã䜿çšããå¿ èŠããããŸãã誰ã«ãšã£ãŠãé¢åãªãã§ãã¯ã䜿çšããå¿ èŠããããŸããã»ãŒãã®ãããªãŽãïŒ
// ... has: function(name){ return Object.prototype.hasOwnProperty.call(db, name); }, get: function(name){ if(Object.prototype.hasOwnProperty.call(db, name))return db[name]; }, // ...
èšèªã§ãã®åé¡ã解決ããããã«ãããããã£ãã«äŒŒãç¬èªã®ããããã£ã§ããå Žåãæ€èšŒæŒç®åã圹ç«ã¡
in
ãŸãã
åé¡ã¯çµãã£ããšæ±ºããŸãããïŒæ¬¡ã®ãããªãã®ã¯ãããŸããïŒ
phone.set('__proto__', '+7666666'); // "" console.log(phone.get('__proto__')); // => undefined
ã§ã¯
Object.prototype
ããéæ³ãã®getter / setterã¡ãœããããã
__proto__
ãã¡ãŒãžã«ãäŸãã°ãããããã£ã暪æãããšã-ãã®ããŒã¯ç¡èŠããããªããžã§ã¯ããããããã«ããªããã£ãã®èšå®ããå€ããšã³ãžã³ã«ã¯ãä»ã®ãããžãã¯ãããããã£ããããŸãããããã§åœ¹ç«ã€ã®ã¯
Object.defineProperty
ïŒãµã³ããã¯ãµãŒïŒã®ã¿ã§ãã
// ... set: function(name, phone){ Object.defineProperty(db, name, { enumerable : true, configurable: true, writable : true, value : phone }); }, // ...
ç¹ã«è©±ãããªãèŸæžããã€ãã¹ã«ã€ããŠ-ããã¯æ¬åœã«æªãã§ã¯ãªãå Žåã¯ãèŸæžã暪æãããšããèŸæžã¯æ§è³ªperecheslyatãããã¿ã€ããå«ãŸããŠããªã
for-in
ãããªãã¯ãã¹ããªãã§è¡ãããšãã§ããŸã
hasOwnProperty
ãããã¯ãã ã®ãã°ã§ã ïŒãåæäžå¯èœãªåæå¯èœãããããã£
for-in
ã¯
Object.prototype
ããããé 眮ãããŠããèŸæžãä»ããŠãå€ãIEã§ã¯å£ã£ãŠããŸãã
ECMAScript 5ã«ã¯ããããã¿ã€ããªãã§ãªããžã§ã¯ããäœæããæ¹æ³ããããŸã-
Object.create(null)
æåããææ¡ãããã¡ãœããïŒsandboxïŒã®å®è£ ã䜿çšã§ããŸãïŒ
var phone = (function(){ var db = Object.create(null); Object.assign(db, { '': '+7987654', '': '+7654321' }); return { has: function(name){ return name in db; }, get: function(name){ return db[name]; }, set: function(name, phone){ db[name] = phone; }, delete: function(name){ delete db[name]; } }; })();
ãã¹ãŠãçŽ æŽãããããã®äœæãšåæåã ã
Object.assign
ããéåžžã«ã³ã³ãã¯ãã§ã¯ãããŸããã
ãã®ãããªèŸæžã«ã¯ãããã¿ã€ãããªããã
toString
ãã¡ãœãããšã¯ãããŸãã
valueOf
ãããã¯ã©ã®ããã«ç§ãã¡ãè ãããŸããïŒ
- ããšãã°
+Object.create(null)
ãæ°åãæååã«ãã£ã¹ãããããšã¯ã§ããŸãã'' + Object.create(null)
-TypeError
- ãããã£ãŠããªããžã§ã¯ããæœè±¡çåŒã¢ã«ãŽãªãºã ãããšãã°
==
ããªããã£ããšæ¯èŒããããšã¯ã§ããŸãã-TypeError
ïŒã³ã³ã¹ãã©ã¯ã¿ãŒDict
ãã®ãããèŸæžãäœæããŠ
Object.create(null)
èšå ¥ããã®ã¯ãèŸæžãäœæãããããã¯ããã«é¢åã§ã
{}
ããã¡ãããæãçŸãã解決çã¯ããªãã©ã«ã®èšèªã«èŸæžãè¿œå ããããšã§ãããããã¯ãå°ãªããšãçæçã«ã¯ãããããããªãããšã§ãããªãã©ã«ã«ããåæåã®å¯èœæ§ã¯ãããŸãããèšé²ããããŸããã
{__proto__: null, foo: 'bar'}
ã©ãã§ããµããŒããããŠããŸãããçŸæç¹ã§ã¯ã³ãŒãã®æé©åã«ã€ãªãããŸãããããã§ãããªãé¢åã§ããããªãèå³æ·±ã決å®
ãè°è«ãããŸãã- éèšãšããŠãã³ã³ã¹ãã©ã¯ã¿ãŒããäœæãã
Dict
Object.create(null)
ããããä»ã©ã®ããã«ãªã£ãŠããã®ãããããäœãããŠããã®ããç§ã«ã¯ããããŸãããããããå°ãæ¡å€§ããŠã¿ãŠã¯ã©ãã§ããããïŒåæã«ããªããžã§ã¯ããèŸæžãšããŠæ±ãããã®ã¡ãœããã®åå空éãååŸããŸããã€ãã¬ãŒã¿
entries
ãŸãã¯ã€ãã¬ãŒã¿ã®ãªããªããžã§ã¯ãã§åæåããæ©èœãè¿œå ããŸããããã¯ãèŸæžã®ããŒãžã§ã³çªå·ã®
Array.from
ãããªãã®ã§ãã
以æ¥
Dict() instanceof Dict
ãããã¯åäœããŸããããšïŒ
Object.classof(Dict())
æ»ã
'Object'
ãèŸæžã®èå¥æ¹æ³ã«è¿œå ããŸã
Dict.isDict
ã
倧äœãã®ãããªïŒ
function Dict(props){ var dict = Object.create(null); if(props != null){ if(Symbol.iterator in props){ for(var [key, val] of props)dict[key] = val; } else Object.assign(dict, props); } return dict; } Dict.prototype = null; Dict.isDict = function(it){ return Object.isObject(it) && Object.getPrototypeOf(it) === null; } // ... var map = new Map([['a', 1], ['b', 2], ['c', 3]]); Dict(); // => {__proto__: null} Dict({a: 1, b: 2, c: 3}); // => {__proto__: null, a: 1, b: 2, c: 3} Dict(map); // => {__proto__: null, a: 1, b: 2, c: 3} Dict([1, 2, 3].entries()); // => {__proto__: null, 0: 1, 1: 2, 2: 3} Dict((for([k, v] of map)if(v % 2)[k + k, v * v])); // => {__proto__: null, aa: 1, cc: 9} Dict.isDict({}); // => false Dict.isDict(Dict()); // => true
ïŒãããã¿ã€ããæã€èŸæžãå®å šã«äœ¿çšããããã®ã¡ãœãã
ãã£ã¯ã·ã§ããªã®ããã«ããã®äžã«ãããã¿ã€ãããããªããžã§ã¯ãã§äœæ¥ããå¿ èŠãããå Žåãç¬èªã®ããããã£ã§å®å šã«äœæ¥ããããã®ã¡ãœãããè¿œå ããŸãã
Dict.has
-é³è ãªéçããŒãžã§ã³
hasOwnProperty
ããã©ããã®ECMAScript 6ã¯ãã¢ãžã¥ãŒã«
Reflect
-ã®ããã®ãã©ã°ã®ã»ãã
Proxy
æ¹æ³ã®éçããŒãžã§ã³ã¯ãæè¿ãŸã§ååšããŠãã
hasOwnProperty
-æ¹æ³
Reflect.hasOwn
ããã ãããã©ããä»æ§ã®æè¿ã®ããŒãžã§ã³ã§ã¯ããã®ã¡ãœããã¯åé€ãããŠããŸãã
Dict.get
-ããããã£ãèªåã®ãã®ã§ãããã©ããã確èªããããã«ããŒã§å€ãååŸããŸããæ»ããªã
undefined
ã
Dict.set
-絶察ã«åŠæ³çãªæ¹æ³ããªã©ã®ã»ãã¿ãŒãç¡èŠããŠããã£ã¯ã·ã§ããªã®ããããã£ãèšå®ã§ããŸã
__proto__
ãã䜿çšã
defineProperty
ãŸãã
ããŠããªãã¬ãŒã¿ãŒã¯
delete
æ¢ã«æ£åžžã«æ©èœããŠããŸãã
äŸïŒ
var dict = {a: 1, b: 2, c: 3}; console.log(Dict.has(dict, 'a')); // => true console.log(Dict.has(dict, 'toString')); // => false console.log(Dict.get(dict, 'a')); // => 1 console.log(Dict.get(dict, 'toString')); // => undefined Dict.set(dict, '__proto__', 42); console.log(Dict.get(dict, '__proto__')); // => 42
ïŒèŸæžãæäœããæ¹æ³
ECMAScript 5ã«ãã£ãŠé åãããã¿ã€ãã«ãã€ãã¹ïŒ
forEach, map, some
ãªã©ïŒããããã«è¿œå ãããã¡ãœããã¯éåžžã«äŸ¿å©ã§ããèŸæžã®éçãªå¯Ÿå¿ç©ã¯ãã»ãŒãã¹ãŠã®æ±çšãã¬ãŒã ã¯ãŒã¯/ã©ã€ãã©ãªã«ååšããŸããããããããããæšæºã«è¿œå ããŠãé²å±ã¯ãããŸããã
ããããã¢ãžã¥ãŒã«ã®äžéšãšããŠè¿œå ããŸã
Dict
ãããã§ã¯ãã¹ãŠãã·ã³ãã«ã§ãã¡ãœããã¯éçã¡ãœããã®é åã¡ãœããã«äŒŒãŠããŸãããããã¯ïŒ
Dict.forEach, Dict.map, Dict.filter, Dict.some, Dict.every, Dict.find, Dict.findKey, Dict.keyOf,
ïŒ
Dict.includes
, Dict.reduce,
ïŒ
Dict.turn
ã
Key
ååã®
index
é åã¡ãœããã«å¯Ÿå¿ããŸãã ãæ£ãããããŒãžã§ã³ãšãªãã·ã§ã³ã®ã€ã³ããã¯ã¹åŒæ°ïŒãŸã ïŒïŒã¯ãããŸããããªããžã§ã¯ãããŒããã©ããŒã¹ããé åºã¯ã©ãã§ãåãã§ã¯ãªãããã§ãããªããžã§ã¯ãã®ç¬èªã®åæèŠçŽ ã®ã¿ãæ€çŽ¢ãããŸãããããã®ã¡ãœããã¯ã
Array.from
ãŸãã¯ãšåãããã«ãžã§ããªãã¯
Array.of
ã§ããããšãã°
Dict.map(dict, fn)
ãæ°ãããè¿ããŸã
Dict
ããããŠ
Dict.map.call(Object, dict, fn)
-æ°ãã
Object
ãããããäžè¬çã«ããã¹ãŠã¯åå§çã§éå±ã§ãä»ã®ãã¹ãŠã®å ŽæïŒsandboxïŒãšåæ§ã§ãã
var dict = {a: 1, b: 2, c: 3}; Dict.forEach(dict, console.log, console); // => 1, 'a', {a: 1, b: 2, c: 3} // => 2, 'b', {a: 1, b: 2, c: 3} // => 3, 'c', {a: 1, b: 2, c: 3} Dict.map(dict, function(it){ return it * it; }); // => {a: 1, b: 4, c: 9} Dict.filter(dict, function(it){ return it % 2; }); // => {a: 1, c: 3} Dict.some(dict, function(it){ return it === 2; }); // => true Dict.every(dict, function(it){ return it === 2; }); // => false Dict.find(dict, function(it){ return it > 2; }); // => 3 Dict.find(dict, function(it){ return it > 4; }); // => undefined Dict.findKey(dict, function(it){ return it > 2; }); // => 'c' Dict.findKey(dict, function(it){ return it > 4; }); // => undefined Dict.keyOf(dict, 2); // => 'b' Dict.keyOf(dict, 4); // => undefined Dict.includes(dict, 2); // => true Dict.includes(dict, 4); // => false Dict.reduce(dict, function(memo, it){ return memo + it; }); // => 6 Dict.reduce(dict, function(memo, it){ return memo + it; }, ''); // => '123' Dict.turn(dict, function(memo, it, key){ memo[key + key] = it; }); // => {aa: 1, bb: 2, cc: 3} Dict.turn(dict, function(memo, it, key){ it % 2 && memo.push(key + it); }, []); // => ['a1', 'c3']
ïŒã¡ãœããã®ãã§ãŒã³ã«ã€ããŠã¯ãå®å šã«æçœãªçç±ã®ããã«ã
Dict
ãããã¯ã¢ãžã¥ãŒã«å ã«ãªããäºæãããŠããŸãããããã§ã®æãã¯æœè±¡çãªåç §ãããããŸãããããããïŒ
$for
ãšïŒã®
Map
ãã¬ãŒã ã¯ãŒã¯å ã§ã¯ããããã衚瀺ãããå¯èœæ§ã¯ååã«ãããŸãã
ïŒèŸæžã®ç¹°ãè¿ã
ES6ã®æããæªæ¥ã¯ïŒã€ãã¬ãŒã¿ãšïŒã«ãŒãã§
for-of
è¿ã¥ããŠããŸããããã¯èŸæžãšããŠã®åãªããªããžã§ã¯ãã§ãããããã¯æãããå·ããããªã-ES6ã§ã¯ã€ãã¬ãŒã¿ã¯æäŸãããŠããŸããããããã£ãŠãããããã«ãŒãããã
for-of
ãïŒ
Map
èŸæžã§åæåãããªã©ã®ç°¡åãªæ¹æ³ã¯ãããŸãããã¡ãœãããè¿œå
.keys, .values
ãã
.entries
äžã«
Object.prototype
ã¯äœã-ååãªãã¿ãããã以åã®åé¡ã®èª¬æãåç §ããŠãã ããã..ããããéåžžã«å¯èœæ§ã®é«ãä»ã®2ã€ã®ã·ããªãªïŒ
æåã®-åå空éã§ã€ãã¬ãŒã¿ãè¿ãéçã¡ãœãããè¿œå ããŸã
Dict
-
Dict.{keys, values, entries}
ããããããã§ã«æžããããã«ããã®ã¢ãžã¥ãŒã«ãæšæºã«è¿œå ããèŠèŸŒã¿ããããããç§ã¯ç¥ããŸããã
2ã€ç®ã¯ãã¿ã€ãããšã«ã¡ãœãã
Object.{values, entries}
ãè¿œå ããããšã§ã
Object.keys
ãã€ãã¬ãŒã¿ã§ã¯ãªãé åãè¿ãããªããžã§ã¯ãããã€ãã¹ããããã«ãã§ã«é åã€ãã¬ãŒã¿ãééããŠããŸãã
ãããã©ããªãã®ãåãããŸãããæšæž¬ããã®ãæãã§ããèŸæžã®å€ã®é åãååŸããã«ã¯ãäžéé åã䜿çšããŠãªããžã§ã¯ããå埩åŠçããã®ãšåãããã«ãããªãéãã€ãã¬ãŒã¿ã®ãããã³ã«ã䜿çšããã®ã¯åççã§ã¯ãããŸããããã®ãããããã¯éšåçã«æ©èœããçžäºã«è€è£œãããŸãããã©ã€ãã©ãªã«äž¡æ¹ã®ã¡ãœããã»ãããå®è£ ããŸããäŸïŒ
var dict = {a: 1, b: 2, c: 3}; console.log(Object.values(dict)); // => [1, 2, 3] console.log(Object.entries(dict)); // => [['a', 1], ['b', 2], ['c', 3]] for(var key of Dict.keys(dict))console.log(key); // => 'a', 'b', 'c' for(var [key, val] of Dict.entries(dict)){ console.log(key); // => 'a', 'b', 'c' console.log(val); // => 1, 2, 3 } $for(Dict.values(dict)).of(console.log); // => 1, 2, 3 new Map(Dict.entries(dict)); // => Map {a: 1, b: 2, c: 3} new Map((for([k, v] of Dict.entries(dict))if(v % 2)[k + k, v * v])); // => Map {aa: 1, cc: 9}
ïŒèŠèŸŒã¿å®¢
ïŒæåã ãã§
Dict
ãªã
Object.create(null)
ãã€ãã¬ãŒã¿ãšãªããžã§ã¯ãã«ããåæåã®å¯èœæ§ã瀺ãç瞮圢ã ãã§ãªããæååããŒãå«ãŸãªããããã¿ã€ããåããæ¬æ Œçãªã³ã³ã¹ãã©ã¯ã¿ãäœæããŠãããã«å ãžé²ãããšãå¯èœã§ãããã®ãããªãã®ïŒ
function Dict(props){ if(!(this instanceof Dict))return new Dict(props); if(props != null){ if(Symbol.iterator in props){ for(var [key, val] of props)this[key] = val; } else Object.assign(this, props); } } Dict.prototype = Object.create(null); Dict.prototype[Symbol.toStringTag] = 'Dict'; Dict.prototype[Symbol.iterator] = function(){ return Dict.entries(this); };
ããã¯ç§ãã¡ã«äœãäžããŸããïŒ
-
new Dict instanceof Dict
ã -
for(var [key, value] of dict){...}, new Map(dict)
ã€ãã¬ãŒã¿ãååŸããå¿ èŠã¯ãããŸããDict.entries
ã - ïŒ
Object.classof(new Dict)
'Dict'
ã§ã¯ãªããæ»ã'Object'
ãŸãã
ãã ããå°ãªããšããIE8ãæçµçã«æ¶æ» ããFirefoxãECMAScript 6ã€ãã¬ãŒã¿ãããã³ã«ã«å®å šã«åãæ¿ãããŸã§ããã®ã¢ãããŒãã®å®è£ ã延æããçç±ããããŸãã
Dict
ããã«çããŸãã
ïŒéšåé©çš
ãããããECMAScriptã®5ã§æãæçšãªæè¡é©æ°ã®äžã€ã¯ãã¡ãœããã ã£ãïŒ
Function#bind
ãããã¯ããã®æ¹æ³ãéšåçã«é©çšããã ãã§ã¯å®å šã«é瀺ãããªãå¯èœæ§ãããã ãã§ãããã®ç« ã§ã¯ã次ã®ãããªããšãæ€èšããŸãã
- ïŒã³ã³ããã¹ããã€ã³ãã£ã³ã°ã®ãªãéšåçãªã¢ããªã±ãŒã·ã§ã³
- ïŒä»»æã®åŒæ°ã®éšåçãªäœ¿çš
- ïŒãªããžã§ã¯ãããã¡ãœãããæœåº
- ïŒåŒæ°ã®æ°ãå¶éãã
äžã€ã¯ãè¿œå ããããšãã§ãã«ãªãŒåããããããJavaScriptã¯ã«ãªãŒåãšéšåé©çšãéåžžã«é »ç¹ã«å¿ èŠãšãããŠããªãã§ããã¡ãœããã®ãæ£ãããããŒãžã§ã³ã®ããã«ããããã¯ã«é¢ããé©åãªïŒãããŠãããããæåãªïŒèšäºãžã®ãªã³ã¯ãè¿œå ããŸãã
ïŒã³ã³ããã¹ããã€ã³ãã£ã³ã°ã®ãªãéšåçãªã¢ããªã±ãŒã·ã§ã³
Function#bind
éšåçãªã¢ããªã±ãŒã·ã§ã³ãšã³ã³ããã¹ããã€ã³ãã£ã³ã°ãçµã¿åãããŸã
this
ãåŸè ã¯åžžã«å¿ èŠãšããããã§
this
ã¯ãªãããã®å Žåãçµã³ä»ããããå¿ èŠããããäœåãªãåŒæ°ã ãããã€ã³ããããŠããããã§ã¯ãããŸãããéšåçã«é©çšãããæ©èœãèµ·åããã³ã³ããã¹ããäºåã«äžæ
Function#bind
ãªå Žåããã®æ¹æ³ã¯é©çšã§ããŸãããããšãã°ãããããããã¿ã€ãã¡ãœããïŒsandboxïŒã®å ŽåïŒ
Array.prototype.compact = [].filter.bind(Array.prototype, function(val){ return val != null; }); [0, null, 1, undefined, 2].compact(); // => [] - Array.prototype, // : Array.prototype.compact = function(){ return this.filter(function(val){ return val != null; }); }; [0, null, 1, undefined, 2].compact(); // => [0, 1, 2];
ãã€ã³ãããã«éšåçãªã¢ããªã±ãŒã·ã§ã³ã¡ãœãããè¿œå ããŸã
this
-
Function#part
ïŒsandboxïŒïŒ
Array.prototype.compact = [].filter.part(function(val){ return val != null; }); [0, null, 1, undefined, 2].compact(); // => [0, 1, 2]; var fn = console.log.part(1, 2); fn(3, 4); // => 1, 2, 3, 4
ïŒä»»æã®åŒæ°ã®éšåçãªäœ¿çš
å€ãã®å Žåãéšåçã«é©çšããå Žåãä»»æã®åŒæ°ãæž¡ãå¿ èŠããããŸããããšãã°ãæåã®2ã§ã¯ãªãã2çªç®ãš4çªç®ãŸãã¯2çªç®ãš3çªç®ã ãã§ããããã§
Function#bind
圌女ã¯ç§ãã¡ãå©ããããšãã§ããŸãã-ç§ã¯ç¹å®ã®ã±ãŒã¹ããšã«æåã§ã©ãããŒãæžãå¿ èŠããããŸãã
function fn1(a, c){ console.log(a, 2, c, 4); }; fn1(1, 3); // => 1, 2, 3, 4 function fn2(b, c){ console.log(1, b, c, 4); }; fn2(2, 3); // => 1, 2, 3, 4
ãã®ã¿ã¹ã¯ã容æã«ããããã«ããã¬ãŒã¹ãã«ããŒãè¿œå ããŸãããã¬ãŒã¹ãã«ããŒã¯ãæçµé¢æ°ãåŒã³åºããããšãã«æž¡ãããåŒæ°ã眮ãæãããªããžã§ã¯ãã§ãããã¬ãŒã¹ãã«ããŒãžã®åç §ãšããŠãã°ããŒãã«å€æ°ã¯ããèªäœãèŠæ±ããŸã
_
ïŒããšãã°ãLiveScriptããµã³ãããã¯ã¹ãªã©ïŒããUndescore.jsã©ã€ãã©ãªãŒã¯ãã®å€æ°ã䜿çšããŸãïŒã¡ãªã¿ã«ãããã¯ãã¬ãŒã¹ãã«ããŒã§ããããŸã
_.partial
ïŒããã³ãã®åå空éãšããŠLoDashã§ããããããšã®ç«¶åãé¿ããããã«ã
_
ååšããªãå Žåã«ã®ã¿æ°ããã°ããŒãã«ãªããžã§ã¯ããäœæããæäœäžã¯ã°ããŒãã«ãªããžã§ã¯ãã䜿çšããŸã
_
ããã€ãã£ããªããžã§ã¯ããå±éããªãã¢ã»ã³ããªã®å Žåããªããžã§ã¯ãããã¬ãŒã¹ãã«ããŒãšããŠäœ¿çšããŸã
core._
ãäŸïŒ
var fn1 = console.log.part(_, 2, _, 4); fn1(1, 3); // => 1, 2, 3, 4 var fn2 = console.log.part(1, _, _, 4); fn2(2, 3); // => 1, 2, 3, 4 fn1(1, 3, 5); // => 1, 2, 3, 4, 5 fn1(1); // => 1, 2, undefined, 4
Function#by
åæ§ã®ã¡ãœãããè¿œå
Function#bind
ããŸãããåŒæ°ã«ãã¬ãŒã¹ãã«ããŒã䜿çšããå¯èœæ§ããããŸãããŸãšããŠ
Function#bind
ãã¬ãŒã¹ãã«ããæäœããããšãã§ããŸãããããã¯ä»æ§éåã§ããããã®æ¹æ³ã¯ã»ãšãã©ãã¹ãŠã®ãšã³ãžã³ã§ãã§ã«éåžžã«ãã¬ãŒããããã£ãŠããŸãã
var fn = console.log.by(console, _, 2, _, 4); fn(1, 3, 5); // => 1, 2, 3, 4, 5
ïŒãªããžã§ã¯ãããã¡ãœãããæœåº
ã»ãšãã©ã®å Žåãããšãã°ãé¢æ°ã«ã³ãŒã«ããã¯ãæž¡ããšããã¡ãœãããååŸå ã®ãªããžã§ã¯ãã«ãã€ã³ãããå¿ èŠããããŸãããããŠãããã§åé¡ãçºçããŸã-
fn(foo.bar.baz.bind(foo.bar))
ãç§ãã¡ã¯
foo.bar
2åæžãããšãäœåãªããããŠããŸãããããã¯DRYã®ååã«æããã«éåããŠããŸããå°æ¥æœè±¡çãªåç §ããã®åé¡ããæãããããšãæã¿ãŸãããææ¡ãããå®è£ ã¯åé¡ã解決ããŸããããããããæããããããšãšã¬ã¬ã³ããªè§£æ±ºçã¯ãä¿å šç¶æ³ãåããžã®ãªãã¬ãŒã¿ã¢ã¯ã»ã¹ã®èšèªã§è¿œå ããããšã§ã
~
LiveScriptãã -
fn(foo.bar~baz)
ïŒç å ŽïŒã
ããŒã«ãã£ãŠãªããžã§ã¯ãããã¡ãœãããæœåºããå Žåãé€ããŠãé ã«æµ®ãã¶ã©ã€ãã©ãªã«åºã¥ããåé¡ã«å¯Ÿããå€ãã®è§£æ±ºçã¯ãããŸãããããã¯ãäŸãã°ãéçãªæ¹æ³ã§ãã
_.bindKey
ããLoDashïŒããããåæçµåãæããïŒããããã¯ãŸããéåžžã«é¢åã§ããã«å¯èªæ§ãæªåãããããŸãã¯ã¡ãœãããšæ©èœçã«é¡äŒŒããŠãã
Object.prototype
ãäŸãã°ã
Object#boundTo
ããEddy.jsã
ã©ããªã«æãããèãããŠããã«ã¡ãœãããè¿œå ã
Object.prototype
ãŸãã
Object.prototype
çãããŒæååã§ã¡ãœãããæ¡åŒµããŠããªã¹ã¯ã¯ãããŸãããå°ãªããšãçŸæç¹ã§ã¯ã競åãåé¿ããããš
for-in
ã¯é£ãããIE8-ã§ãããç ŽããŸãããã®ç« ã®ååã§ããã§ã«ã°ããŒãã«å€æ°ã䜿çšããŸãã
_
ãäžèŠãªãšã³ãã£ãã£ãäœæããªãããããŸãç°¡æœã«ããããã«ãããã§é©çšããŸãããªããžã§ã¯ã
_
ã¡ãœããã眮ãæããŸã
toString
ïŒãããããUndescore.jsãŸãã¯LoDashãšçµã¿åãããŠäœ¿çšââããå Žåã¯ãcore.jsãæ¥ç¶ããå¿ èŠããããŸãïŒãããã®åŸïŒãïŒcharacter polyphile keyã«äŒŒããäžæã®ããŒæååãè¿ããŸãããã®ããŒã«ã¡ãœããcãè¿œå ããŸã
Object.prototype
ãæ±ãããã¯ã䜿çšããããšã«ããïŒé¢çœããã°ãæã ã¯å£ãããšãªãããã®æ¹æ³ããã³IE8-ãè¿œå ããŸã
for-in
ã
åèšãç§ãã¡ãå§ããäŸãããç§ãã¡ã¯åŸãŸã
fn(foo.bar[_]('baz'))
-çæ³ããã¯ã»ã©é ãã§ãããå°ãªããšããªããžã§ã¯ãã®2çªç®ã®èšåãåãé€ããŸãããè¿ãããã¡ãœããã¯ãã£ãã·ã¥ãããŸããäŸïŒ
['foobar', 'foobaz', 'barbaz'].filter(/bar/[_]('test')); // => ['foobar', 'barbaz'] var has = {}.hasOwnProperty[_]('call'); console.log(has({key: 42}, 'foo')); // => false console.log(has({key: 42}, 'key')); // => true var array = [] , push = array[_]('push'); push(1); push(2, 3); console.log(array); // => [1, 2, 3];
è¯ãæ¹æ³ã§ã¯ãIE8ã©ã€ãã©ãªã®ãµããŒããæåŠããåŸãã¡ãœããã®ååãå€æŽããå¿ èŠããããŸããååãå€æŽããªããšãã©ããããã
tie, boundTo, bindKey
ãæãã§ã:) ãŸãã¯ãã®ãããªäœããæã競åã®å°ãªãããŒãéžæããŸããããã§ES6ãã
䜿çš
Proxy
ããæ¹ãã¯ããã«ãããã§ã-ã¡ãœããã«ããŒãæž¡ã代ããã«ããããã£ã«å®æçã«ã¢ã¯ã»ã¹ããŸã
fn(foo.bar[_].baz)
ãã
Proxy
åé¡ïŒã²ãã¿ãŒããªããžã§ã¯ããã©ããŒãµã«ããã¹ãŠã®ã¡ãœããã®ãã€ã³ãïŒããªããã°ãããã©ãŒãã³ã¹ãå€§å¹ ã«æãªãããšãªãããŸã äœè£ããããŸããã
ãããã·ã䜿çšããäŸããããŸã§ã¯å€éç«çœã§ã®ã¿åäœããŸã
var _ = Symbol(); Object.defineProperty(Object.prototype, _, { get: function(){ return new Proxy(this, { apply: function(){ /* [_] */ }, get: function(context, name){ return context[name].bind(context); } }); } }); ['foobar', 'foobaz', 'barbaz'].filter(/bar/[_].test); // => ['foobar', 'barbaz'] var has = {}.hasOwnProperty[_].call; console.log(has({key: 42}, 'foo')); // => false console.log(has({key: 42}, 'key')); // => true var array = [] , push = array[_].push; push(1); push(2, 3); console.log(array); // => [1, 2, 3];
ïŒåŒæ°ã®æ°ãå¶éãã
ãªãã·ã§ã³ã®åŒæ°ã®åé¡ã«ã€ããŠã¯ããã®èšäºã§èª¬æããŸãããã®äžäŸã¯
parseInt
-éåžžã«äžæçã§ãããšãã°æååãæ°åã«ãã£ã¹ãããããšã誰ãæ°ã«
Number
ããŸãããããšãã°ãè¿œå ã®åŒæ°ãæåŸ ããŠããŸãããéèŠãªã®ã¯ãå±éºãã§ã¯ãªããè¿œå ã®ã©ãããŒãäœæããå¿ èŠãããããšã§ãã
ããšãã°ãé åã®ãã¹ãŠã®èŠçŽ ãã³ã³ãœãŒã«ã«åºåããèŠçŽ èªäœã®ã¿ãå°å·ããŸãã
[1, 2, 3].forEach(console.log); // => 1 0 [1, 2, 3] // => 2 1 [1, 2, 3] // => 3 2 [1, 2, 3]
.forEach
ä»ã®å€ãã®ã¡ãœãããšåæ§ã«ããã®ã¡ãœããã¯ã³ãŒã«ããã¯ã«ãªãã·ã§ã³ã®åŒæ°ïŒã€ã³ããã¯ã¹ãšé åèªäœïŒãæäŸããŸãããããããããã¯å¿ èŠãããŸããããã®ãããã³ãŒã«ããã¯ãå¥ã®é¢æ°ã«ã©ããããå¿ èŠããããã³ã«ïŒ
[1, 2, 3].forEach(function(it){ console.log(it); }); // => 1, 2, 3
äžèšã®èšäºã§ã¯ãé¢æ°ã®åŒæ°ãå¶éããæ¹æ³ãææ¡ãããŸãã
Function#only
ããã®ãªãã·ã§ã³ãå®è£ ããŸããæåã®åŒæ°ã¯åŒæ°ã®æ倧æ°ã§ããã2çªç®ã®åŒæ°ã¯ãªãã·ã§ã³ã§ãããã³ã³ããã¹ãã§ããäŸïŒ
[1, 2, 3].forEach(console.log.only(1)); // => 1, 2, 3
ãã¡ãããåŒæ°ã®æ倧æ°ã1ã®å ŽåãES6ãŸãã¯ã³ãŒããŒã®ãããªèšèªã®ç¢å°é¢æ°ã䜿çšããæ¹ãç°¡åã§ããã°å¯èœã§ããããã以äžã®å Žåã¯ãã§ã«åé¡ããããŸãã
ïŒæ¥ä»ã®ãã©ãŒããã
JavaScriptã§æ¥ä»ããã©ãŒãããããç°¡åãªã¿ã¹ã¯ã¯ããã»ã©åçŽã§ã¯ãªãããã«æãããŸããã11/18/2014 06:07:25ã圢åŒã®æååãååŸããå¿ èŠãããå Žåã¯ã©ããªããŸããïŒãã¹ãŠãããªãæãã§ãïŒ
var date = new Date; function lz2(it){ return it > 9 ? it : '0' + it; } var format = [date.getDate(), date.getMonth() + 1, date.getFullYear()].map(lz2).join('.') + ' ' + [date.getHours(), date.getMinutes(), date.getSeconds()].map(lz2).join(':'); console.log(format); // => '18.11.2014 06:07:25 '
ãŸããããšãã°ããç«ææ¥ã2014幎11æ18æ¥ã6ïŒ07ïŒ25ããšãã圢åŒã®æååãååŸããå¿ èŠãããå Žåã¯ã©ãã§ããããã
èšäºã®åé ã§ãä»æ§ã§ããåœéåæšæºECMA402ãèšåãããŸããããã®èŠæ Œã¯ãæ¥ä»ãæ°å€ãæååæ¯èŒã®ããŒã«ã©ã€ãºããããã©ãŒãããã®æ段ãå«ãIntlãªããžã§ã¯ããJavaScriptã«è¿œå ããŸããåºæ¬çãªã¬ãã«ã§ã¯ããã®èšäºã§ã¯Intl ã«ã€ããŠèª¬æããŸããããã«ããã®æšæºã¯ã2ã€ã®åŒæ°ãè¿œå ããããšã§ã¡ãœããããªãŒããŒããŒãããŸãïŒããŒã«ã©ã€ãºãšãã©ãŒããããªãã·ã§ã³ãããããçšããŠãäžèšã®åœ¢åŒã®ã©ã€ã³è¿ããåŸãããšãã§ããããã«ã
Date#toLocaleString, Date#toLocaleDateString, Date#toLocaleTimeString
new Date().toLocaleString('ru-RU', { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: '2-digit', second: '2-digit' }); // => ', 18 2014 ., 6:07:25'
ãã¡ããé¢åã§ãããäœãããªãããã¯ãã®æ¹ãããã§ããæšæºã®ãµããŒãã«é¢ããŠ-äžè¬ã«ãæªããªããChromeãOperaãIE11ãããã³æè¿ã§ã¯FirefoxããµããŒãããŠããŸããããããéåžžãIE10ãSafariãã¢ãã€ã«ãã©ãããã©ãŒã ã®ãµããŒããå¿ èŠã§ãããæªéã¯ãŸã äœãç¥ã£ãŠããŸãããã®å Žåã«ã¯ããªãã£ã«ããããŸãããããåé¡ã¯ããã±ãŒã«ãèæ ®ããªããŠãããã®æ©èœã®å®è£ ãéããªããããããšã§ãããã®ãããã®Core.jsã§ç¡ããªã¥ãã§ã¢ã¹ECMA402ã
ïŒç°¡åãªæ¥ä»ãã©ãŒããããè¿œå ããŸãã
simpleã¯ã©ãããæå³ã§ããïŒã©ã®ãããã®é »åºŠã§å®å šãªããŒã«ã©ã€ãºãå¿ èŠã§ããããŸãã¯ä»ã®é«åºŠãªæ¥ä»ããŒã«ã¯äœã§ããïŒç§ã¯æ¬åœã«ããã§ã¯ãããŸãããéåžžãæžåŒæååã䜿çšããç°¡åã§äŸ¿å©ãªæ¥ä»æžåŒãå¿ èŠã§ããå¿ èŠãªå Žåã¯ãMoment.jsãpolyfil ãæ¥ç¶ããå¿ èŠã¯ãããŸãã
Intl
ãããã§ãæ¥ä»ãæäœããããã®ã¢ãžã¥ãŒã«å šäœã¯æ°åè¡ã§ãã
ã¡ãœãã
Date#format
ãšãã®UTCããŒãžã§ã³
Date#formatUTC
ïŒsandboxïŒãè¿œå ããŸãã
new Date().format('W, D MM Y ., h:mm:ss', 'ru'); // => ', 18 2014 ., 6:07:25' new Date().formatUTC('W, D MM Y ., h:mm:ss', 'ru'); // => ', 18 2014 ., 0:07:25'
æžåŒæååã®åçŽããšèªã¿ãããã®ããã«ãè¡šèšæ³ãä¿è·ããããšã«ç ©ããããŸããããããã®æå°å€ã¯å©çšå¯èœã§ããïŒ
s | | 0-59 ss | , 2 | 00-59 m | | 0-59 mm | , 2 | 00-59 h | | 0-23 hh | , 2 | 00-23 D | | 1-31 DD | , 2 | 01-31 W | , | N | | 1-12 NN | , 2 | 01-12 M | , | MM | , | Y | , | 2014 YY | , 2 | 14
ã©ã€ãã©ãªã«ã¯ãã§ã«ãã·ã¢èªïŒ
ru
ïŒããã³è±èªïŒ
en
ïŒãã±ãŒã«ãå«ãŸããŠããŸãããã±ãŒã«ã¯ãã¡ãœãã
core.locale
ãŸãã¯ã¡ãœããã®2çªç®ã®åŒæ°
Date#format
ãš
Date#formatUTC
ïŒsandboxïŒã®ããããã«ãã£ãŠæå®ãããŸãã
new Date().format('W, D MM Y', 'ru'); // => ', 18 2014' new Date().format('W, D MM Y'); // => 'Tuesday, 18 November 2014' core.locale('ru'); new Date().format('W, D MM Y'); // => ', 18 2014'
ãã±ãŒã«åœ¢åŒã以äžã«ç€ºããŸããç¬èªã®ã³ãŒãã§ã¯ãèªåèªèº«ãå¶éã§ããŸãã
core.addLocale
ããã€ãã£ããªããžã§ã¯ããå±éããã«ã©ã€ãã©ãªãæ§ç¯ã§ããããããŠãããŒãµã«ãã±ãŒã«ã¢ãžã¥ãŒã«ã¯æ¬¡ã®ããã«ãªããŸãã
(typeof core != 'undefined' ? core : require('core-js/library')).addLocale('ru', { weekdays: ',,,,,,', months: ':|,:|,:|,:|,:|,:|,:|,:|,:|,:|,:|,:|' });
ããã€ãã®äŸïŒ
new Date().format('DD.NN.YY'); // => '18.11.14' new Date().format('hh:mm:ss'); // => '06:07:25' new Date().format('DD.NN.Y hh:mm:ss'); // => '18.11.2014 06:07:25' new Date().format('W, D MM Y '); // => ', 18 2014 ' new Date().format('D MM, h:mm'); // => '18 , 6:07' new Date().format('M Y'); // => ' 2014'
ïŒãªããžã§ã¯ãAPI
ïŒ æåã®åé¡ïŒECMAScript 5ã§ã¯ããªããžã§ã¯ããªãã©ã«ã§ã²ãã¿ãŒãšã»ãã¿ãŒã宣èšããæ©èœãè¿œå ãããŸããããã ãã
Object.defineProperty
/ã®ã¿ã䜿çšããŠæ¢åã®ãªããžã§ã¯ãã®ã²ãã¿ãŒ/ã»ãã¿ãŒãè¿œå ã§ããŸã
Object.defineProperties
ãããã«ãããå®å šãªïŒéåæãŸãã¯åå®çŸ©ã§ããªããªã©ã®è¿œå ãªãã·ã§ã³ãå¿ èŠãªãå ŽåïŒèšè¿°åãªããžã§ã¯ãã転éããå¿ èŠããããããã¯é¢åã§ãã
ã¡ãœããïŒ
Object.assign
ã«å ããŠãECMAScript 6ã§ã¯
Object.mixin
ãèšè¿°åãèæ ®ããŠããœãŒã¹ãªããžã§ã¯ãã®ããããã£ãã¿ãŒã²ãããªããžã§ã¯ãã«ã³ããŒããã¡ãœãããè¿œå ããäºå®ã§ãããããã«ããã®ã¡ãœããã¯ãããŒã¯ãŒããä»ããŠååŸãããœãŒã¹ãªããžã§ã¯ãã®ã¡ãœããã®èŠªãåå²ãåœãŠããããšã«ãªã£ãŠããŸã
super
ããããã圌ãã¯ãããä¿®æ£ããããšã決ããæšæºãžã®è¿œå ã延æããŸããã
Object.define
説æã©ããã«åäœããã¡ãœãããè¿œå
Object.mixin
ããŸã
super
ãECMAScript5ã«ããŒã¯ãŒãããªãå ŽåããœãŒã¹ãªããžã§ã¯ãã®ããããã£ãã¿ãŒã²ããã«ã³ããŒããèšè¿°åãèæ ®ã«å ¥ããŠã芪ãåå®çŸ©ããŸããã
// : Object.defineProperty(target, 'c', { enumerable: true, configurable: true, get: function(){ return this.a + this.b; } }); // : Object.define(target, { get c(){ return this.a + this.b; } });
ïŒ 2çªç®ã®åé¡ïŒECMAScript 5ã§ã¯ãã³ã³ã¹ãã©ã¯ã¿ãŒã䜿çšããã«ãªããžã§ã¯ããäœæããæ©èœããä»ããŠè¿œå ãã
Object.create
ãŸããäœæããéã«ãç¬èªã®ãªããžã§ã¯ãã®ããããã£ãè¿œå ããã«ã¯è¯ãã§ããããã2çªç®ã®åŒæ°
Object.create
ãªã©ã¯
Object.defineProperties
ããªããžã§ã¯ãèšè¿°åããã®ã²ã©ãé¢åãªããããã£ãå«ããªããžã§ã¯ããåãåããŸãã
ã¡ãœãããè¿œå ããŸã
Object.make
-ã¢ããã°
Object.create
ã2çªç®ã®åŒæ°ã¯èšè¿°åãªããžã§ã¯ãã§ã¯ãªããèšè¿°åãèæ ®ããŠãèªèº«ã®ããããã£ãäœæããããªããžã§ã¯ãã«ã³ããŒãããåçŽãªãªããžã§ã¯ããæåŸ ããŸãã
// : var copy = Object.make(Object.getPrototypeOf(src), src); // : function Vector2D(x, y){ this.x = x; this.y = y; } Object.define(Vector2D.prototype, { get xy(){ return Math.hypot(this.x, this.y); } }); function Vector3D(x, y, z){ Vector2D.apply(this, arguments); this.z = z; } Vector3D.prototype = Object.make(Vector2D.prototype, { constructor: Vector3D, get xyz(){ return Math.hypot(this.x, this.y, this.z); } }); var vector = new Vector3D(9, 12, 20); console.log(vector.xy); // => 15 console.log(vector.xyz); // => 25 vector.y++; console.log(vector.xy); // => 15.811388300841896 console.log(vector.xyz); // => 25.495097567963924
ECMAScript 7ã¯Object.getOwnPropertyDescriptorsã¡ãœãããè¿œå ããããšãææ¡ããŠããŸãããã®ã¡ãœããã¯ããã®ååã瀺ãããã«ããªããžã§ã¯ãèªäœã®ããããã£ã®ãã¹ãŠã®èšè¿°åãå«ããªããžã§ã¯ããè¿ããŸããçæ³çãªäºçªç®ã®åŒæ°ãçæããããã®ãã¢
Object.defineProperties
ãããã³
Object.create
ãããã³ãããçšåºŠãç§ãã¡ã®ä»£ãã
Object.make
ãš
Object.define
ãããã¯é¢åã§ãã
ïŒé å
ïŒ ArrayïŒincludeã¡ãœããïŒæè¿ãŸã§-
Array#contains
ã MooToolsã®ãã°ã«ããååãå€æŽãããŸããããå€ãååã§å©çšå¯èœã§ãïŒãECMAScript 7ã«è¿œå ãããäºå®ã§ããé åå ã®èŠçŽ ã®ãšã³ããªãå£é ã§ãã§ãã¯ããŸãããšã¯ç°ãªã
Array#indexOf
ãïŒSameValueZeroæ¯èŒã¢ã«ãŽãªãºã ã䜿çšããããŒã«ãç¡èŠããŸããã 2çªç®ã®ãªãã·ã§ã³ã®åŒæ°ã¯éå§äœçœ®ã§ããäŸïŒ
[1, 2, 3].includes(2); // => true [1, 2, 3].includes(4); // => false [1, 2, 3].includes(2, 2); // => false [NaN].indexOf(NaN); // => -1 [NaN].includes(NaN); // => true Array(1).indexOf(undefined); // => -1 Array(1).includes(undefined); // => true
ïŒãããããã®æ¹æ³
Array#turn
ã¯ç§ã®ç æ°ã®æ³ååã®ææã§ããããããå€æããããã«ãäžæã§ã¯ãããŸãã -LoDash
_.transform
ããã®åæ§ã®ã¡ãœããããããŸããããã¯
Array#reduce
ãã³ãŒã«ããã¯ããããããªãŒãè¿ããªããŠããé åãä»»æã®ããããªãŒãªããžã§ã¯ãã«æãç³ãæ¹æ³ïŒããã©ã«ãã¯æ°ããé åïŒã®ä»£æ¿ã§ããã¡ãœãããšã³ãŒã«ããã¯ã®çœ²åã¯äŒŒãŠã
Array#reduce
ãŸããã³ãŒã«ããã¯ããæ»ãããšã«ãããã³ã¬ã¯ã·ã§ã³ãäžæã§ããŸã
false
ãäŸïŒ
// : [1, 2, 3, 4, 5].reduce(function(memo, it){ memo['key' + it] = !!(it % 2); return memo; }, {}); // => {key1: true, key2: false, key3: true, key4: false, key5: true} [1, 2, 3, 4, 5].turn(function(memo, it){ memo['key' + it] = !!(it % 2); }, {}); // => {key1: true, key2: false, key3: true, key4: false, key5: true} // filter + map + slice, : [1, 2, 3, 4, 5, 6, 7, 8, 9].map(function(it){ return it * it; }).filter(function(it){ return it % 2; }).slice(0, 2); // => [1, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9].turn(function(memo, it){ it % 2 && memo.push(it * it); if(memo.length == 2)return false; }); // => [1, 9]
ïŒçªå·
ïŒèŠããŠããïŒã€ãã¬ãŒã¿ã®ç« ã®å埩å¯èœãªæ°åã®äŸïŒæšæºã©ã€ãã©ãªã§äŒŒããããªãã®ãæåŠããããŸãã«ãæ®éçãªæ©äŒãéåžžã«çããµã€ã¯ã«ã«åºã¥ããŠãæå®åæ°å®è¡
for-of
ãéããŠæå®ãããé·ãã®é åã®ç°¡åãªäžä»£ïŒ
Array.from
ïŒãããŠããããïŒã¹ãã¬ããïŒãçãã®ãããªããªããã£ããªå®è£ ã§ã¯ãããŸããããæ°å€ã®ã€ãã¬ãŒã¿ãè¿œå ããŸããããäŸïŒ
// : for(var i = 0; i < 3; i++)console.log(i); // => 0, 1, 2 // for-of : for(var i of 3)console.log(i); // => 0, 1, 2 // for-of, : $for(3).of(console.log); // => 0, 1, 2 // : // .map "" Array(10).map(Math.random); // => [undefined à 10] // ES5 , : Array.apply(undefined, Array(10)).map(Math.random); // => [0.9442228835541755, 0.8101077508181334, ...] // ES6 , : Array(10).fill(undefined).map(Math.random); // => [0.5587614295072854, 0.009569905698299408, ...] // Number Iterator: Array.from(10, Math.random); // => [0.9817775336559862, 0.02720663254149258, ...] Array.from(10); // => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] Array.from(10, function(it){ return this + it * it; }, .42); // => [0.42, 1.42, 4.42, 9.42, 16.42, 25.42, 36.42, 49.42, 64.42, 81.42] // Comprehensions: [for(i of 10)if(i % 2)i * i]; // => [1, 9, 25, 49, 81] Dict((for(i of 3)['key' + i, !(i % 2)])); // => {key0: true, key1: false, key2: true} $for(10).filter(function(i){ return i % 2; }).array(function(i){ return i * i; }); // => [1, 9, 25, 49, 81] Dict($for(3).map(function(i){ return ['key' + i, !(i % 2)]; })); // => {key0: true, key1: false, key2: true}
ïŒæ°åŠé¢æ°
Number.prototype
-å¿«é©ãªãã®ã®ã«ããŽãªããããã ãç ç³ãšMooToolsã¯ã®ããã«ããªããžã§ã¯ãã®ã¡ãœããæåºãã
Math
äžã
Number.prototype
ãããã§èšãããšã¯ããŸããããŸãã-ã³ã³ããã¹ãã¯æ°åŠé¢æ°ã®æåã®åŒæ°ã«ãªããŸããæ¢åã®æšæºåãããæ©èœãè€è£œã§ããŸãããéåžžã«äŸ¿å©ã§ã:)
å¥ã®è¡ãšããŠãã®ã¡ââãœããã«èšåã
Number#random
ãŸããã³ã³ããã¹ãçªå·ãšæž¡ãããåŒæ°ã®éã®ä¹±æ°ãè¿ããŸãïŒããã©ã«ãã¯0ã§ãïŒã
äŸïŒ
3..pow(3); // => 27 (-729).abs().sqrt(); // => 27 10..random(20); // => (10, 20), , 16.818793776910752 10..random(20).floor(); // => [10, 19], , 16 var array = [1, 2, 3, 4, 5]; array[array.length.random().floor()]; // => , , 4
ïŒç¹æ®æåã®ãšã¹ã±ãŒã
ïŒçªç¶ãèšäºã®æåŸã§ãJavaScriptãäž»ã«HTMLã®æäœã«äœ¿çšãããŠãããšèšã£ãå Žåã倧ããªç§å¯ãæãããŸãããã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã§HTMLã䜿çšããã«ã¯ãHTMLãä¿è·ããå¿ èŠããããŸããããã¯ãã¬ãŒã ã¯ãŒã¯ãŸãã¯ãã³ãã¬ãŒããšã³ãžã³ã®ã¿ã¹ã¯ã§ãããšèª°ããèšããããããŸããããããããã®ãããªåå§çãªã¿ã¹ã¯ã®ããã«ããããåŒã£åŒµã䟡å€ã¯ãããŸããïŒ HTMLãšã¹ã±ãŒãã®ã¡ãœããã¯ãã¹ãŠã®æšæºã©ã€ãã©ãªã«ãããŸããç ç³ããããã¿ã€ãã§ã¯ãMooToolsã®ã¯æ¹æ³ã§ã
escapeHTML
ãš
unescapeHTML
ãããã¿ã€ãã©ã€ã³ããã®äŒçµ±ãå£ããªãããã«ããŸãããã
'<script>doSomething();</script>'.escapeHTML(); // => '<script>doSomething();</script>' '<script>doSomething();</script>'.unescapeHTML(); // => '<script>doSomething();</script>'
ïŒå€ãã®å ŽåããŠãŒã¶ãŒããŒã¿ããæ£èŠè¡šçŸãäœæããå¿ èŠããããæ£ãã/å®å šãªæäœã®ããã«ã¯ãããããä¿è·ããå¿ èŠããããŸããSugarãPrototypeãMooToolsã«ã¯ãéçã¡ãœãããšããŠ
RegExp
ãã©ããã«methodãšããŠããã®ããã®ã¡ãœããããããŸã
String.prototype
ããã®ãããªã¡ãœãããECMAScriptã«è¿œå ããæ¹æ³ã¯é·ãéè°è«ãããŠããŸããããããåŸ ã€ããšãæã¿ãŸãããä»ã®ãšãããææ¡ããããªãã·ã§ã³ãã©ã€ãã©ãªã«å®è£ ããŸãã
RegExp.escape(' -[]{}()*+?.,\\^$|'); // => ' \-\[\]\{\}\(\)\*\+\?\.\,\\\^\$\|'
ïŒçµè«
ãŸãããã®ãããªãã®ã
æšæºã«é¢ããããç¥ãããŠããxkcdç»åã®ã³ã¡ã³ãã«ç»å Žããããšãäºæ³ããŠããŸãããã©ã€ãã©ãªå ã®ã»ãšãã©ãã¹ãŠãå©çšå¯èœã§ãããæ°çŸã®ãããã€ãã®ã©ã€ãã©ãªããã®å¯ãéããé€ããããã«ä»£ãããã®ã¯ãããŸããã
å³æžé€šã®å°æ¥ã®èšç»ã«é¢ããŠã¯ããããã¯äž»ã«èšäºã®æ¬æå šäœã«æ£ãã°ã£ãŠããŸãããã¡ãããããã©ãŒãã³ã¹ãæé©åãããã¹ãã§ã³ãŒããããé©åã«ã«ããŒããããã«ãå¿ èŠã§ã-ç§ã¯ãŸã ãããæ°ã«ããŸããã§ããã
ç§ãèŠéãããããããªããã®ãšãããè¯ãå®è£ ã§ãããã®ã«ã€ããŠã®ããªãã®æèŠã«èå³ããããŸãã
ã¯ã ããã§ããç§ã¯ãã®ããã«èŠãã¿å§ããã®ã§ãç§ã¯éå±ããŠããŸããç§ã¯ãŸãšããªçµŠæã§é¢çœããããžã§ã¯ããæ¢ããŠããŸãã