å€ãã®JavaScriptæ©èœã®æ§è³ªãšç®çã¯éåžžã«æçœã§ãã ããããçºé»æ©ã®ãããªäžéšã®ãã®ã¯ãäžèŠãããšå¥åŠã«èŠãããããããŸããã ããªããã£ãåãšãªããžã§ã¯ãã®å€ã«é¡äŒŒããã·ã³ãã«ã¯ãåãå°è±¡ãäžããå¯èœæ§ããããŸãã ãã ããããã°ã©ãã³ã°èšèªã¯å
šäœçãªã·ã¹ãã ã§ãããäžéšã®æ©èœã¯ä»ã®æ©èœã«äŸåããŠããŸãã ãããã£ãŠãéåžžã1ã€ã®ãã®ãå®å
šã«ç解ããããšã¯ããããäœã«é¢é£ããäœã«äŸåããäœã«åœ±é¿ããããç解ããããšãªãã«äžå¯èœã§ãã

ä»æ¥å
¬éããŠããè³æã¯ãã·ã³ãã«ãããç¥ãããŠããã·ã³ãã«ãå埩åãå埩å¯èœãªããžã§ã¯ãããžã§ãã¬ãŒã¿ãŒãéåæ/åŸ
æ©ã¡ã«ããºã ãéåæå埩åãªã©ã®JavaScriptã¡ã«ããºã ãšæ§é ã説æããããšãç®çãšããŠããŸãã ç¹ã«ãããã§ããããèšèªã«ç»å Žããçç±ãšããããã®äœ¿çšæ¹æ³ã«ã€ããŠèª¬æããŸãã ããã§åãäžãããããã¯ã¯ãJavaScriptãããçšåºŠç解ããŠãã人åãã«èšèšãããŠããããšã«æ³šæããŠãã ããã
ã·ã³ãã«ãšæåãªã·ã³ãã«
ES2015ã§ã¯ãæ°ãã6çªç®ã®ããŒã¿å-symbolãå°å
¥ãããŸããã ãªãã§ïŒ ãã®ããŒã¿åã衚瀺ãããäž»ãªçç±ã¯3ã€ãããŸãã
âçç±çªå·1ã äžäœäºææ§ãåããåºæ¬æ©èœã®æ¡åŒµ
JavaScriptéçºè
ãšECMAScriptå§å¡äŒïŒTC39ïŒã¯ã
for-in
ã«ãŒãã
Object.keys
ãªã©ã®ã¡ãœãããªã©ãæ¢åã®ã¡ã«ããºã ãäžæããããšãªãããªããžã§ã¯ãã«æ°ããããããã£ãè¿œå ããæ©èœãå¿
èŠãšããŠã
Object.keys
ã
次ã®ãããªãªããžã§ã¯ãããããšããŸãïŒ
var myObject = {firstName:'raja', lastName:'rao'}
Object.keys(myObject)
ã³ãã³ããå®è¡ãããšãé
å
[firstName, lastName]
ãè¿ãããŸãã
次ã«ãå¥ã®ããããã£ãããšãã°
newProperty
ã
myObject
ãªããžã§ã¯ãã«è¿œå ããŸãã åæã«ã以åãšåãå€ãè¿ãããã«
Object.keys(myObject)
ã³ãã³ããå¿
èŠ
Object.keys(myObject)
ã€ãŸãããã®é¢æ°ã§æ°ããããããã£
newProperty
ç¡èŠããå¿
èŠãããïŒãã€ãŸã
[firstName, lastName]
ã not [
firstName, lastName, newProperty]
ã ã©ããã£ãŠããã®ïŒ
å®éã
symbol
ããŒã¿åãåºçŸããåã¯ãããã¯äžå¯èœã§ããã ããã§ã
newProperty
ãã·ã³ãã«ãšããŠè¿œå ãããšã
Object.keys(myObject)
ã³ãã³ã
Object.keys(myObject)
ãã®ããããã£
Object.keys(myObject)
ç¡èŠãïŒåã«ãããç¥ããªãããïŒãå¿
èŠãªãã®ãè¿ããŸã-
[firstName, lastName]
ã
âçç±çªå·2ã ååã®è¡çªåé¿
JavaScriptã®éçºã«æºãã人ã
ã¯ããªããžã§ã¯ãã®æ°ããããããã£ãäžæã§ããããšãæãã§ããŸãã ããã«ãããååã®è¡çªãå¿é
ããããšãªããã°ããŒãã«ãªããžã§ã¯ãã«æ°ããããããã£ãè¿œå ãç¶ããããšãã§ããŸãïŒJSã䜿çšããŠå®éã®åé¡ã解決ããéçºè
ãåãããšãã§ããŸãïŒã
ããšãã°ããããžã§ã¯ãã«åãçµãã§ããŠãç¬èªã®
toUpperCase
ã¡ãœããã
Array.prototype
ã«è¿œå ããããšã«ãããšããŸãã
Array.prototype.toUpperCase
ã¡ãœããã®ããŒãžã§ã³ãããç¹å®ã®ã©ã€ãã©ãªããããžã§ã¯ãã«æ¥ç¶ããïŒãŸãã¯ES2019ãåºãïŒããšãæ³åããŠãã ããã ããã«ãããã³ãŒããæ£ããåäœããªããªããšããäºå®ã«ã€ãªããå¯èœæ§ããããŸãã
äŸãèããŠã¿ãŸãããã
Array.prototype.toUpperCase = function(){ var i; for (i = 0; i<this.length; i++){ this[i] = this[i].toUpperCase(); } return this; } var myArray = ['raja', 'rao']; myArray.toUpperCase();
éçºè
ããã®ååšãèªèããŠããªãå Žåããã®ãããªè¡çªã解決ããæ¹æ³ã¯ïŒ ããã§ã·ã³ãã«ãå©ãã«ãªããŸãã äžæã®èå¥åãå
éšã«äœæãããååã®è¡çªãå¿é
ããããšãªãããªããžã§ã¯ãã«æ°ããããããã£ãšã¡ãœãããè¿œå ã§ããŸãã
âçç±çªå·3ã ããã°ã©ããŒãç¬èªã«éçºããã¡ãœããã®èšèªã®æšæºã¡ã«ããºã ã«ããåŒã³åºãã®ç·šæ
String.prototype.search
ãªã©ã®æšæºé¢æ°ããæååå
ã®äœããæ€çŽ¢ããããžãã¯ãå®è£
ããç¬èªã®é¢æ°ãåŒã³åºããšä»®å®ããŸãã ã€ãŸããããšãã°ãæ§æ
'somestring'.search(myObject);
ãå¿
èŠ
'somestring'.search(myObject);
myObject
ã®
search
é¢æ°ãåŒã³åºããåŒæ°ãšããŠ
'somestring'
ãæž¡ããŸãã ã©ããã£ãŠããã®ïŒ
ES2015ã®æ©èœã圹ç«ã€ã®ã¯ãã®ãããªç¶æ³ã§ãããã®å Žåããæ¢ç¥ã®ã·ã³ãã«ããšåŒã°ããå€ãã®ã°ããŒãã«ã·ã³ãã«ããããŸãã ãªããžã§ã¯ãã«ãããã®æåã®ããããã§è¡šãããããããã£ãããå Žåãæšæºé¢æ°ã䜿çšããŠé¢æ°ã®åŒã³åºããæŽçã§ããŸãã 以äžã§ã¯ããã®ã¡ã«ããºã ããã詳现ã«æ€èšããŸãããããè¡ãåã«ãã·ã³ãã«ã®æäœæ¹æ³ã«ã€ããŠèª¬æããŸãã
charactersãã£ã©ã¯ã¿ãŒã®äœæ
ã°ããŒãã«
Symbol
é¢æ°ãåŒã³åºãããšã«ãããæ°ããã·ã³ãã«ãäœæã§ããŸãã ãã®é¢æ°ã¯ã
symbol
åã®å€ãè¿ããŸãã
ã·ã³ãã«ã«ã¯ã¡ãœãããããããããªããžã§ã¯ããšééãããå¯èœæ§ããããŸããããªããžã§ã¯ãã§ã¯ãªãããšã«æ³šæããŠãã ããã ãããã¯ããªããã£ããªå€ã§ãã ãããã¯ãããã€ãã®ãç¹å¥ãªããªããžã§ã¯ããšèããããšãã§ããŸããããã¯ãéåžžã®ãªããžã§ã¯ãã«å€å°äŒŒãŠããŸãããåäœãç°ãªããŸãã
ããšãã°ãã·ã³ãã«ã«ã¯ãªããžã§ã¯ãã«é¢é£ããã¡ãœããããããŸããããªããžã§ã¯ããšã¯ç°ãªããã·ã³ãã«ã¯äžå€ã§äžæã§ãã
charactersãã£ã©ã¯ã¿ãŒãšæ°ããããŒã¯ãŒãã®äœæ
ã·ã³ãã«ã¯ãªããžã§ã¯ãã§ã¯ãªãããã
new
ããŒã¯ãŒãã䜿çšãããšæ°ãããªããžã§ã¯ããè¿ãããããšãäºæ³ãããããã
new
ããŒã¯ãŒãã䜿çšããŠ
symbol
åã®ãšã³ãã£ãã£ãäœæããããšã¯ã§ããŸããã
var mySymbol = new Symbol();
charactersæåã®ã説æã
ã·ã³ãã«ã®ã説æããšåŒã°ãããã®ã¯æååãšããŠè¡šç€ºããããã®ã³ã°ã«äœ¿çšãããŸãã
// mySymbol , // - "some text" const mySymbol = Symbol('some text');
âãŠããŒã¯ãªãã£ã©ã¯ã¿ãŒ
åãèšè¿°ã䜿çšããŠã·ã³ãã«ãäœæããŠããã·ã³ãã«ã¯äžæã§ãã ãã®ã¹ããŒãã¡ã³ãã¯ã次ã®äŸã§èª¬æã§ããŸãã
const mySymbol1 = Symbol('some text'); const mySymbol2 = Symbol('some text'); mySymbol1 == mySymbol2
SymbolSymbol.forã¡ãœããã䜿çšããæåã®äœæ
Symbol()
é¢æ°ã䜿çšããŠ
Symbol()
åã®å€æ°ãäœæãã代ããã«ã
Symbol.for(<key>)
ã¡ãœããã䜿çšããŠ
Symbol.for(<key>)
äœæã§ããŸãã ãã®ã¡ãœããã¯ããŒïŒæåå
<key>
ïŒãåãåããæ°ããæåãäœæããŸãã åæã«ãæ¢åã®ã·ã³ãã«ã«æ¢ã«å²ãåœãŠãããŠããããŒããã®ã¡ãœããã«æ¢ã«å²ãåœãŠãããŠããå Žåããã®æ¢åã®ã·ã³ãã«ãè¿ãããŸãã ãããã£ãŠã
Symbol.for
ã®åäœã¯ã·ã³ã°ã«ãã³ãã¶ã€ã³ãã¿ãŒã³ã«äŒŒãŠãããšèšããŸãã
var mySymbol1 = Symbol.for('some key'); // var mySymbol2 = Symbol.for('some key'); // mySymbol1 == mySymbol2 //true
Symbol.for
ã¡ãœãããååšãããããããå Žæã§ã·ã³ãã«ãäœæããå¥ã®å Žæã§ããããæäœã§ããŸãã
.for()
ã¡ãœããã®æ©èœã¯ããã§ã«äœ¿çšãããŠããããŒãæž¡ããšããã®ããŒã§æ°ãããã£ã©ã¯ã¿ãŒãäœæããã«ãæ¢åã®ããŒãè¿ãããšã«æ³šæããŠãã ããã ãããã£ãŠã泚æããŠäœ¿çšããŠãã ããã
âããŒãšãã£ã©ã¯ã¿ãŒã®èª¬æ
Symbol.for
ã³ã³ã¹ãã©ã¯ãã䜿çšããªãå Žåãã·ã³ãã«ã¯ãåãããŒã䜿çšããå Žåã§ãäžæã«ãªãããšã«æ³šæããŠãã ããã ãã ãã
Symbol.for
ã䜿çšãã
Symbol.for
ãäžæã§ãªãããŒãæå®ãããšã
Symbols.for
ã«ãã£ãŠè¿ãããã·ã³ãã«ã¯
Symbols.for
ã¯ãªããªããŸãã äŸãèããŠã¿ãŸãããã
var mySymbol1 = Symbol('some text'); // "some text" var mySymbol2 = Symbol('some text'); // "some text" var mySymbol3 = Symbol.for('some text'); // "some text" var mySymbol4 = Symbol.for('some text'); // , mySymbol3 // true, // .for // mySymbol3 == mySymbol4 //true // mySymbol1 == mySymbol2 //false mySymbol1 == mySymbol3 //false mySymbol1 == mySymbol4 //false
propertyããããã£ããããã£ã®èå¥åãšããŠã®æåã®äœ¿çš
æåã¯ãªããžã§ã¯ãã®ããã«èŠããŸãããããªããã£ããªå€ã§ãã ããããããããã®ãŠããŒã¯ãªæ©èœãæãæ··ä¹±ãæããŸãã ç¹ã«ãæåã¯ãªããžã§ã¯ãã®ããããã£ã®èå¥åãšããŠäœ¿çšã§ããŸããããã«ã¯æååã䜿çšãããŸãã
å®éããªããžã§ã¯ãããããã£èå¥åã¯ãã·ã³ãã«ã®äž»ãªçšéã®1ã€ã§ãã
const mySymbol = Symbol("Some car description"); const myObject = {name: 'bmw'}; myObject[mySymbol] = 'This is a car';
ã·ã³ãã«ã§ãããªããžã§ã¯ãã®ããããã£ã¯ããã·ã³ãã«ããŒä»ãããããã£ããŸãã¯ãã·ã³ãã«ããŒãæã€ããããã£ããšåŒã°ããŸãã
âãã€ã³ããšè§æ¬åŒ§
ã·ã³ãã«ã§ãããªããžã§ã¯ãã®ããããã£ãæäœããå Žåããã®æŒç®åã¯æååã§æå®ãããããããã£ã®æäœã«ã®ã¿é©ããŠãããããããªãªãã¯äœ¿çšã§ããŸããã 代ããã«ããã®ãããªç¶æ³ã§ã¯è§æ¬åŒ§ã䜿çšããå¿
èŠããããŸãã
let myCar = {name: 'BMW'}; let type = Symbol('store car type'); myCar[type] = 'A_1uxury_Sedan'; let honk = Symbol('store honk function'); myCar[honk] = () => 'honk'; // myCar.type; // myCar[type]; // 'store car type' myCar.honk(); // myCar[honk](); // 'honk'
symbolsãªãã·ã³ãã«ã䜿çšããã®ã§ããïŒ
ã·ã³ãã«ã®ä»çµã¿ãåŠç¿ããã®ã§ãã·ã³ãã«ã䜿çšãã3ã€ã®äž»ãªçç±ãç¹°ãè¿ããŠèãçŽããŸãããã
â çç± ïŒ 1ã ãªããžã§ã¯ãããããã£èå¥åãšããŠäœ¿çšãããã·ã³ãã«ã¯ãã«ãŒããä»ã®ã¡ãœããããã¯èŠããŸããã
次ã®äŸã§ã¯ã
for-in
ã«ãŒãã¯
obj
ãªããžã§ã¯ãã®ããããã£ãã«ãŒãããŸããã
prop3
ããã³
prop4
ããããã£ã¯èªèããŸããïŒãŸãã¯ãããã®ããããã£ãç¡èŠããŸãïŒããããã®èå¥åã¯æåã§è¡šãããããã§ãã
var obj = {}; obj['prop1'] = 1; obj['prop2'] = 2; // -, // ( // ) var prop3 = Symbol('prop3'); var prop4 = Symbol('prop4'); obj[prop3] = 3; obj[prop4] = 4; for(var key in obj){ console.log(key, '=', obj[key]); } // , // prop3 prop4 //prop1 = 1 //prop2 = 2 // prop3 prop4 , // console.log(obj[prop3]); //3 console.log(obj[prop4]); //4
以äžã¯ã
Object.keys
ããã³
Object.getOwnPropertyNames
ãæåã§è¡šãããããããã£åãç¡èŠããå¥ã®äŸã§ãã
const obj = { name: 'raja' }; // - obj[Symbol('store string')] = 'some string'; obj[Symbol('store func')] = () => console.log('function'); // - // console.log(Object.keys(obj)); //[name] console.log(Object.getOwnPropertyNames(obj)); //[name]
â çç±çªå·2ã ã·ã³ãã«ã¯ãŠããŒã¯ã§ã
ç¬èªã®
Array.prototype.includes
ã¡ãœããããããã¿ã€ãã«è¿œå ããŠãã°ããŒãã«
Array
ãªããžã§ã¯ããæ¡åŒµããå¿
èŠããããšããŸãã ãã®ã¡ãœããã¯ãJavaScript ES2018ã«ååšããæšæºã®includeã¡ãœãããšç«¶åããŸãã ãã®æ¹æ³ã§ãããã¿ã€ããæäŸããè¡çªãé¿ããæ¹æ³ã¯ïŒ
æå
includes
ãincludesãšããå€æ°ãäœæããŠãããã«ã·ã³ãã«ãå²ãåœãŠãå¿
èŠããããŸãã 次ã«ããã®å€æ°ã䜿çšããŠãæ¬åŒ§è¡šèšã䜿çšããŠæ°ããããããã£ãã°ããŒãã«
Array
ãªããžã§ã¯ãã«è¿œå ããå¿
èŠããããŸãã ãã®åŸãå¿
èŠãªæ©èœãæ°ããããããã£ã«å²ãåœãŠãã ãã§ãã
æ°ããé¢æ°ãåŒã³åºãã«ã¯ãè§æ¬åŒ§ã䜿çšããå¿
èŠããããŸãã ããã«ãæ¬åŒ§å
ã§ã¯ã察å¿ããå€æ°ã®ååãã€ãŸã
arr[includes]()
ãããªãã®ã䜿çšããå¿
èŠããããéåžžã®æååã§ã¯ãªãããšã«æ³šæããŠãã ããã
var includes = Symbol('will store custom includes method'); // Array.prototype Array.prototype[includes] = () => console.log('inside includes func'); // var arr = [1,2,3]; // // includes console.log(arr.includes(1)); //true console.log(arr['includes'](1)); //true // includes arr[includes](); // 'inside includes func', includes -
â çç±çªå·3ã æ¢ç¥ã®ã·ã³ãã«ïŒã°ããŒãã«ã·ã³ãã«ïŒ
ããã©ã«ãã§ã¯ãJavaScriptã¯å€ãã®ã·ã³ãã«å€æ°ãèªåçã«äœæããããããã°ããŒãã«
Symbol
ãªããžã§ã¯ãã«æžã蟌ã¿ãŸãïŒæ°ããã·ã³ãã«ã®äœæã«äœ¿çšãããã®ãšåããªããžã§ã¯ãã«ã€ããŠè©±ããŸãïŒã
ECMAScript 2015ã§ã¯ããããã®æåã䜿çšããŠã
String
ã
Array
ãªã©
String.prototype.replace
æšæºãªããžã§ã¯ãã®
String.prototype.search
ã
String.prototype.replace
ãªã©ã®åºæ¬ã¡ãœããã
String.prototype.search
ããŸãã
ãã®ãããªã·ã³ãã«ã®äŸã次ã«ç€ºããŸã
Symbol.match
ã
Symbol.replace
ã
Symbol.search
ã
Symbol.iterator
ããã³
Symbol.split
ã
ãããã®æåã¯ã°ããŒãã«ã§å
¬éãããŠãããããæšæºãªããžã§ã¯ãã¡ãœãããå
éšã¡ãœããã§ã¯ãªãç¬èªã®é¢æ°ãåŒã³åºãããã«ããããšãã§ããŸãã
â äŸ1 Symbol.searchã®äœ¿çš
String.prototype.search
ãªããžã§ã¯ãã®ãããªãã¯
String.prototype.search
ã¡ãœããã¯ãæ£èŠè¡šçŸãŸãã¯ãµã³ãã«æååã䜿çšããŠæååãæ€çŽ¢ããå¿
èŠãªãã®ãèŠã€ããããšã«æåããå Žåãåæäžã®æååã®æ€çŽ¢ã®ã€ã³ããã¯ã¹ãè¿ããŸãã
'rajarao'.search(/rao/); 'rajarao'.search('rao');
ES2015ã§ã¯ããã®ã¡ãœããã¯æåã«
Symbol.search
ã¡ãœããã
RegExp
ãªããžã§ã¯ãã«
Symbol.search
ããŠãããã©ããã確èªããŸãã ãã®å Žåãæ€çŽ¢ãå®è¡ãããã®ã¯
RegExp
ãªããžã§ã¯ãã¡ãœããã§ãã ãããã£ãŠã
RegExp
ãªã©ã®åºæ¬ãªããžã§ã¯ãã¯ãæ€çŽ¢ã®åé¡ã解決ãã
Symbol.search
ã«å¯Ÿå¿ããã¡ãœãããå®è£
ããŸãã
âå
éšã¡ã«ããºã Symbol.searchïŒæšæºåäœïŒ
æååå
ã®éšåæååãèŠã€ããããã»ã¹ã¯ã次ã®æé ã§æ§æãããŸãã
- ã³ãã³ã
'rajarao'.search('rao');
- æåã·ãŒã±ã³ã¹
"rajarao"
String (new String("rajarao"))
ãªããžã§ã¯ãã«å€æãããŸãString (new String("rajarao"))
- æåã·ãŒã±ã³ã¹
"rao"
RegExp (new Regexp("rao"))
ãªããžã§ã¯ãã«å€æãããŸãRegExp (new Regexp("rao"))
- æåå
"rajarao"
åºã¥ãString
ãªããžã§ã¯ãã®search
ã¡ãœãã"rajarao"
Symbol.search
ãªããžã§ã¯ãã®search
ã¡ãœããå
ã§ã Symbol.search
ãªããžã§ã¯ãã®Symbol.search
ã¡ãœãããåŒã³åºãããŸãïŒã€ãŸããæ€çŽ¢æäœã®å®è¡ã¯Symbol.search
ãªããžã§ã¯ãã«å§ä»»ãããŸãïŒã æåå"rajarao"
ãã®ã¡ãœããã«æž¡ãããŸãã ãã®åŒã³åºããå³åŒçã«è¡šããšã次ã®ããã«ãªããŸãã "rao"[Symbol.search]("rajarao")
"rao"[Symbol.search]("rajarao")
ã¯ãæ€çŽ¢çµæãšããŠãæååå
ã®éšåæååã®ã€ã³ããã¯ã¹ãè¡šãæ°å€4ã "rajarao"
ãªããžã§ã¯ãã®search
é¢æ°ãè¿ãããã®é¢æ°ã¯ã³ãŒãã«4ãè¿ããŸãã
以äžã¯ãäžèšã®æšæºJavaScriptãªããžã§ã¯ãã®å
éšã¡ã«ããºã ã®æ§é ã瀺ãæ¬äŒŒã³ãŒãã§èšè¿°ãããã¹ããããã§ãã
// String class String { constructor(value){ this.value = value; } search(obj){ // Symbol.search obj // value obj[Symbol.search](this.value); } } // RegExp class RegExp { constructor(value){ this.value = value; } // [Symbol.search](string){ return string.indexOf(this.value); } }
æãèå³æ·±ãã®ã¯ãåæ§ã®ç¶æ³ã§
RegExp
ãªããžã§ã¯ãã䜿çšããããšããªãã·ã§ã³ã«ãªã£ãããšã§ãã æšæºã®
String.prototype.search
é¢æ°
String.prototype.search
ãéçºè
ãå¿
èŠãšãããã®ãè¿ã
Symbol.search
ã¡ãœãããå®è£
ãããªããžã§ã¯ããæ£ããèªè
String.prototype.search
ããã«ãªããŸãããããã«ãããã³ãŒããæ··ä¹±ããããšã¯ãããŸããã ããã«ã€ããŠããã«è©³ãã説æããŸãã
â äŸ2 Symbol.searchã䜿çšããŠãæšæºé¢æ°ããç¬èªã®éçºé¢æ°ã®åŒã³åºããæŽçãã
次ã®äŸã¯ã
String.prototype.search
é¢æ°
String.prototype.search
ç¬èªã®
Product
ã¯ã©ã¹ã®æ€çŽ¢é¢æ°ã
String.prototype.search
æ¹æ³ã瀺ããŠããŸãã ããã¯ãã°ããŒãã«
Symbol.search
ã·ã³ãã«ã®ãããã§å¯èœã§ãã
class Product { constructor(type){ this.type = type; } // [Symbol.search](string){ return string.indexOf(this.type) >=0 ? 'FOUND' : "NOT_FOUND"; } } var soapObj = new Product('soap'); 'barsoap'.search(soapObj); //FOUND 'shampoo'.search(soapObj); //NOT_FOUND
âå
éšSymbol.searchã¡ã«ããºã ïŒã«ã¹ã¿ã åäœïŒ
ãªããžã§ã¯ãã1è¡ã§ãæ€çŽ¢ããããšã次ã®ã¢ã¯ã·ã§ã³ãå®è¡ãããŸãã
- ã³ãã³ã
'barsoap'.search(soapObj);
æåã·ãŒã±ã³ã¹"barsoap"
String
ãªããžã§ã¯ãã«å€æãããŸãïŒ new String("barsoap")
ïŒ soapObj
ãã§ã«ãªããžã§ã¯ãã§ãããããå€æãããŸãã"barsoap"
æååã«åºã¥ãString
ãªããžã§ã¯ãã®search
ã¡ãœãã"barsoap"
- ãã®ã¡ãœããå
ã§ã
Symbol.search
ãªããžã§ã¯ãã®Symbol.search
ã¡ãœãããsoapObj
ïŒæ€çŽ¢æäœã¯ãã®ãªããžã§ã¯ãã«å§ä»»ãããŸãïŒãæåå"barsoap"
ã å®éã次ã®ãããªã³ãã³ãã«ã€ããŠè©±ããŠããïŒ soapObj[Symbol.search]("barsoap")
soapObj[Symbol.search]("barsoap")
soapObj[Symbol.search]("barsoap")
ã¯ã soapObj
ãªããžã§ã¯ãã®å
éšããžãã¯ã«åŸã£ãŠãå€FOUND
ããã³NOT_FOUND
ååŸã§ããsearch
é¢æ°ãè¿ããŸãã search
é¢æ°ã¯ãã®çµæãã³ãŒãã«è¿ããŸãã
ã·ã³ãã«ãç解ããã®ã§ãã€ãã¬ãŒã¿ãŒãæ±ããŸãã
å埩åãšå埩å¯èœãªããžã§ã¯ã
ãŸãããªããããå¿
èŠãªã®ããèªåããŸãã ããã§ã®äºå®ã¯ãã»ãšãã©ãã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ã§ããŒã¿ãªã¹ããæäœããå¿
èŠããããšããããšã§ãã ããšãã°ããããã®ãªã¹ãã¯ãéåžžã®WebããŒãžãŸãã¯ã¢ãã€ã«ã¢ããªã±ãŒã·ã§ã³ã«è¡šç€ºããå¿
èŠããããŸãã éåžžãéçºè
ã¯ãã®ãããªãªã¹ãããããŒã¿ãä¿åããã³ååŸããããã®ç¬èªã®ã¡ãœãããäœæããŸãã
ãã ãã
for-of
ã«ãŒããæ¡åŒµæŒç®åïŒ
âŠ
ïŒãªã©ãé
åãæââååã
Map
åã®ãªããžã§ã¯ããªã©ã®æšæºãªããžã§ã¯ãããããŒã¿ã»ãããæœåºããããã«èšèšãããæšæºèšèªã¡ã«ããºã ãæ¢ã«çšæãããŠããŸãã ãããã®æšæºçãªæ¹æ³ã䜿çšããŠãããŒã¿ã»ãããä¿åããç¬èªã®ãªããžã§ã¯ããæäœããªãã®ã¯ãªãã§ããïŒ
次ã®äŸã¯ã
for-of
ã«ãŒããšæ¡åŒµæŒç®åã䜿çšããŠãèªåã§äœæãã
User
ã¯ã©ã¹ããããŒã¿ãååŸã§ããªãããšã瀺ããŠããŸãã ããã§ããããæäœããã«ã¯ã
get
ã¡ãœããã䜿çšããå¿
èŠããããŸããããã¯ãç§ãã¡èªèº«ãäœæããŸããã
// // for-of // // Users, // class Users { constructor(users){ this.users = users; } // get() { return this.users; } } const allUsers = new Users([ { name: 'raja' }, { name: 'john' }, { name: 'matt' }, ]); // allUsers.get() , for (const user of allUsers){ console.log(user); } // TypeError: allUsers is not iterable // const users = [...allUsers]; // TypeError: allUsers is not iterable
ç¬èªã®ãªããžã§ã¯ããæäœããããã«ãæšæºã®èšèªã¡ã«ããºã ã䜿çšã§ãããšäŸ¿å©ã§ãã ãããå®çŸããã«ã¯ãæšæºã®JSããŒã«ã§äœ¿çšã§ãããªããžã§ã¯ããäœæãããšãã«éçºè
ãåŸãããšãã§ããã«ãŒã«ãå¿
èŠã§ãã
å®éããã®ãããªã«ãŒã«ãååšããŸãã ãªããžã§ã¯ãããããŒã¿ãæœåºããæ©èœã«ã€ããŠèª¬æããŸãã ãããã®ã«ãŒã«ã«åŸã£ãŠæ§ç¯ããããªããžã§ã¯ãã¯
iterables
ãšåŒã°ããŸãã
ãããã¯èŠåã§ãïŒ
- ã¡ã€ã³ã®ãªããžã§ã¯ã/ã¯ã©ã¹ã¯ããã€ãã®ããŒã¿ãä¿åããå¿
èŠããããŸãã
- 3ã6ç¯ã§èª¬æãããŠããã¡ãœãããå®è£
ããæ¢ç¥ã®
Symbol.iterator
ã·ã³ãã«ã§ããããããã£ãå¿
èŠã§ãã
Symbol.iterator
ã¡ãœããã¯ãå¥ã®ãªããžã§ã¯ã-ã€ãã¬ãŒã¿ãè¿ãå¿
èŠããããŸãã
- å埩åã«ã¯
next
ã¡ãœãããå¿
èŠã§ãã next
æ¹æ³ã§ã¯ã段èœ1ã§èª¬æããããŒã¿ã«ã¢ã¯ã»ã¹ããå¿
èŠããããŸãã
next
ã¡ãœãããåŒã³åºããšããã€ãã¬ãŒã¿ãä»ã®äœããè¿ãããšãã§ããå Žåã¯{value:<stored data>, done: false}
ã®åœ¢åŒã§ããŸãã¯{done: true}
ã®åœ¢åŒã§ã¹ããã1ã®ããŒã¿ãè¿ãå¿
èŠããã{done: true}
ã€ãã¬ãŒã¿ã«ã¯ãã以äžè¿ããã®ã¯ãããŸããã
ãããã®èŠä»¶ããã¹ãŠæºããããŠããå Žåãã¡ã€ã³ãªããžã§ã¯ãã¯å埩å¯èœãšåŒã°ãããããè¿ããªããžã§ã¯ãã¯å埩åãšåŒã°ããŸãã
次ã«ã
Users
ãªããžã§ã¯ããå埩å¯èœã«ããæ¹æ³ã«ã€ããŠèª¬æããŸãã
// // Users , // Symbol.iterator, next, // class Users{ constructor(users){ this.users = users; } // Symbol.iterator - , // [Symbol.iterator](){ let i = 0; let users = this.users; // return { next(){ if (i<users.length) { return { done: false, value: users[i++] }; } return { done: true }; }, }; } } //allUsers const allUsers = new Users([ { name: 'raja' }, { name: 'john' }, { name: 'matt' }, ]); //allUsersIterator const allUsersIterator = allUsers[Symbol.iterator](); // next , // console.log(allUsersIterator.next()); console.log(allUsersIterator.next()); console.log(allUsersIterator.next()); // : //{ done: false, value: { name: 'raja' } } //{ done: false, value: { name: 'john' } } //{ done: false, value: { name: 'matt' } } // for-of for(const u of allUsers){ console.log(u.name); } // : raja, john, matt // console.log([...allUsers]); //
, (
allUsers
)
for-of
,
<iterable>[Symbol.iterator]()
, (
allUsersIterator
), .
.
:
- .
- , , .
.
â â1.
, , , - (generator), .
.
- - ,
*<myGenerator>
. - function * myGenerator(){}
myGenerator()
generator
, () , , , iterator
.yield
.yield
, .yield
, , next
.
â â1. - Symbol.iterator
- (
*getIterator()
)
Symbol.iterator
next()
, .
// , // - (*getIterator()) // class Users{ constructor(users) { this.users = users; this.len = users.length; } // , *getIterator(){ for (let i in this.users){ yield this.users[i]; // , //yield } } } const allUsers = new Users([ { name: 'raja' }, { name: 'john' }, { name: 'matt' }, ]); //allUsersIterator const allUsersIterator = allUsers.getIterator(); // next , // console.log(allUsersIterator.next()); console.log(allUsersIterator.next()); console.log(allUsersIterator.next()); console.log(allUsersIterator.next()); // : //{ done: false, value: { name: 'raja' } } //{ done: false, value: { name: 'john' } } //{ done: false, value: { name: 'matt' } } //{ done: true, value: undefined } // for-of for(const u of allUsers.getIterator()){ console.log(u.name); } // : raja, john, matt // console.log([...allUsers.getIterator()]); //
â â2. -
-. , , , . - (
*
)
yield
.
// Users - , function* Users(users){ for (let i in users){ yield users[i++]; // , //yield } } const allUsers = Users([ { name: 'raja' }, { name: 'john' }, { name: 'matt' }, ]); // next , // console.log(allUsers.next()); console.log(allUsers.next()); console.log(allUsers.next()); console.log(allUsers.next()); // : //{ done: false, value: { name: 'raja' } } //{ done: false, value: { name: 'john' } } //{ done: false, value: { name: 'matt' } } //{ done: true, value: undefined } const allUsers1 = Users([ { name: 'raja' }, { name: 'john' }, { name: 'matt' }, ]); // for-of for(const u of allUsers1){ console.log(u.name); } // : raja, john, matt const allUsers2 = Users([ { name: 'raja' }, { name: 'john' }, { name: 'matt' }, ]); // console.log([...allUsers2]); //
, «iterator»
allUsers
, , ,
Generator
.
Generator
throw
return
,
next
. , , .
â â2.
, , , .
, , ,
yield
( , ) , , ,
yield
.
, , -
yield
, . ,
generator.next("some new value")
,
yield
.
-, , .
function* generator(a, b){ // a + b // , k , // a + b let k = yield a + b; // m let m = yield a + b + k; yield a + b + k + m; } var gen = generator(10, 20); // a + b // , done false, // yield console.log(gen.next()); //{value: 30, done: false} // , //a b, .next() , - //, , // // k 50 a + b + k console.log(gen.next(50)); //{value: 80, done: false} // , a, b k. // .next() , // , // m 100 a + b + k + m console.log(gen.next(100)); //{value: 180, done: false} // .next(), undefined, // yield console.log(gen.next()); //{value: undefined, done: true}
â
.
// // - function *myGenerator() {} // function * myGenerator() {} // function* myGenerator() {} // const myGenerator = function*() {} // , // let generator = *() => {} // //SyntaxError: Unexpected token * // ES2015 class MyClass { *myGenerator() {} } // const myObject = { *myGenerator() {} }
â yield return
yield
,
return
. , ,
return
, . ,
yield
, .
function* myGenerator() { let name = 'raja'; yield name; console.log('you can do more stuff after yield'); } // const myIterator = myGenerator(); // .next() console.log(myIterator.next()); //{value: "raja", done: false} // .next() // // 'you can do more stuff after yield' //{value: undefined, done: true} console.log(myIterator.next());
â yield
yield
, ,
return
, ,
yield
.
function* myGenerator() { let name = 'raja'; yield name; let lastName = 'rao'; yield lastName; } // const myIterator = myGenerator(); // .next() console.log(myIterator.next()); //{value: "raja", done: false} // .next() console.log(myIterator.next()); //{value: "rao", done: false}
â next
.next()
.
, , , ( ). , ,
redux-saga .
.next()
, ( ). (
23
),
.next(23)
.
function* profileGenerator() { // .next() , //, yield, . // , , // .next(), answer let answer = yield 'How old are you?'; // 'adult' 'child' // answer if (answer > 18){ yield 'adult'; } else { yield 'child'; } } // const myIterator = profileGenerator(); console.log(myIterator.next()); //{value: "How old are you?", done: false} console.log(myIterator.next(23)); //{value: "adult", done: false}
â
, .
, ,
co , , ,
.next()
. , .
,
co
.next(result)
â5 10, .
co(function *() { let post = yield Post.findByID(10); let comments = yield post.getComments(); console.log(post, comments); }).catch(function(err){ console.error(err); });
co
, ,Post.findByID(10)
Post.findByID(10)
- , ,
.next(result)
post
post.getComments()
post.getComments()
- , ,
.next(result)
comments
console.log(post, comments);
async/await.
async/await
, , , , ,
co
. , â , ECMAScript , .
async
await
.
async/await.
- async/await
await
yield
. await
.async function
, function*
.
,
async/await
â , « ».
async
, , JavaScript- , -. , ,
await
. ,
await
, , .
getAmount
â
getUser
getBankBalance
. , async/await .
// ES2015... function getAmount(userId){ getUser(userId) .then(getBankBalance) .then(amount => { console.log(amount); }); } // async/await ES2017 async function getAmount2(userId){ var user = await getUser(userId); var amount = await getBankBalance(user); console.log(amount); } getAmount('1'); //$1,000 getAmount2('1'); //$1,000 function getUser(userId){ return new Promise(resolve => { setTimeout(() => { resolve('john'); }, 1000); }); } function getBankBalance(user){ return new Promise((resolve, reject) => { setTimeout(() => { if (user == 'john'){ resolve('$1,000'); } else { reject('unknown user'); } }, 1000); }); }
. ES2018 ( ) TC39
Symbol.asyncIterator
, â
for-await-of
, .
.
â
.next()
{value: 'some val', done: false}
: iterator.next() //{value: 'some val', done: false}
â
.next()
, , ,
{value: 'some val', done: false}
.
:
iterator.next().then(({ value, done })=> {//{value: 'some val', done: false}}
for-await-of
.
const promises = [ new Promise(resolve => resolve(1)), new Promise(resolve => resolve(2)), new Promise(resolve => resolve(3)), ];
ãŸãšã
JavaScript, , , . .
- , . , , , ,
Object.keys
for-in
.
- â JavaScript, .
- â , . ,
for-of
.
- â , ,
.next()
. .
- â , . , , , , â async/await.
- async/await , .
- â ES2018, . , , , .
芪æãªãèªè
ïŒ , , ?
