질문자 :sol
JavaScript에서 String.StartsWith
에 해당하는 내용을 어떻게 작성합니까?
var haystack = 'hello world'; var needle = 'he'; haystack.startsWith(needle) == true
참고: 이것은 오래된 질문이며 ECMAScript 2015(ES6) 주석에서 지적한 대로 .startsWith
메서드를 도입했습니다. 그러나 이 업데이트(2015)를 작성하는 시점에서 브라우저 지원은 아직 완료되지 않았습니다 .
ECMAScript 6의 String.prototype.startsWith()
메서드를 사용할 수 있지만 아직 모든 브라우저에서 지원되지는 않습니다 . shim/polyfill을 사용하여 지원하지 않는 브라우저에 추가할 수 있습니다. 사양에 나와 있는 모든 세부 사항 을 준수하는 구현을 만드는 것은 약간 복잡합니다. 충실한 심을 원하면 다음 중 하나를 사용하십시오.
메서드를 shimm하면(또는 이미 있는 브라우저 및 JavaScript 엔진만 지원하는 경우) 다음과 같이 사용할 수 있습니다.
console.log("Hello World!".startsWith("He")); // true var haystack = "Hello world"; var prefix = 'orl'; console.log(haystack.startsWith(prefix)); // false
Christian C. Salvadó.lastIndexOf
또 다른 대안:
haystack.lastIndexOf(needle, 0) === 0
를 통해이 모습을 뒤쪽으로 haystack
의 발생에 대한 needle
인덱스에서 시작하여 0
의 haystack
. haystack
이 needle
시작하는지 여부만 확인합니다.
원칙적으로 이것은 다른 접근 방식에 비해 성능상의 이점이 있어야 합니다.
-
haystack
검색하지 않습니다. - 새 임시 문자열을 만든 다음 즉시 삭제하지 않습니다.
Mark Byers
data.substring(0, input.length) === input
cobbal도우미 기능 없이 regex의 .test
메서드만 사용:
/^He/.test('Hello world')
하드코딩된 문자열이 아닌 동적 문자열로 이 작업을 수행하려면(문자열에 regexp 제어 문자가 포함되지 않는다고 가정):
new RegExp('^' + needle).test(haystack)
Javascript에 RegExp.escape 함수가 있습니까?를 확인해야 합니다. regexp 제어 문자가 문자열에 나타날 가능성이 있는 경우.
Vincent최상의 솔루션:
function startsWith(str, word) { return str.lastIndexOf(word, 0) === 0; }
당신이 너무 필요로하는 경우 그리고 여기 endsWith입니다 :
function endsWith(str, word) { return str.indexOf(word, str.length - word.length) !== -1; }
String으로 프로토타입을 만드는 것을 선호하는 사람들을 위해:
String.prototype.startsWith || (String.prototype.startsWith = function(word) { return this.lastIndexOf(word, 0) === 0; }); String.prototype.endsWith || (String.prototype.endsWith = function(word) { return this.indexOf(word, this.length - word.length) !== -1; });
용법:
"abc".startsWith("ab") true "c".ensdWith("c") true
방법으로:
startsWith("aaa", "a") true startsWith("aaa", "ab") false startsWith("abc", "abc") true startsWith("abc", "c") false startsWith("abc", "a") true startsWith("abc", "ba") false startsWith("abc", "ab") true
mmm나는 이것에 대한 내 의견을 추가하고 싶었습니다.
나는 우리가 다음과 같이 사용할 수 있다고 생각합니다.
var haystack = 'hello world'; var needle = 'he'; if (haystack.indexOf(needle) == 0) { // Code if string starts with this substring }
Mr.D다음은 CMS 솔루션에 대한 약간의 개선 사항입니다.
if(!String.prototype.startsWith){ String.prototype.startsWith = function (str) { return !this.indexOf(str); } } "Hello World!".startsWith("He"); // true var data = "Hello world"; var input = 'He'; data.startsWith(input); // true
향후 브라우저에서 네이티브 코드로 구현하거나 다른 라이브러리에서 구현하는 경우를 대비하여 함수가 이미 존재하는지 확인합니다. 예를 들어 프로토타입 라이브러리는 이미 이 기능을 구현합니다.
사용 !
=== 0
보다 약간 더 빠르고 간결합니다.
Kikuchyo또한 underscore.string.js를 확인하십시오. startsWith
메소드를 포함하여 많은 유용한 문자열 테스트 및 조작 메소드와 함께 제공됩니다. 문서에서:
startsWith _.startsWith(string, starts)
이 메서드는 string
시작으로 starts
하는지 확인합니다.
_("image.gif").startsWith("image") => true
studgeek나는 최근에 나 자신에게 같은 질문을 던졌다.
가능한 솔루션은 여러 가지가 있으며 유효한 솔루션은 3가지입니다.
루프를 사용하는 마지막 솔루션을 찾지 못했습니다.
놀랍게도 이 솔루션은 처음 3가지 솔루션보다 상당한 차이가 있습니다.
다음은 이 결론에 도달하기 위해 수행한 jsperf 테스트입니다. http://jsperf.com/startswith2/2
평화
ps: ecmascript 6(하모니)은 문자열에 대한 startsWith
초기 버전 자체에 이렇게 많이 필요한 방법을 포함할 생각을 했다면 얼마나 시간이 절약되었을지 생각해 보십시오.
업데이트
Steve가 지적했듯이(이 답변에 대한 첫 번째 의견) 주어진 접두사 가 전체 문자열보다 짧으면 위의 사용자 정의 함수에서 오류가 발생합니다. 그는 이를 수정하고 http://jsperf.com/startswith2/4 에서 볼 수 있는 루프 최적화를 추가했습니다.
Steve가 포함시킨 2개의 루프 최적화가 있다는 점에 유의하십시오. 둘 중 첫 번째는 더 나은 성능을 보였으므로 아래에 해당 코드를 게시하겠습니다.
function startsWith2(str, prefix) { if (str.length < prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i) continue; return i < 0; }
Raj Nathani이것이 매우 인기가 있기 때문에 ECMA 6에 이 방법에 대한 구현이 있으며 이를 준비하기 위해 미래의 문제와 찢어짐을 방지하기 위해 '공식' 폴리필을 사용해야 한다는 점을 지적할 가치가 있다고 생각합니다.
운 좋게도 Mozilla의 전문가가 다음 중 하나를 제공합니다.
https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith
if (!String.prototype.startsWith) { String.prototype.startsWith = function(searchString, position) { position = position || 0; return this.indexOf(searchString, position) === position; }; }
이는 ECMA 6으로 전환할 때 정상적으로 무시된다는 이점이 있습니다.
Scheintod가장 성능이 좋은 솔루션은 라이브러리 호출 사용을 중지하고 두 개의 어레이로 작업하고 있다는 것을 인식하는 것입니다. 수동 구현은 여기에서 본 다른 모든 솔루션보다 짧고 빠릅니다.
function startsWith2(str, prefix) { if (str.length < prefix.length) return false; for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i) continue; return i < 0; }
성능 비교(성공 및 실패)는 http://jsperf.com/startswith2/4를 참조하십시오. (나를 능가할 수 있는 이후 버전을 확인하십시오.)
Steve Hollasch이 문자열 라이브러리에 대해 방금 배웠습니다.
http://stringjs.com/
js 파일을 포함하고 다음과 같이 S
S('hi there').endsWith('hi there')
다음을 설치하여 NodeJS에서도 사용할 수 있습니다.
npm install string
S
변수로 요구합니다.
var S = require('string');
웹 페이지에는 마음에 들지 않는 경우 대체 문자열 라이브러리에 대한 링크도 있습니다.
Ashley Davis- 질문은 조금 오래되었지만 여기에 제공된 모든 답변과 Jim Buck이 공유한 jsperf를 기반으로 만든 몇 가지 벤치마크를 보여주기 위해 이 답변을 작성하고 싶었습니다.
나는 기본적으로 긴 바늘이 긴 건초 더미 안에 있고 마지막 문자를 제외하고는 매우 유사한지 찾는 빠른 방법이 필요했습니다.
다음은 각 함수(splice, substring, startsWith 등)에 대해 nestedString
)과 1.000의 거짓 또는 진실 바늘 문자열에 대해 거짓과 참을 반환할 때 테스트하는 코드입니다. 000자( testParentStringFalse
및 testParentStringTrue
):
// nestedString is made of 1.000.001 '1' repeated characters. var nestedString = '...' // testParentStringFalse is made of 1.000.000 characters, // all characters are repeated '1', but the last one is '2', // so for this string the test should return false. var testParentStringFalse = '...' // testParentStringTrue is made of 1.000.000 '1' repeated characters, // so for this string the test should return true. var testParentStringTrue = '...' // You can make these very long strings by running the following bash command // and edit each one as needed in your editor // (NOTE: on OS X, `pbcopy` copies the string to the clipboard buffer, // on Linux, you would probably need to replace it with `xclip`): // // printf '1%.0s' {1..1000000} | pbcopy // function testString() { let dateStart let dateEnd let avg let count = 100000 const falseResults = [] const trueResults = [] /* slice */ console.log('========> slice') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.slice(0, testParentStringFalse.length) === testParentStringFalse } dateEnd = +new Date() avg = (dateEnd - dateStart)/count falseResults[falseResults.length] = { label: 'slice', avg } console.log(`testString() slice = false`, res, 'avg: ' + avg + 'ms') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.slice(0, testParentStringTrue.length) === testParentStringTrue } dateEnd = +new Date() avg = (dateEnd - dateStart)/count trueResults[trueResults.length] = { label: 'slice', avg } console.log(`testString() slice = true`, res, 'avg: ' + avg + 'ms') console.log('<======== slice') console.log('') /* slice END */ /* lastIndexOf */ console.log('========> lastIndexOf') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.lastIndexOf(testParentStringFalse, 0) === 0 } dateEnd = +new Date() avg = (dateEnd - dateStart)/count falseResults[falseResults.length] = { label: 'lastIndexOf', avg } console.log(`testString() lastIndexOf = false`, res, 'avg: ' + avg + 'ms') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.lastIndexOf(testParentStringTrue, 0) === 0 } dateEnd = +new Date() avg = (dateEnd - dateStart)/count trueResults[trueResults.length] = { label: 'lastIndexOf', avg } console.log(`testString() lastIndexOf = true`, res, 'avg: ' + avg + 'ms') console.log('<======== lastIndexOf') console.log('') /* lastIndexOf END */ /* indexOf */ console.log('========> indexOf') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.indexOf(testParentStringFalse) === 0 } dateEnd = +new Date() avg = (dateEnd - dateStart)/count falseResults[falseResults.length] = { label: 'indexOf', avg } console.log(`testString() indexOf = false`, res, 'avg: ' + avg + 'ms') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.indexOf(testParentStringTrue) === 0 } dateEnd = +new Date() avg = (dateEnd - dateStart)/count trueResults[trueResults.length] = { label: 'indexOf', avg } console.log(`testString() indexOf = true`, res, 'avg: ' + avg + 'ms') console.log('<======== indexOf') console.log('') /* indexOf END */ /* substring */ console.log('========> substring') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.substring(0, testParentStringFalse.length) === testParentStringFalse } dateEnd = +new Date() avg = (dateEnd - dateStart)/count falseResults[falseResults.length] = { label: 'substring', avg } console.log(`testString() substring = false`, res, 'avg: ' + avg + 'ms') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.substring(0, testParentStringTrue.length) === testParentStringTrue } dateEnd = +new Date() avg = (dateEnd - dateStart)/count trueResults[trueResults.length] = { label: 'substring', avg } console.log(`testString() substring = true`, res, 'avg: ' + avg + 'ms') console.log('<======== substring') console.log('') /* substring END */ /* startsWith */ console.log('========> startsWith') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.startsWith(testParentStringFalse) } dateEnd = +new Date() avg = (dateEnd - dateStart)/count falseResults[falseResults.length] = { label: 'startsWith', avg } console.log(`testString() startsWith = false`, res, 'avg: ' + avg + 'ms') dateStart = +new Date() var res for (let j = 0; j < count; j++) { res = nestedString.startsWith(testParentStringTrue) } dateEnd = +new Date() avg = (dateEnd - dateStart)/count trueResults[trueResults.length] = { label: 'startsWith', avg } console.log(`testString() startsWith = true`, res, 'avg: ' + avg + 'ms') console.log('<======== startsWith') console.log('') /* startsWith END */ falseResults.sort((a, b) => a.avg - b.avg) trueResults.sort((a, b) => a.avg - b.avg) console.log('false results from fastest to slowest avg:', falseResults) console.log('true results from fastest to slowest avg:', trueResults) }
Chrome 75 , Firefox 67 , Safari 12 및 Opera 62 에서 이 벤치마크 테스트를 실행했습니다.
이 컴퓨터에는 Edge와 IE가 없기 때문에 포함하지 않았지만, 여러분 중 누군가가 Edge 및 적어도 IE 9에 대해 스크립트를 실행하고 여기에서 출력을 공유하고 싶어한다면 결과를 보고 매우 궁금할 것입니다.
3개의 긴 문자열을 다시 만들고 스크립트를 파일에 저장해야 한다는 점을 기억하세요. 그런 다음 브라우저에서 열어 브라우저 콘솔에서 복사/붙여넣기를 하면 각 문자열의 길이가 >= 1.000.000이므로 차단됩니다.
출력은 다음과 같습니다.
Chrome 75( substring
승리):
false results from fastest to slowest avg: 1) {"label":"substring","avg":0.08271} 2) {"label":"slice","avg":0.08615} 3) {"label":"lastIndexOf","avg":0.77025} 4) {"label":"indexOf","avg":1.64375} 5) {"label":"startsWith","avg":3.5454} true results from fastest to slowest avg: 1) {"label":"substring","avg":0.08213} 2) {"label":"slice","avg":0.08342} 3) {"label":"lastIndexOf","avg":0.7831} 4) {"label":"indexOf","avg":0.88988} 5) {"label":"startsWith","avg":3.55448}
Firefox 67( indexOf
승리):
false results from fastest to slowest avg 1) {"label":"indexOf","avg":0.1807} 2) {"label":"startsWith","avg":0.74621} 3) {"label":"substring","avg":0.74898} 4) {"label":"slice","avg":0.78584} 5) {"label":"lastIndexOf","avg":0.79668} true results from fastest to slowest avg: 1) {"label":"indexOf","avg":0.09528} 2) {"label":"substring","avg":0.75468} 3) {"label":"startsWith","avg":0.76717} 4) {"label":"slice","avg":0.77222} 5) {"label":"lastIndexOf","avg":0.80527}
Safari 12(잘못된 결과에 대해 slice
startsWith
승리, 전체 테스트를 실행하는 총 시간 측면에서 Safari가 가장 빠름):
false results from fastest to slowest avg: 1) "{\"label\":\"slice\",\"avg\":0.0362}" 2) "{\"label\":\"startsWith\",\"avg\":0.1141}" 3) "{\"label\":\"lastIndexOf\",\"avg\":0.11512}" 4) "{\"label\":\"substring\",\"avg\":0.14751}" 5) "{\"label\":\"indexOf\",\"avg\":0.23109}" true results from fastest to slowest avg: 1) "{\"label\":\"startsWith\",\"avg\":0.11207}" 2) "{\"label\":\"lastIndexOf\",\"avg\":0.12196}" 3) "{\"label\":\"substring\",\"avg\":0.12495}" 4) "{\"label\":\"indexOf\",\"avg\":0.33667}" 5) "{\"label\":\"slice\",\"avg\":0.49923}"
Opera 62( substring
이깁니다. 결과는 Chrome과 유사하며 Opera가 Chromium 및 Blink를 기반으로 하기 때문에 놀라지 않습니다):
false results from fastest to slowest avg: {"label":"substring","avg":0.09321} {"label":"slice","avg":0.09463} {"label":"lastIndexOf","avg":0.95347} {"label":"indexOf","avg":1.6337} {"label":"startsWith","avg":3.61454} true results from fastest to slowest avg: 1) {"label":"substring","avg":0.08855} 2) {"label":"slice","avg":0.12227} 3) {"label":"indexOf","avg":0.79914} 4) {"label":"lastIndexOf","avg":1.05086} 5) {"label":"startsWith","avg":3.70808}
모든 브라우저에는 자체 구현 세부 정보가 있습니다(Chrome의 Chromium 및 Blink를 기반으로 하는 Opera 제외).
물론 다른 사용 사례로 추가 테스트를 수행할 수 있고 수행해야 하지만(예: 건초 더미에 비해 바늘이 정말 짧은 경우, 건초 더미가 바늘보다 짧은 경우 등...) 제 경우에는 매우 긴 문자열과 여기에서 공유하고 싶었습니다.
tonixvar str = 'hol'; var data = 'hola mundo'; if (data.length >= str.length && data.substring(0, str.length) == str) return true; else return false;
Chris여기에 있는 답변을 기반으로 하면 이것은 JSPerf 테스트를 기반으로 하는 최고의 성능을 제공하는 것으로 보이기 때문에 현재 사용 중인 버전입니다(내가 말할 수 있는 한 기능적으로 완전함).
if(typeof String.prototype.startsWith != 'function'){ String.prototype.startsWith = function(str){ if(str == null) return false; var i = str.length; if(this.length < i) return false; for(--i; (i >= 0) && (this[i] === str[i]); --i) continue; return i < 0; } }
이것은 http://jsperf.com/startswith2/6 의 startsWith2 를 기반으로 했습니다. 약간의 성능 향상을 위해 약간의 조정을 추가했으며, 이후 비교 문자열이 null인지 정의되지 않았는지 확인하고 CMS 답변의 기술을 사용하여 문자열 프로토타입에 추가하도록 변환했습니다.
이 구현은 이 Mozilla 개발자 네트워크 페이지에 언급된 "위치" 매개변수를 지원하지 않지만 어쨌든 ECMAScript 제안의 일부가 아닌 것 같습니다.
Edward Millen나는 자바 스크립트에 대해 확실하지 않지만 typescript에서 나는 다음과 같은 일을했습니다.
var str = "something"; (<String>str).startsWith("some");
나는 그것이 js에서도 작동해야한다고 생각합니다. 도움이 되기를 바랍니다!
Andreas Hadjithoma문자열 객체에는 startsWith, endWith와 같은 메소드가 있으며 메소드가 포함됩니다.
StartsWith는 주어진 문자열이 처음부터 시작하는지 여부를 확인합니다.
endWith는 주어진 문자열이 끝에 있는지 여부를 확인합니다.
Include는 주어진 문자열이 어떤 부분에 존재하는지 여부를 확인합니다.
아래 youtube 비디오에서 이 세 가지의 완전한 차이점을 찾을 수 있습니다.
https://www.youtube.com/watch?v=E-hyeSwg0PA
Leela NarasimhastartsWith()
및 endsWith()
로 작업하는 경우 선행 공백에 대해 주의해야 합니다. 다음은 완전한 예입니다.
var str1 = " Your String Value Here.!! "; // Starts & ends with spaces if (str1.startsWith("Your")) { } // returns FALSE due to the leading spaces… if (str1.endsWith("Here.!!")) { } // returns FALSE due to trailing spaces… var str2 = str1.trim(); // Removes all spaces (and other white-space) from start and end of `str1`. if (str2.startsWith("Your")) { } // returns TRUE if (str2.endsWith("Here.!!")) { } // returns TRUE
immayankmodi또한 배열 프로토타입에 대한 고유한 프로토타입/확장(일명
Array.prototype.mySearch = function (target) { if (typeof String.prototype.startsWith != 'function') { String.prototype.startsWith = function (str){ return this.slice(0, str.length) == str; }; } var retValues = []; for (var i = 0; i < this.length; i++) { if (this[i].startsWith(target)) { retValues.push(this[i]); } } return retValues; };
그리고 그것을 사용하려면:
var myArray = ['Hello', 'Helium', 'Hideout', 'Hamster']; var myResult = myArray.mySearch('Hel'); // result -> Hello, Helium
Nepaluz출처 : http:www.stackoverflow.com/questions/646628/how-to-check-if-a-string-startswith-another-string