const greeting = "환영합니다. 코딩에브리바디입니다.";

/*
 * 주의하세요!
 * 문자열에서 인덱스는 0부터 시작합니다.
 * 첫 번째 문자열의 인덱스는 0이고, 두 번째 문자열의 인덱스는 1입니다.
*/

// 문자열 greeting에서 문자열 "환영합니다."를 찾아
// 첫 번째로 검색된(등장한) 문자열("환")의 인덱스를 반환합니다.
const hello = greeting.indexOf("환영합니다.");
console.log(hello); // 출력: 0;

// 문자열 greeting에서 인수로 전달된 문자열 "반갑습니다."를 찾을 수 없으므로
// -1을 반환합니다.
const niceTomeetYou = greeting.indexOf("반갑습니다.");
console.log(niceTomeetYou); // 출력: -1;

const coding = greeting.indexOf("코딩", 5);
// 두 번째 인수는 검색을 시작할 인덱스입니다.
// 이 인수는 옵션으로, 생략하면 처음(0)부터 검색합니다.
// 인덱스는 여전히 맨 왼쪽부터 오른쪽으로 카운트됩니다.
// 인수의 값이 5이므로, 6번째부터 검색했을 때 문자 "코딩"은 검색이 되고,
// 맨 왼쪽(인덱스 0)부터 검색된 문자열 "코"의 인덱스는 7입니다.

console.log(coding); // 출력: 7;
str.indexOf(searchValue[, fromIndex])
/*
 * 인수로 전달된 문자열이 indexOf() 함수를 적용할 문자열에서 중복으로 있다면,
 * 첫 번째로 검색된(등장한) 문자열의 인덱스를 반환합니다.
*/
const str = "색상은 빨강, 파랑, 파랑, 노랑입니다.";

// 문자열 str에서 문자열 "파"를 찾아 첫 번째로 검색된(등장한) 문자열의 인덱스를 반환합니다.
const val_1 = str.indexOf("파");

// 문자열 str에서 찾을 문자열 "파"는 두 개가 있습니다.
// 인덱스 8과 12에 있습니다.
// 하지만, 첫 번째로 검색된 찾을 문자열의 인덱스인 8을 반환합니다.
console.log(val_1); // 출력: 8;

// 문자열 str에서 인수로 전달된 문자열 "녹"을 찾을 수 없으므로 -1일 반환합니다.
const val_2 = str.indexOf("녹");
console.log(val_2); // 출력: -1;

const val_3 = str.indexOf("은", 1);
// 두 번째 인수는 검색을 시작할 인덱스입니다.
// 이 인수는 옵션으로, 생략하면 처음(0)부터 검색합니다.
// 인수의 값이 1이므로, 두 번째 문자열부터 검색했을 때 찾을 문자열 "은"은 검색이 되고,
// 맨 왼쪽(인덱스 0)부터 검색된 문자열 "은"의 인덱스는 2입니다.

console.log(val_3); // 출력: 2;

//////////////////////////////////////////
const undefinedStr = "값을 할당하지 않은 변수의 값을 undefined라 합니다.";
const val_4 = undefinedStr.indexOf();

// 첫 번째 매개변수에 아무 값도 주어지지 않으면
// 문자열 "undefined"를 찾으려는 문자열로 사용합니다.
// "undefined"의 인덱스인 18을 반환합니다.
console.log(val_4); // 출력: 18;
const redString = "red";
const searchRed = redString.indexOf("Red");

// 대문자 "R"과 소문자 "r"을 구분합니다.
console.log(searchRed); // 출력: -1;
const str = "Hello, world!";

if (str.indexOf("world") !== -1) {
    console.log("부분 문자열이 존재합니다.");
} else {
    console.log("부분 문자열이 존재하지 않습니다.");
}

// 출력: "부분 문자열이 존재합니다."
const str = "Hello, World!";
const searchStr = "world";

if (str.toLowerCase().indexOf(searchStr.toLowerCase()) !== -1) {
    console.log("부분 문자열이 대소문자와 관계없이 존재합니다.");
}

// 출력: "부분 문자열이 대소문자와 관계없이 존재합니다."
// 주어진 문자열
const str = "Hello, world! Hello, universe!";

// 찾고자 하는 부분 문자열
const searchStr = "Hello";

let count = 0;

// 문자열에서 초기 발생 위치를 찾음
let idx = str.indexOf(searchStr);

// 발생 위치를 찾을 때까지 반복
while (idx !== -1) {
    // 발생 횟수 추가
    count++;

    // 다음 발생 위치를 찾기 위해, 이전 발생 위치 이후에서 다시 검색
    idx = str.indexOf(searchStr, idx + 1);
}

// 찾는 문자열의 반복 횟수 출력
console.log("찾는 문자열의 반복 횟수:", count);
// 출력: 찾는 문자열의 반복 횟수: 2

caniuse.com에서 더 자세한 정보를 확인해 보세요.