`String` na bagay
Ipinapaliwanag ng artikulong ito ang String na bagay.
Sinasaklaw ng paliwanag ang lahat mula sa mga batayan hanggang sa mga advanced na teknik, kabilang ang mga problemang may kaugnayan sa Unicode at regular expressions, sunud-sunod at madaling intindihin.
YouTube Video
String na bagay
Ang mga string sa JavaScript ay isa sa mga pinakaginagamit na uri sa pang-araw-araw na development.
Pagkakaiba ng mga Primitibong String at String na Bagay
Ang mga primitibong string (gaya ng "hello") ay kumikilos nang iba kumpara sa mga wrapper object tulad ng new String("hello"). Karaniwan, dapat mong gamitin ang mga primitive, at bihira lang na dapat gumamit ng object form.
1// Primitive string
2const a = "hello";
3
4// String wrapper object
5const b = new String("hello");
6
7console.log(typeof a); // "string"
8console.log(typeof b); // "object"
9console.log(a === b); // false — wrapper objects are not strictly equal
- Ipinapakita ng code na ito ang pagkakaiba ng type sa pagitan ng primitive at wrapper at kung paano sila umaasal sa strict na paghahambing. Sa karamihan ng mga kaso, iwasan ang paggamit ng
new String()at manatili sa primitives.
Mga Paraan ng Paglikha ng String (Literals at Template Literals)
Kapaki-pakinabang ang template literals para sa paglalagay ng mga variable at pagsusulat ng multi-line na string. Maari kang magpasok ng variable at suriin ang mga expression nang intuitively.
1const name = "Alice";
2const age = 30;
3
4// Template literal
5const greeting = `Name: ${name}, Age: ${age + 1}`;
6
7console.log(greeting); // "Name: Alice, Age: 31"
- Ang template literals ay madaling basahin at mainam para sa paggawa ng masalimuot na string, kabilang ang multi-line na string.
Karaniwang Paraan (Paghahanap at Pagkuha ng Substring)
Maraming pangunahing paraan ang String na bagay.
1const text = "Hello, world! Hello again.";
2
3// search
4console.log(text.indexOf("Hello")); // 0
5console.log(text.indexOf("Hello", 1)); // 13
6console.log(text.includes("world")); // true
7console.log(text.startsWith("Hello")); // true
8console.log(text.endsWith("again.")); // true
9
10// slice / substring
11console.log(text.slice(7, 12)); // "world"
12console.log(text.substring(7, 12)); // "world"
- Magkatulad ang
sliceatsubstring, ngunit magkaiba kung paano nila hawakan ang negative indexes. Angsliceay itinuturing ang mga negatibong halaga bilang posisyon mula sa dulo. Maging malinaw kung alin ang gagamitin.
Paghiwalay at Pagsama (split/join)
Karaniwan nang paghiwalayin ang string sa array para iproseso at saka pagsamahin muli.
1const csv = "red,green,blue";
2const arr = csv.split(","); // ["red","green","blue"]
3
4console.log(arr);
5console.log(arr.join(" | ")); // "red | green | blue"
- Karaniwang pattern ang paggamit ng
splitpara hatiin ang string, iproseso ang array gamit angmapofilter, at pagkatapos ay gamitin angjoinpara pagsamahin muli.
Pagpalit at Regular Expressions
Ang replace ay pumapalit lamang sa unang match. Kung nais mong palitan ang lahat ng match, gumamit ng g flag sa regular expression. Maari kang magpasa ng function bilang pamalit upang magsagawa rin ng dynamic na pagpapalit.
1const s = "foo 1 foo 2";
2
3// replace first only
4console.log(s.replace("foo", "bar")); // "bar 1 foo 2"
5
6// replace all using regex
7console.log(s.replace(/foo/g, "bar")); // "bar 1 bar 2"
8
9// replace with function
10const r = s.replace(/\d+/g, (match) => String(Number(match) * 10));
11console.log(r); // "foo 10 foo 20"
- Sa dynamic na pampalit gamit ang function, makakagawa ka ng mas pinaikling code na sumusuri at nagbabago ng mga match.
Pag-convert ng Case at Normalization
Para sa multilinggwal na suporta at paghahambing, bukod sa toLowerCase at toUpperCase, mahalaga rin ang Unicode normalization (normalize). Lalo itong kailangan kapag naghahambing ng mga may accent na karakter.
1// Case conversion example:
2// "\u00DF" represents the German letter "ß".
3// In some locales, converting "ß" to uppercase becomes "SS".
4// JavaScript follows this behavior.
5console.log("\u00DF");
6console.log("\u00DF".toUpperCase()); // "SS"
7
8// Unicode normalization example:
9// "e\u0301" is "e" + a combining acute accent.
10// "\u00e9" is the precomposed character "é".
11// These two look the same but are different code point sequences.
12const a = "e\u0301";
13const b = "\u00e9";
14
15console.log(a === b); // false: different underlying code points
16console.log(a.normalize() === b.normalize()); // true: normalized to the same form
- Magkakaiba ang Unicode representation, tulad ng ligatures at pinagsamang character, kaya’t hindi sila pantay sa karaniwan; gamitin ang
normalize()bago maghambing.
Unicode at Code Points (Paghawak ng Surrogate Pairs)
Ang mga string ng JavaScript ay mga sunud-sunod na UTF-16 code units, kaya ang ilang karakter gaya ng emojis ay maaaring gumamit ng dalawang code units para sa isang karakter. Upang mahawakan ang tunay na character units, gamitin ang Array.from, spread operator, o for...of.
1// Emoji composed with multiple code points:
2// "\u{1F469}" = woman, "\u{200D}" = Zero Width Joiner (ZWJ),
3// "\u{1F4BB}" = laptop. Combined, they form a single emoji: 👩💻
4const s = "\u{1F469}\u{200D}\u{1F4BB}";
5console.log(s);
6
7// Length in UTF-16 code units (not actual Unicode characters):
8// Because this emoji uses surrogate pairs + ZWJ, the length may be > 1.
9console.log("Length:", s.length);
10
11// Iterate by Unicode code points (ES6 for...of iterates code points):
12// Each iteration gives a full Unicode character, not UTF-16 units.
13for (const ch of s) {
14 console.log(ch);
15}
16
17// Convert to an array of Unicode characters:
18console.log(Array.from(s));- Ang
lengthay nagbabalik ng bilang ng code units, kaya’t maaaring hindi tumugma sa inaasahang bilang kapag may emoji o ligature. Angfor...ofatArray.fromay nag-aasikaso ng bagay na malapit sa ipinapakitang characters (grapheme clusters), ngunit kung kailangan mo ng ganap na grapheme support, gumamit ng specialized na library.
Ligtas na Pagpapalit gamit ang Regular Expression (Kapag Humahawak ng Input ng User)
Kung makalimutan mong i-escape ang input ng user kapag inilalagay ito sa isang regular na ekspresyon, maaari itong magdulot ng hindi inaasahang pag-uugali at kahinaan sa seguridad. Laging i-escape ang user input bago gamitin sa pattern.
1function escapeRegex(s) {
2 return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
3}
4
5const userInput = "a+b";
6const pattern = new RegExp(escapeRegex(userInput), "g");
7console.log("a+b a+b".replace(pattern, "X")); // "X X"
- Huwag gumamit ng user string nang direkta sa regular expressions; laging i-escape muna bago bumuo ng regex.
Mga Tip sa Performance: Pagdikit-dikit (Concatenation) at Mga Template
Kapag nagdudugtong ng maraming maliliit na string sunud-sunod, mas episyente kung ilagay ito sa array at gumamit ng join. Sa kabilang banda, madaling basahin at sapat ang bilis ng template strings sa karamihan ng sitwasyon.
1// concatenation in loop (less ideal)
2let s = "";
3for (let i = 0; i < 1000; i++) {
4 s += i + ",";
5}
6
7// using array + join (often faster for many pieces)
8const parts = [];
9for (let i = 0; i < 1000; i++) {
10 parts.push(i + ",");
11}
12const s2 = parts.join("");- Ang mga modernong JavaScript engine ay optimized na, kaya hindi mo na kailangang mag-alala tungkol sa performance kapag kaunti lang ang pinagdudugtong na string. Ngunit kung kinakailangan mong magdikit-dikit ng sampu-sampung libong beses, mas episyente ang paggamit ng
join.
Kapaki-pakinabang na Praktikal na Teknik: Padding, Trim, at Repeat
Ang trim, padStart, padEnd, at repeat ay mga maginhawang pamamaraan na lalong kapaki-pakinabang sa pang-araw-araw na pagproseso ng string. Madalas itong ginagamit sa mga praktikal na sitwasyon gaya ng pag-format ng mga input value o pag-standardize ng mga output format.
1console.log(" hello ".trim()); // "hello"
2console.log("5".padStart(3, "0")); // "005"
3console.log("x".repeat(5)); // "xxxxx"
- Maaaring gamitin ang mga pamamaraang ito para i-normalize ang form input o gumawa ng fixed-width na output.
Paghahambing ng String (Locale Comparison)
Epektibo ang localeCompare para sa paghahambing ng mga string ayon sa por-order ng diksyunaryo sa iba't ibang wika. Pwede mong tukuyin ang wika at mga sensitivity option (gaya ng case sensitivity).
1console.log(
2 "\u00E4".localeCompare("z", "de")
3); // may be -1 or other depending on locale
4
5console.log(
6 "a".localeCompare("A", undefined, { sensitivity: "base" })
7); // 0
- Para sa paghahambing na may internasyonal na suporta, gamitin ang
localeCompareat tukuyin ang tamang locale at mga opsyon.
Praktikal na Halimbawa: Pag-convert ng CSV Row sa Bagay (Praktikal na Workflow)
Karaniwan ang paggamit ng kombinasyon ng split, trim, at map para gawing object ang isang CSV row. Para sa quoted fields o masalimuot na CSV files, gumamit ng dedikadong CSV parser.
1// simple CSV parse (no quotes handling)
2function parseCsvLine(line, headers) {
3 const values = line.split(",").map(v => v.trim());
4 const obj = {};
5 headers.forEach((h, i) => obj[h] = values[i] ?? null);
6 return obj;
7}
8
9const headers = ["name", "age", "city"];
10const line = " Alice , 30 , New York ";
11console.log(parseCsvLine(line, headers));
12// { name: "Alice", age: "30", city: "New York" }
- Gumagana ang pamamaraang ito para sa simpleng CSV, ngunit hindi nito mahahawakan kapag ang kuwit ay nasa loob ng quoted na field.
Karaniwang Bitag o Pagkakamali
May ilang mga detalye at asal sa JavaScript string na madaling mabale-wala. Upang makaiwas sa hindi inaasahang bug, mahalaga na tandaan ang mga sumusunod na punto.
- Ang paggamit ng
new String()ay maaaring magdulot ng maling resulta sa type checking o paghahambing. Sa karamihan ng kaso, sapat na ang primitive na string types. - Sa Unicode, isang nakikitang karakter ay maaaring binubuo ng maraming code unit. Dahil dito, maaaring hindi tumugma ang halaga mula sa
lengthsa tunay na bilang ng nakikitang karakter. - Kapag isinama ang user input sa regular expression, siguraduhing i-escape muna ito.
- Ang
String.prototype.replace()ay pumapalit lamang sa unang match bilang default. Kung gusto mong palitan lahat ng paglitaw, gamitin ang/gflag sa iyong regular na ekspresyon. - Hindi nababago (immutable) ang mga string, kaya laging bumabalik ang operasyon ng bagong string. Mahalaga na laging italaga ang ibinalik na halaga.
Buod
Kahit mukhang simple ang mga string sa JavaScript, mahalaga pa ring maintindihan ang kanilang katangian tungkol sa Unicode at immutability. Sa pamamagitan ng pagsasanay sa mga batayan, mapapabuti mo nang malaki ang pagiging maaasahan at readability ng iyong string processing.
Maaari mong sundan ang artikulo sa itaas gamit ang Visual Studio Code sa aming YouTube channel. Paki-check din ang aming YouTube channel.