'あいう'.slice(0, 2); 👉 'あい'
/**
 * 文字列の特定の範囲を抽出し、新しい文字列として返す関数
 * str.slice(beginIndex[, endIndex])
 * 
 * @param {number} beginIndex - 抽出を開始する部分文字列の開始インデックス。
 * @param {number} endIndex - 抽出を終了する部分文字列の終了インデックス(直前まで抽出)。
 * @returns {string} - 抽出された部分文字列。
*/

/*
 * 注意してください!
 * 文字列のインデックスは0から始まります。
 * 最初の文字のインデックスは0で、2番目の文字のインデックスは1です。
*/

const greeting = "ようこそ。コーディングエブリバディです。";

const hello = greeting.slice(0, 5);
console.log(hello); // 出力: "ようこそ。"

const niceTomeetYou = greeting.slice(6, 11);
console.log(niceTomeetYou); // 出力: "コーディング"

/* 👇 元の文字列は変更されません。 */
console.log(greeting); // 出力: "ようこそ。コーディングエブリバディです。"
str.slice(beginIndex)
str.slice(beginIndex, endIndex)
let str1 = "ようこそ。", // str1の長さは5です。
    str2 = str1.slice(1, 8),
    str3 = str1.slice(4, -1),
    str4 = str1.slice(),
    str5 = str1.slice(30);
    
console.log(str2); // 出力: "うこそ。"
console.log(str3); // 出力: "。"
console.log(str4); // 出力: "ようこそ。"
console.log(str5); // 出力: ""
// 🚨 コードユニット基準で切り取られる例
'😃🏀🍅'.slice(0, 2);
// 結果: '😃'
// 2文字を切り取ったように見えますが、
// 実際には2つのコードユニットだけが抽出され、最初の絵文字だけが返されます。

// ❌ 絵文字を途中で切ってしまう危険な例
'😃🏀🍅'.slice(0, 1);
// 結果: 文字化け
// サロゲートペアの半分だけが切り取られ、文字データが壊れてしまいます。
const emojiString = '😃🏀🍅🐵';

// スプレッド構文を使用して文字単位の配列に変換
const emojiArray = [...emojiString];
// ['😃', '🏀', '🍅', '🐵']

// 必要な文字数だけ安全に切り出す
const result = emojiArray.slice(0, 2).join('');

console.log(result);
// 出力: "😃🏀"
const str = "JavaScript";

// slice()
console.log(str.slice(4, 1));  // "" (空の文字列)

// substring()
console.log(str.substring(4, 1));  // "ava"
const originalString = "Hello, World!";
const slicedString = originalString.slice(0, 5);

console.log(slicedString); // 出力: "Hello"
const greeting = "Hello";
const modifiedGreeting = greeting.slice(0, 3) + "p!";

console.log(modifiedGreeting); // 出力: "Help!"
const originalString = "こんにちは、JavaScript!";
const stringWithoutSegment = originalString.slice(0, 5) + originalString.slice(-1);

console.log(stringWithoutSegment); // 出力: "こんにちは!"