JavaScriptã«ã¯Javaã§è¨€ã†ã¨ã“ã‚ã®String.startsWithãŒãªã„ã§ã™ã€‚ã¿ã‚“ãªã©ã†ã‚„ã£ã¦ã„ã‚‹ã‹ã¨ã„ã†ã¨ã€
if (str.indexOf('prefix') === 0) {
console.log('prefix found');
}
ã¿ãŸã„ãªæ„Ÿã˜ã®ã‚³ãƒ¼ãƒ‰ã‚’よã見ã¾ã™ã€‚AngularJSã®ã‚½ãƒ¼ã‚¹ã§ã‚‚見ã¾ã—ãŸã€‚ã§ã‚‚ã€ã“れã£ã¦è‰¯ã考ãˆã‚‹ã¨ç„¡é§„ã§ã™ã‚ˆã。indexOfã¨ã„ã†ã®ã¯æ–‡å—列を最åˆã‹ã‚‰æœ€å¾Œã¾ã§ãªã‚ã¦ã€ä¸€è‡´ã™ã‚‹ä½ç½®ã‚’探ã™ã®ã§ã™ã€‚見ã¤ã‹ã‚Œã°ä¸€ç™ºã§ã™ãŒã€è¦‹ã¤ã‹ã‚‰ãªã‘ã‚Œã°æœ€å¾Œã¾ã§è¡Œã£ã¦-1ã‚’è¿”ã—ã¾ã™ã€‚本æ¥ã€prefixを判定ã™ã‚‹ã®ãªã‚‰æœ€åˆã ã‘æ¤œæŸ»ã™ã‚Œã°ã„ã„ã®ã§ã™ã€‚
str.substring(0, 'prefix'.length) === 'prefix'
ã¨ã„ã†æ›¸ã方も見ã¾ã™ãŒã€ã“れもã„ã¾ã²ã¨ã¤ã§ã™ã€‚substringã¯æ–°ãŸã«æ–‡å—列を作ã£ã¦ã—ã¾ã†ã®ã§ã€‚çµè«–ã¨ã—ã¦ã¯ã€
str.lastIndexOf('prefix', 0) === 0
ãŒä¸€ç•ªã„ã„ã¨æ€ã„ã¾ã™ã€‚lastIndexOfã¯æ–‡å—列ã®å¾Œã‚ã‹ã‚‰æ¤œæŸ»ã™ã‚‹ã®ã§ã™ãŒã€æ¤œæŸ»é–‹å§‹ä½ç½®ã‚’0ã«ã—ã¦ã„ã‚‹ã®ã§ã€åˆ¤å®šã™ã‚‹ã®ã¯ä¸€å›žã ã‘ã§ã™ã€‚Javaã®å†…部実装ã«ã¯è©³ã—ããªã„ã§ã™ãŒã€String.startsWithã‚‚åŒã˜ã‚ˆã†ãªå®Ÿè£…ã§ã—ょã†ã€‚
ã•ã¦ã€ã“ã‚ŒãŒæœ¬å½“ã‹ã‚’確ã‹ã‚ã‚‹ãŸã‚ã«ã€benchmark.jsã§ãƒ™ãƒ³ãƒãƒžãƒ¼ã‚¯ã‚’書ã“ã†ã‹ã¨æ€ã„ã¾ã—ãŸã€‚ã„ã‚„ã€ã›ã£ã‹ããªã®ã§jsperfã§æ›¸ã„ã¦ã¿ã‚ˆã†ã¨æ€ã£ã¦ã€æ›¸ãå§‹ã‚ãŸã‚‰ã€ã‚ã‚Œã€æ—¢ã«å˜åœ¨ã™ã‚‹ã€‚世ã®ä¸åŒã˜ã“ã¨è€ƒãˆã‚‹äººã¯ã„ã¾ã™ã。
http://jsperf.com/string-startswith/3
最後ã®ä¸€ã¤ã®ãƒ†ã‚¹ãƒˆã‚±ãƒ¼ã‚¹ã¯ç§ãŒè¿½åŠ ã—ãŸã‚‚ã®ã§ã™ã€‚
想定通りã€lastIndexOfãŒé€Ÿã„ã§ã™ã€‚ん?ã—ã‹ã—ã€Chromeã ã¨compiled regexã®æ–¹ãŒé€Ÿã„。ã„ã‚„ã€ãã‚“ãªã¯ãšã¯ã€ã€ã€‚compiled regexãŒé€Ÿã„ã®ã¯äº‹å®Ÿã§ã™ãŒã€lastIndexOfãŒé…ã„ã®ã§ã™ã€‚ã“ã‚“ãªå˜ç´”ãªé–¢æ•°ã§ChromeãŒFirefoxよりé…ã„ã®ã¯æƒ³å®šå¤–ã§ã—ãŸã€‚
Chromeã§é…ã„ã¨ã„ã†ã“ã¨ã¯ã€v8ãŒé…ã„ã®ã‹ã¨æ€ã£ã¦ã€node.jsã§ã‚‚テストã—ã¦ã¿ã¾ã—ãŸã€‚
https://gist.github.com/dai-shi/4950506
案ã®å®šã€node.jsã§ã‚‚åŒæ§˜ã®çµæžœã§ã™ã€‚
ãれã§ã‚‚ã€ç§ã¯lastIndexOfを使ã†ã“ã¨ã‚’ãŠã™ã™ã‚ã—ã¾ã™ã€‚
v8ã§é…ã„ã®ã¯v8ãŒç›´ã‚‹ã¹ãã§ã™ã€‚ã¨ã“ã‚ã§ã€ã“れã¯issueã«ãªã£ã¦ã„ã‚‹ã®ã‹ãªï¼Ÿ
http://code.google.com/p/v8/issues/list
ã©ã†ã‚„らãªã£ã¦ã„ãªã„よã†ã§ã™ã€‚ã¡ã‚‡ã£ã¨ã‚½ãƒ¼ã‚¹ã‚’覗ã„ã¦ã¿ã¾ã™ã‹ã€‚v8ã¯subversionã§ã™ã€‚bleeding edgeブランãƒãŒæœ€æ–°ã®ã‚ˆã†ã§ã™ã€‚
http://v8.googlecode.com/svn/branches/bleeding_edge/
checkoutã—ã¦StringLastIndexOfã®ã‚½ãƒ¼ã‚¹ã‚³ãƒ¼ãƒ‰ã‚’追ã£ã¦ã¿ã¾ã—ãŸãŒã€ç‰¹ã«å˜ç´”ãªå•題ãŒã‚るよã†ã«ã¯è¦‹ãˆã¾ã›ã‚“。久ã—ã¶ã‚Šã®Cã®ã‚½ãƒ¼ã‚¹ã§é ãŒç–²ã‚Œã¾ã™ã€‚ãりゃãã†ã§ã™ã‚ˆãã€å¤©ä¸‹ã®GoogleãŒä½œã£ã¦ã„ã‚‹ã‚‚ã®ãŒãã‚“ãªè‡ªæ˜Žãªãƒã‚°ã‚’残ã—ã¦ã„ã‚‹ã‚ã‘ãªã„ã§ã™ã‚ˆã。ã¨ã„ã†ã‚ã‘ã§ã€ã—ã°ã‚‰ãã¯æ§˜åã‚’ã¿ã‚‹ã“ã¨ã«ã—ã¾ã™ã€‚
ã¨ã“ã‚ã§ã€jsperf.comã«string-startswithãŒã‚ã£ãŸã®ãŒæ‚”ã—ã‹ã£ãŸã®ã§ã€çœŸä¼¼ã—ã¦string-endswithを作ã£ã¦ã¿ã¾ã—ãŸã€‚
http://jsperf.com/string-endswith
傾å‘ã¯startsWithã¨åŒæ§˜ã§ã™ã€‚ã“ã“ã¾ã§èªã‚“ã§ãれãŸã¿ãªã•ã‚“ã€suffixãƒã‚§ãƒƒã‚¯ã™ã‚‹ã¨ãã«ã€é–“é•ã£ã¦ã‚‚naive indexOfã®ã‚ˆã†ãªæ›¸ãæ–¹ã¯ã—ãªã„よã†ã«ã€‚