ฉันจะสร้างตัวอักษรตัวแรกของสตริงตัวพิมพ์ใหญ่ใน JavaScript ได้อย่างไร


3759

ฉันจะสร้างตัวอักษรตัวแรกของสตริงตัวพิมพ์ใหญ่ได้อย่างไร แต่จะไม่เปลี่ยนตัวพิมพ์ของตัวอักษรอื่น

ตัวอย่างเช่น:

  • "this is a test" -> "This is a test"
  • "the Eiffel Tower" -> "The Eiffel Tower"
  • "/index.html" -> "/index.html"

12
ขีดมีปลั๊กอินที่เรียกว่าunderscore.stringที่มีนี้และพวงของเครื่องมือที่ดีอื่น ๆ
แอรอน

สิ่งที่เกี่ยวกับ:return str.replace(/(\b\w)/gi,function(m){return m.toUpperCase();});
มูฮัมหมัดอูเมอร์

110
เรียบง่าย:string[0].toUpperCase() + string.substring(1)
dr.dimitru

6
`${s[0].toUpperCase()}${s.slice(1)}`
noego

([initial, ...rest]) => [initial.toUpperCase(), ...rest].join("")
КонстантинВан

คำตอบ:


5807

ทางออกพื้นฐานคือ:

function capitalizeFirstLetter(string) {
  return string.charAt(0).toUpperCase() + string.slice(1);
}

console.log(capitalizeFirstLetter('foo')); // Foo

บางคำตอบอื่น ๆ แก้ไขString.prototype(คำตอบนี้เคยเป็นเช่นกัน) แต่ฉันจะแนะนำในขณะนี้เนื่องจากการบำรุงรักษา (ยากที่จะหาที่ฟังก์ชันจะถูกเพิ่มในprototypeและอาจทำให้เกิดความขัดแย้งหากรหัสอื่นใช้ชื่อเดียวกัน / เบราว์เซอร์ เพิ่มฟังก์ชั่นพื้นเมืองที่มีชื่อเดียวกันในอนาคต)

... และจากนั้นมีคำถามมากมายเมื่อคุณพิจารณาความเป็นสากลเพราะนี่คือคำตอบที่ดีอย่างน่าอัศจรรย์ (ฝังอยู่ด้านล่าง) แสดงให้เห็น

หากคุณต้องการทำงานกับ Unicode code points แทนที่จะเป็น code units (ตัวอย่างเช่นเพื่อจัดการกับอักขระ Unicode นอก Basic Multilingual Plane) คุณสามารถใช้ประโยชน์จากข้อเท็จจริงที่ใช้String#[@iterator]งานได้กับ code points และคุณสามารถใช้toLocaleUpperCaseเพื่อให้ได้ตัวพิมพ์ใหญ่ที่ถูกต้อง:

function capitalizeFirstLetter([ first, ...rest ], locale = navigator.language) {
  return [ first.toLocaleUpperCase(locale), ...rest ].join('');
}

console.log(capitalizeFirstLetter('foo')); // Foo
console.log(capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉")); // "𐐎𐐲𐑌𐐼𐐲𐑉" (correct!)
console.log(capitalizeFirstLetter("italya", 'tr')); // İtalya" (correct in Turkish Latin!)

สำหรับตัวเลือกเป็นสากลมากยิ่งขึ้นโปรดดูคำตอบเดิมด้านล่าง


9
ซับ

6
เพื่อเพิ่มไปยัง karim79 - อาจจะเกินความสามารถในการทำหน้าที่เป็นจาวาสคริปต์จะทำสิ่งเดียวกันกับตัวแปรโดยไม่มีการตัดคำ ฉันคิดว่ามันจะมีความชัดเจนมากขึ้นโดยใช้ฟังก์ชั่น แต่พื้นเมืองของมันอย่างอื่นทำไมมันซับซ้อนด้วยฟังก์ชั่น wrapper?
Ross

18
เราไม่ควรที่จะลดจำนวนชิ้น (1)
hasen

177
ไม่มีเพราะ OP the Eiffel Tower -> The Eiffel Towerให้ตัวอย่างนี้ นอกจากนี้ฟังก์ชั่นที่เรียกว่าไม่capitaliseFirstLetter capitaliseFirstLetterAndLowerCaseAllTheOthers
บ้านจีโอเอ็นจิเนียริ่ง

22
ไม่มีใครสนใจกฎสำคัญของ OOP ใช่ไหม - ไม่เคยแก้ไขวัตถุที่คุณไม่ได้เป็นเจ้าของ? . BTW หนึ่งซับนี้ดูหรูหรากว่ามาก:string[0].toUpperCase() + string.substring(1)
dr.dimitru

1349

นี่คือวิธีการเชิงวัตถุเพิ่มเติม:

String.prototype.capitalize = function() {
    return this.charAt(0).toUpperCase() + this.slice(1);
}

คุณจะเรียกใช้ฟังก์ชันเช่นนี้:

"hello world".capitalize();

ด้วยผลลัพธ์ที่คาดว่าจะเป็น:

"Hello world" 

24
ฉันชอบวิธีนี้เพราะมันเหมือนทับทิมและทับทิมก็หวาน! :) ฉันพิมพ์ตัวพิมพ์เล็กทั้งหมดของสตริงเพื่อให้ทำงานเหมือนกับ Ruby:return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
ma11hew28

164
ในโลก post-Prototype.js นี้ไม่แนะนำให้เปลี่ยนหรือขยายวัตถุดั้งเดิม
Ryan

191
@rxgx - boogeyman "ไม่ขยาย" ตอนนี้เริ่มที่จะตาย (ขอบคุณพระเจ้า) และผู้คนกำลังดึงหัวของพวกเขาออกมาจาก jSand และตระหนักว่ามันเป็นเพียงคุณสมบัติทางภาษา เพียงเพราะ Prototype.js ที่ขยายวัตถุเองในช่วงเวลาสั้น ๆ ไม่ได้หมายความว่าการขยาย Natives นั้นไม่ดี คุณไม่ควรทำถ้าคุณกำลังเขียนรหัสสำหรับผู้บริโภคที่ไม่รู้จัก (เช่นสคริปต์การวิเคราะห์ที่เกิดขึ้นในไซต์สุ่ม) แต่นอกเหนือไปจากนั้นมันก็ใช้ได้
csuwldcat

43
@csuwldcat จะเกิดอะไรขึ้นถ้าห้องสมุดอื่นที่คุณใช้เพิ่มทุนของตัวเองโดยที่คุณไม่รู้ตัว? การขยายต้นแบบนั้นไม่ดีโดยไม่คำนึงว่า Prototype.js ทำเช่นนั้นหรือไม่ ด้วย ES6 อินทรินจะช่วยให้คุณมีเค้กและกินมันด้วย ฉันคิดว่าคุณอาจสับสนกับ "boogeyman" ที่กำลังจะตายสำหรับผู้ที่สร้าง shims ที่สอดคล้องกับข้อกำหนด ECMASCRIPT shims เหล่านี้ใช้ได้อย่างสมบูรณ์เพราะห้องสมุดอื่นที่เพิ่ม shim จะนำไปใช้ในทางเดียวกัน อย่างไรก็ตามควรหลีกเลี่ยงการเพิ่มอินทรินที่ไม่ใช่ข้อมูลจำเพาะของคุณเอง
Justin Meyer

43
การขยายชาวพื้นเมืองเป็นการปฏิบัติที่เลวร้ายมาก แม้ว่าคุณจะพูดว่า "โอ้ฉันจะไม่ใช้รหัสนี้กับสิ่งอื่นใด" คุณ (หรือคนอื่น) อาจจะเป็นเช่นนั้น จากนั้นพวกเขาจะใช้เวลาสามวันในการพยายามหาข้อผิดพลาดทางคณิตศาสตร์แปลก ๆ เพราะมีคนขยาย Number.money () เพื่อจัดการกับสกุลเงินที่แตกต่างจากห้องสมุดอื่นของคุณเล็กน้อย อย่างจริงจังฉันได้เห็นสิ่งนี้เกิดขึ้นใน บริษัท ขนาดใหญ่และมันก็ไม่คุ้มค่ากับเวลาที่ใครสักคนจะทำการดีบั๊กเพื่อหาไลบรารี่ที่ยุ่งเหยิงกับต้นแบบชาวพื้นเมือง
phreakhead

573

ใน CSS:

p:first-letter {
    text-transform:capitalize;
}

80
OP กำลังขอโซลูชัน JS
Antonio Max

129
. $ ( '# mystring_id') ข้อความ (สตริง) .css ( 'ข้อความเปลี่ยน' 'ประโยชน์');
DonMB

21
นอกจากนี้สิ่งนี้จะมีผลกับการแสดงของสตริงเท่านั้น - ไม่ใช่ค่าจริง หากอยู่ในรูปแบบเช่นค่าจะยังคงถูกส่งตาม -
dmansfield

12
คำตอบนี้ช่วยให้ฉันตระหนักว่าโซลูชัน CSS นั้นเหมาะสมกว่าสำหรับสิ่งที่ฉันทำ @dudewad: คำตอบอาจจะให้ข้อจำกัดความรับผิดชอบว่านี่ไม่ใช่โซลูชัน JS แต่อาจเหมาะสมกว่าขึ้นอยู่กับความต้องการ
joshden

58
สำหรับผู้ชมประมาณ 80% ที่มาถึงคำถามนี้นี่จะเป็นคำตอบที่ดีที่สุด ไม่ใช่คำตอบสำหรับคำถามแต่เป็นปัญหาแทน
Jivan

290

ต่อไปนี้เป็นคำตอบที่ได้รับความนิยมฉบับย่อที่ได้รับตัวอักษรตัวแรกโดยถือสตริงเป็นอาร์เรย์

function capitalize(s)
{
    return s[0].toUpperCase() + s.slice(1);
}

ปรับปรุง:

ตามความคิดเห็นด้านล่างนี้ไม่ทำงานใน IE 7 หรือด้านล่าง

อัปเดต 2:

หากต้องการหลีกเลี่ยงundefinedสตริงว่าง (ดูความคิดเห็นของ @ njzk2 ด้านล่าง ) คุณสามารถตรวจสอบสตริงว่างได้:

function capitalize(s)
{
    return s && s[0].toUpperCase() + s.slice(1);
}

23
สิ่งนี้จะไม่ทำงานใน IE <8 เนื่องจากเบราว์เซอร์เหล่านั้นไม่รองรับการจัดทำดัชนีสตริง IE8 รองรับตัวมันเอง แต่สำหรับตัวอักษรสตริงเท่านั้น - ไม่ใช่สำหรับวัตถุสตริง
Mathias Bynens

52
ใครสนใจตลาด IE7 น้อยกว่า 5%! และนั่นอาจเป็นเครื่องเก่าของ gremma และ grempa ของคุณ ฉันพูดสั้น ๆ รหัส FTW!
vsync

@MathiasBynens คุณรู้หรือไม่ว่าสิ่งนี้ส่งผลต่อเบราว์เซอร์ที่ไม่ใช่ IE รุ่นเก่าหรือเพียงแค่ IE7? หากไม่มีเบราว์เซอร์อื่นที่ได้รับผลกระทบจากการจัดทำดัชนีสตริงตัวอักษรในปี 2014 เราควรจะปรับ :)
hexalys

3
@vsync ฉันแค่หมายถึงว่าขึ้นอยู่กับข้อมูลประชากรของผู้ใช้ของคุณบางครั้ง (แม้ว่าจะขอบคุณน้อยลงไปเรื่อย ๆ เมื่อเราผ่านปี 2014 เป็นต้นไป) มันเป็นประโยชน์ในการรองรับเบราว์เซอร์เก่าเช่น IE7 ...
joshuahedlund

2
@ njzk2 เพื่อจัดการกับสตริงว่างคุณสามารถอัปเดตเป็น: return s && s[0].toUpperCase() + s.slice(1);
joelvh

188

หากคุณสนใจประสิทธิภาพของวิธีการต่าง ๆ ที่โพสต์:

ต่อไปนี้เป็นวิธีที่เร็วที่สุดตามการทดสอบ jsperf นี้ (เรียงลำดับจากเร็วที่สุดไปช้าที่สุด)

อย่างที่คุณเห็นวิธีการสองวิธีแรกนั้นเทียบเคียงได้กับประสิทธิภาพในขณะที่การเปลี่ยนแปลงString.prototypeนั้นช้าที่สุดในแง่ของประสิทธิภาพ

// 10,889,187 operations/sec
function capitalizeFirstLetter(string) {
    return string[0].toUpperCase() + string.slice(1);
}

// 10,875,535 operations/sec
function capitalizeFirstLetter(string) {
    return string.charAt(0).toUpperCase() + string.slice(1);
}

// 4,632,536 operations/sec
function capitalizeFirstLetter(string) {
    return string.replace(/^./, string[0].toUpperCase());
}

// 1,977,828 operations/sec
String.prototype.capitalizeFirstLetter = function() {
    return this.charAt(0).toUpperCase() + this.slice(1);
}

ป้อนคำอธิบายรูปภาพที่นี่


1
ดูเหมือนว่ารหัสการเริ่มต้นไม่ได้สร้างความแตกต่างอย่างใดอย่างหนึ่ง: jsperf.com/capitalize-first-letter-of-string/2
user420667

6
โปรดทราบว่าการแทนที่.slice(1)ด้วย.substr(1)จะช่วยเพิ่มประสิทธิภาพยิ่งขึ้น
Przemek

2
การพิจารณาที่เหมาะสม โปรดทราบว่าในหลาย ๆ กรณีประสิทธิภาพในการทำงานนั้นยังไม่สามารถสังเกตได้: แม้แต่วิธีที่ "ช้าที่สุด" ก็สามารถจัดการกับสตริง 19k ใน 10 มิลลิวินาที ดังนั้นเลือกใช้ที่สะดวกสบายที่สุดสำหรับคุณ
อ้างอิง Eddie

1
ในกรณีที่ใคร ๆ ก็อยากรู้อยากเห็น (เช่นฉัน) ว่าประสิทธิภาพการทำงานเพิ่มขึ้นในช่วงสี่ปีที่ผ่านมาอย่างไร ops / วินาทีของฟังก์ชั่นที่สามใน 2018 macbook pro อยู่ที่ 135,307,869 ดังนั้นเร็วกว่า 12.4 เท่า
สนามคาร์โล

151

สำหรับกรณีอื่นฉันต้องการใช้ตัวอักษรตัวแรกและพิมพ์เล็กที่เหลือ กรณีต่อไปนี้ทำให้ฉันเปลี่ยนฟังก์ชั่นนี้:

//es5
function capitalize(string) {
    return string.charAt(0).toUpperCase() + string.slice(1).toLowerCase();
}
capitalize("alfredo")  // => "Alfredo"
capitalize("Alejandro")// => "Alejandro
capitalize("ALBERTO")  // => "Alberto"
capitalize("ArMaNdO")  // => "Armando"

// es6 using destructuring 
const capitalize = ([first,...rest]) => first.toUpperCase() + rest.join('').toLowerCase();

1
"... แต่ไม่เปลี่ยนตัวอักษรตัวอื่น" นี่ไม่ใช่คำตอบที่ถูกต้องสำหรับคำถามที่ OP ถาม
Carlos Muñoz

2
@ CarlosMuñozถ้าคุณอ่านประโยคเปิดเขาบอกว่านี่เป็นกรณีอื่น
TMH

3
@ TomHart นั่นคือเหตุผลที่ว่าทำไมมันไม่ได้เป็นทางออกสำหรับคำถาม ควรเป็นความเห็นหรือคำถามและคำตอบอื่น ๆ
Carlos Muñoz

15
ฉันเห็นด้วยกับคุณ แต่ฉันเห็นผู้คนมากมายมาที่นี่เพื่อค้นหาสิ่งที่คำตอบนี้ทำ
TMH

74

นี่คือโซลูชั่น 201CM ECMAScript 6+ :

const str = 'the Eiffel Tower';
const newStr = `${str[0].toUpperCase()}${str.slice(1)}`;
console.log('Original String:', str); // the Eiffel Tower
console.log('New String:', newStr); // The Eiffel Tower


5
.slice()จะช้ากว่า.substring(), str[0]จะเป็นundefinedสำหรับสตริงที่ว่างเปล่าและการใช้ตัวอักษรแม่แบบที่จะเข้าร่วมเป็นสองส่วนแนะนำที่นี่ 8 ตัวอักษรในขณะที่+จะแนะนำเพียง 3
Przemek

4
จุดประสงค์ของคำตอบของฉันคือเพื่อแสดงคุณสมบัติใหม่ที่รองรับ ES6 โดยเฉพาะเทมเพลตตัวอักษรที่ไม่ได้กล่าวถึงในโพสต์อื่น แนวคิดของ StackOverflow คือการให้ "ตัวเลือก" แก่ผู้ค้นหา พวกเขาสามารถใช้แนวคิดของเทมเพลตตัวอักษรที่อธิบายไว้ในคำตอบนี้และรวมเข้ากับการปรับปรุงความเร็วไมโครเช่น Substring v. Slice หากแอปพลิเคชันของพวกเขาต้องการมิลลิวินาทีที่ประหยัดเป็นพิเศษเหล่านั้น คำตอบของฉันยังไม่รวมถึงการทดสอบหน่วยใด ๆ ซึ่งจะแสดงว่าคุณไม่ควรคัดลอกคำตอบ StackOverflow โดยตรง ฉันคิดว่าผู้พัฒนาจะนำคำตอบของฉันไปปรับใช้
Sterling Bourne

คุณไม่ได้อะไรจากการใช้เทมเพลตตัวอักษรที่นี่และ${}เพิ่มเสียงรบกวน const newStr = str[0].toUpperCase() + str.slice(1);อ่านง่ายกว่า
บอริส

1
ตกลงที่จะไม่เห็นด้วยกับสิ่งที่อ่านง่ายกว่า
สเตอร์ลิงบอร์น

67

หากคุณกำลังใช้ (หรือกำลังพิจารณาอยู่) lodashการแก้ปัญหานั้นง่าย:

_.upperFirst('fred');
// => 'Fred'

_.upperFirst('FRED');
// => 'FRED'

_.capitalize('fred') //=> 'Fred'

ดูเอกสารของพวกเขา: https://lodash.com/docs#capitalize

_.camelCase('Foo Bar'); //=> 'fooBar'

https://lodash.com/docs/4.15.0#camelCase

_.lowerFirst('Fred');
// => 'fred'

_.lowerFirst('FRED');
// => 'fRED'

_.snakeCase('Foo Bar');
// => 'foo_bar'

Vanilla js สำหรับตัวพิมพ์ใหญ่ตัวแรก:

function upperCaseFirst(str){
    return str.charAt(0).toUpperCase() + str.substring(1);
}

11
ฉันคิดว่าการตั้งค่าควรสำหรับวานิลลา Js เพราะคนส่วนใหญ่จะไม่ดาวน์โหลดกรอบทั้งหมดเพื่อใช้ประโยชน์จากสตริง
GGG

7
ในทุกโครงการของฉันจนถึงตอนนี้ฉันไม่เคยใช้ lodash อย่าลืมว่าคนส่วนใหญ่ใน google จะสิ้นสุดในหน้านี้และการระบุกรอบงานเป็นทางเลือกก็ใช้ได้ แต่ไม่ใช่คำตอบหลัก
GGG

2
เนื่องจากคำตอบอื่น ๆ ใช้ vanilla js มันดีที่มีคำตอบเช่นนี้เนื่องจากเราหลายคนใช้ lodash / ขีดล่าง
ลูโรมัน

1
นี่ไม่ใช่คำตอบที่ถูกต้องเนื่องจาก OP ขอให้ทำตอนนี้ใน Javascript ไม่ใช่ไลบรารี Javascript ซึ่งนำเข้าไลบรารีทั้งหมดเป็นการอ้างอิงไปยังโครงการของคุณ อย่าใช้มัน
dudewad

1
คำถามของ OP อยู่ในวานิลลาตอนท้ายของคำตอบของฉัน
chovy

62

ใช้อักษรตัวแรกของทุกคำในสตริงเป็นตัวพิมพ์ใหญ่:

function ucFirstAllWords( str )
{
    var pieces = str.split(" ");
    for ( var i = 0; i < pieces.length; i++ )
    {
        var j = pieces[i].charAt(0).toUpperCase();
        pieces[i] = j + pieces[i].substr(1);
    }
    return pieces.join(" ");
}

14
คำถามที่อ่านซ้ำ: ฉันต้องการใช้อักษรตัวแรกของสตริงให้เป็นตัวพิมพ์ใหญ่แต่ไม่ต้องเปลี่ยนตัวพิมพ์ของตัวอักษรอื่น
JimmyPena

2
ฉันรู้ว่าฉันทำ ฉันจะเพิ่มสิ่งหนึ่งในกรณีที่สตริงทั้งหมดเริ่มต้นเป็นตัวพิมพ์: pieces [i] = j + pieces [i] .ubstr (1) .toLowerCase ();
Malovich

4
อีกวิธีในกรณีนี้: function capitaliseFirstLetters (s) {return s.split ("") .map (function (w) {return w.charAt (0) .toUpperCase () + w.substr (1)}) เข้าร่วม ("")} อาจเป็นหนึ่งซับที่ดีถ้ามันไม่ได้ใส่ลงในฟังก์ชั่น
ลุคแชนส์

จะดีกว่าถ้าให้ตัวอักษรเล็กลงก่อนทั้งหมด
Magico

นอกเหนือจากฟังก์ชั่นนี้ที่ไม่ตอบคำถามแล้วมันยังซับซ้อนเกินไปอีกด้วย s => s.split(' ').map(x => x[0].toUpperCase() + x.slice(1)).join(' ')
OverCoder

48

เราสามารถรับตัวละครตัวแรกด้วยหนึ่งในตัวโปรดของฉันRegExpดูเหมือนว่าน่ารักยิ้ม:/^./

String.prototype.capitalize = function () {
  return this.replace(/^./, function (match) {
    return match.toUpperCase();
  });
};

และสำหรับคนชอบดื่มกาแฟทุกคน:

String::capitalize = ->
  @replace /^./, (match) ->
    match.toUpperCase()

... และสำหรับทุกคนที่คิดว่ามีวิธีที่ดีกว่าในการทำเช่นนี้โดยไม่ต้องขยายต้นแบบดั้งเดิม:

var capitalize = function (input) {
  return input.replace(/^./, function (match) {
    return match.toUpperCase();
  });
};

2
มีวิธีที่ดีกว่าในการทำเช่นนี้โดยไม่ต้องแก้ไขต้นแบบ String
Big McLargeHuge

2
@ davidkennedy85 แน่นอน! แต่นี่เป็นวิธีที่ง่ายไม่ใช่วิธีที่ดีที่สุด ... ;-)
yckart

ท่านที่รักมีคำตอบสำหรับคำถามนี้เป็นล้าน! วิธีแก้ปัญหาของคุณดูดีกว่าใน es6 'Answer'.replace(/^./, v => v.toLowerCase())
stwilz


45

ถ้าคุณใช้underscore.jsหรือLo-Dashที่underscore.stringห้องสมุดให้ส่วนขยายสตริงรวมทั้งการใช้ประโยชน์:

_.capitalize (สตริง) แปลงอักษรตัวแรกของสตริงเป็นตัวพิมพ์ใหญ่

ตัวอย่าง:

_.capitalize("foo bar") == "Foo bar"

3
ตั้งแต่เวอร์ชัน3.0.0 , Lo-Dash มีวิธีสตริงนี้โดยค่าเริ่มต้น _.capitalize("foo") === "Foo"เช่นเดียวกับที่อธิบายไว้ในคำตอบนี้:
bardzusny

นอกจากนี้ยังมีฟังก์ชั่นที่มีประโยชน์ underscore.js humanizeเรียกว่า มันแปลงสายอักขระที่ขีดเส้นใต้, camelized หรือ dasherized ให้เป็นแบบ humanized ลบจุดเริ่มต้นและจุดสิ้นสุดออกจากช่องว่างและลบ Postfix '_id'
Stepan Zakharov

1
จากเวอร์ชัน 4 * Lodash ยังเป็นตัวพิมพ์เล็ก () ทุกตัวอักษรอื่น ๆ ระวังด้วย!
Igor Loskutov

45
String.prototype.capitalize = function(allWords) {
   return (allWords) ? // if all words
      this.split(' ').map(word => word.capitalize()).join(' ') : //break down phrase to words then  recursive calls until capitalizing all words
      this.charAt(0).toUpperCase() + this.slice(1); // if allWords is undefined , capitalize only the first word , mean the first char of the whole string
}

แล้ว:

 "capitalize just the first word".capitalize(); ==> "Capitalize just the first word"
 "capitalize all words".capitalize(true); ==> "Capitalize All Words"

อัพเดท พ.ย. 2559 (ES6) เพียงเพื่อความสนุก:

const capitalize = (string = '') => [...string].map(    //convert to array with each item is a char of string by using spread operator (...)
    (char, index) => index ? char : char.toUpperCase()  // index true means not equal 0 , so (!index) is the first char which is capitalized by `toUpperCase()` method
 ).join('')                                             //return back to string

แล้วก็ capitalize("hello") // Hello


3
ฉันคิดว่านี่เป็นทางออกที่ไม่ดีด้วยเหตุผล 2 ประการ: การดัดแปลงต้นแบบของดั้งเดิมเป็นแนวคิดที่ไม่ดี หากข้อมูลจำเพาะเปลี่ยนไปและพวกเขาตัดสินใจเลือก 'พิมพ์ใหญ่' เป็นชื่อพร็อพเพอร์ตี้ใหม่คุณกำลังทำลายฟังก์ชั่นภาษาหลัก นอกจากนี้ชื่อเมธอดที่เลือกไม่ดี เมื่อมองแวบแรกฉันจะคิดว่านี่จะเป็นตัวพิมพ์ใหญ่ทั้งหมด การใช้ชื่อที่มีความหมายมากกว่าเช่น ucFirst ของ PHP หรือชื่ออื่นที่คล้ายกันอาจเป็นแนวคิดที่ดีกว่า
dudewad

คำตอบ ES6 อื่น ๆ const capitalize = ([first,...rest]) => first.toUpperCase() + rest.join('').toLowerCase();ที่เป็นที่เรียบง่าย:
Dan Dascalescu

44

สั้นที่สุด 3 โซลูชั่นที่ 1 และ 2 กรณีจับเมื่อsสตริง"", nullและundefined:

 s&&s[0].toUpperCase()+s.slice(1)        // 32 char

 s&&s.replace(/./,s[0].toUpperCase())    // 36 char - using regexp

'foo'.replace(/./,x=>x.toUpperCase())    // 31 char - direct on string, ES6


42

CSS เท่านั้น

p::first-letter {
  text-transform: uppercase;
}
  • แม้จะถูกเรียก::first-letterใช้มันจะใช้กับอักขระตัวแรกเช่นในกรณีของสตริง%aตัวเลือกนี้จะนำไปใช้กับ%และaจะไม่เป็นตัวพิมพ์ใหญ่
  • ใน IE9 + หรือ IE5.5 + ได้รับการสนับสนุนในรูปแบบดั้งเดิมที่มีเครื่องหมายโคลอนเดียวเท่านั้น ( :first-letter)

ES2015 หนึ่งซับ

เนื่องจากมีคำตอบมากมาย แต่ไม่มีใน ES2015 ที่จะแก้ปัญหาเดิมได้อย่างมีประสิทธิภาพฉันจึงคิดสิ่งต่อไปนี้:

const capitalizeFirstChar = str => str.charAt(0).toUpperCase() + str.substring(1);

หมายเหตุ

  • parameters => functionจึงเรียกว่าลูกศรฟังก์ชั่น
  • ฉันใช้ชื่อcapitalizeFirstCharแทนcapitalizeFirstLetterเพราะ OP ไม่ได้ขอรหัสที่ใช้อักษรตัวใหญ่ในสตริงทั้งหมด แต่เป็นอักขระตัวแรก (ถ้าเป็นตัวอักษรแน่นอน)
  • constทำให้เรามีความสามารถในการประกาศcapitalizeFirstCharเป็นค่าคงที่ซึ่งเป็นที่ต้องการตั้งแต่ในฐานะโปรแกรมเมอร์คุณควรระบุความตั้งใจของคุณไว้อย่างชัดเจนเสมอ
  • ในเกณฑ์มาตรฐานที่ฉันแสดงไม่มีความแตกต่างอย่างมีนัยสำคัญระหว่างstring.charAt(0)และstring[0]และอย่างไรก็ตามโปรดทราบว่าstring[0]จะเป็นundefinedสตริงว่างดังนั้นจึงควรเขียนใหม่string && string[0]ซึ่งเป็นวิธี verbose มากเกินไปเมื่อเทียบกับทางเลือก
  • string.substring(1)string.slice(1)จะเร็วกว่า

เกณฑ์มาตรฐาน

  • 4,956,962 ops / s ± 3.03% สำหรับโซลูชันนี้
  • 4,577,946 ops / s ± 1.2% สำหรับคำตอบที่ได้รับการโหวตมากที่สุด
  • สร้างด้วยJSBench.meบน Google Chrome 57

การเปรียบเทียบโซลูชั่น


@Green: ใช่คุณแน่ใจหรือไม่ว่าคุณได้ระบุตัวเลือกด้วยสองโคลอน
Przemek

1
คุณไม่ต้องการใช้เครื่องหมายบวก (+) เป็นวิธีการต่อข้อมูลใน ES6 คุณจะต้องใช้เทมเพลตตัวอักษร: eslint.org/docs/rules/prefer-template
Sterling Bourne

42

มีวิธีที่ง่ายมากที่จะใช้มันโดยเป็นแทน สำหรับ ECMAScript 6:

'foo'.replace(/^./, str => str.toUpperCase())

ผลลัพธ์:

'Foo'

1
คำตอบที่ดีที่สุดโดยไกลและคะแนนพิเศษสำหรับการแสดงไวยากรณ์แลมบ์ดาของ regex ฉันชอบอันนี้มากเพราะมันสามารถตัดและแปะได้ทุกที่
ลุย Hatler

การใช้/^[a-z]/iจะดีกว่าการใช้.เนื่องจากก่อนหน้านี้จะไม่พยายามแทนที่อักขระอื่นใดนอกจากตัวอักษร
Code Maniac

38

ดูเหมือนว่าจะง่ายขึ้นใน CSS:

<style type="text/css">
    p.capitalize {text-transform:capitalize;}
</style>
<p class="capitalize">This is some text.</p>

นี่คือจากคุณสมบัติการแปลงข้อความ CSS (ที่W3Schools )


28
@Simon มันไม่ได้ระบุว่าสตริงจะต้องถูกส่งออกเป็นส่วนหนึ่งของเอกสาร HTML - CSS เป็นเพียงการใช้งานถ้ามันเป็น
Adam Hepton

9
อดัมจริง แต่ฉันเดาว่ากว่า 95% ของ Javascript นั้นถูกใช้กับ HTML & CSS น่าเสียดายที่คำสั่ง "capitalize" ใช้ตัวพิมพ์ใหญ่ทุกคำดังนั้นคุณยังคงต้องการให้ JS ใช้อักษรตัวแรกของสตริงให้เป็นตัวพิมพ์ใหญ่เท่านั้น
Simon East

18
ไม่ถูกต้อง Dinesh เขาบอกว่าตัวอักษรตัวแรกของสตริง
Simon East

81
คำตอบนี้แม้จะมีจำนวน upvotes ที่ไร้สาระ แต่ก็ผิดเพราะมันจะใช้อักษรตัวแรกของทุกคำ @ Ryan คุณจะได้รับตราประทับวินัยหากคุณลบมัน กรุณาทำ.
Dan Dascalescu

10
เห็นด้วยกับ @DanDascalescu - คำตอบของไรอันผิดอย่างสิ้นเชิง
Timo


38

ฉันไม่เห็นคำตอบใด ๆ ในคำตอบที่มีอยู่ของประเด็นที่เกี่ยวข้องกับรหัสระนาบคล้ายดาวหรือการทำให้เป็นสากล “ ตัวพิมพ์ใหญ่” ไม่ได้หมายถึงสิ่งเดียวกันในทุกภาษาโดยใช้สคริปต์ที่กำหนด

ตอนแรกฉันไม่เห็นคำตอบใด ๆ เกี่ยวกับประเด็นที่เกี่ยวข้องกับรหัสระนาบคล้ายดาว มีอยู่หนึ่งอัน แต่มันก็ถูกฝังอยู่เล็กน้อย (เช่นนี้ฉันเดาได้!)


ฟังก์ชั่นที่เสนอส่วนใหญ่มีลักษณะดังนี้:

function capitalizeFirstLetter(str) {
  return str[0].toUpperCase() + str.slice(1);
}

อย่างไรก็ตามตัวละครบางตัวอยู่นอก BMP (ระนาบหลายภาษาพื้นฐานรหัสจุด U + 0 ถึง U + FFFF) ตัวอย่างเช่นใช้ข้อความ Deseret นี้:

capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉"); // "𐐶𐐲𐑌𐐼𐐲𐑉"

อักขระตัวแรกที่นี่ไม่สามารถใช้ประโยชน์ได้เนื่องจากคุณสมบัติการจัดทำดัชนีของสตริงไม่สามารถเข้าถึง“ ตัวอักษร” หรือจุดรหัส * พวกเขาเข้าถึงหน่วยรหัส UTF-16 สิ่งนี้เป็นจริงเช่นกันเมื่อมีการตัด - ค่าดัชนีชี้ไปที่หน่วยรหัส

มันเป็นไปได้ว่าหน่วยรหัส UTF-16 เป็น 1: 1 โดยมีรหัส USV อยู่ในสองช่วงคือ U + 0 ถึง U + D7FF และ U + E000 ถึง U + FFFF อักขระที่ใส่ซองส่วนใหญ่อยู่ในช่วงสองช่วงนั้น แต่ไม่ใช่ทั้งหมด

จาก ES2015 เป็นต้นไปการจัดการกับสิ่งนี้กลายเป็นเรื่องง่ายขึ้นเล็กน้อย String.prototype[@@iterator]ให้สตริงที่สอดคล้องกับจุดโค้ด ** ตัวอย่างเช่นเราสามารถทำสิ่งนี้:

function capitalizeFirstLetter([ first, ...rest ]) {
  return [ first.toUpperCase(), ...rest ].join('');
}

capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"

สำหรับสตริงที่ยาวกว่านี้อาจไม่ได้มีประสิทธิภาพมากนัก - เราไม่จำเป็นต้องย้ำส่วนที่เหลือ เราสามารถใช้String.prototype.codePointAtเพื่อรับจดหมายฉบับแรก (เป็นไปได้) แต่เรายังต้องพิจารณาว่าส่วนใดควรเริ่มต้น วิธีหนึ่งในการหลีกเลี่ยงการวนซ้ำส่วนที่เหลือคือการทดสอบว่า codepoint ตัวแรกอยู่นอก BMP หรือไม่ ถ้ามันไม่ใช่ชิ้นเริ่มต้นที่ 1 และถ้าเป็นชิ้นเริ่มต้นที่ 2

function capitalizeFirstLetter(str) {
  const firstCP = str.codePointAt(0);
  const index = firstCP > 0xFFFF ? 2 : 1;

  return String.fromCodePoint(firstCP).toUpperCase() + str.slice(index);
}

capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"

คุณสามารถใช้คณิตศาสตร์ระดับบิตแทนที่> 0xFFFFนั่นได้ แต่มันอาจจะง่ายกว่าที่จะเข้าใจวิธีนี้และอาจบรรลุสิ่งเดียวกัน

นอกจากนี้เรายังสามารถทำให้งานนี้ใน ES5 และด้านล่างโดยใช้ตรรกะนั้นอีกเล็กน้อยหากจำเป็น ไม่มีวิธีที่แท้จริงใน ES5 สำหรับการทำงานกับ codepoints ดังนั้นเราต้องทดสอบด้วยตนเองว่าหน่วยรหัสแรกเป็นตัวแทน ****:

function capitalizeFirstLetter(str) {
  var firstCodeUnit = str[0];

  if (firstCodeUnit < '\uD800' || firstCodeUnit > '\uDFFF') {
    return str[0].toUpperCase() + str.slice(1);
  }

  return str.slice(0, 2).toUpperCase() + str.slice(2);
}

capitalizeFirstLetter("𐐶𐐲𐑌𐐼𐐲𐑉") // "𐐎𐐲𐑌𐐼𐐲𐑉"

ในตอนแรกฉันยังกล่าวถึงข้อควรพิจารณาเกี่ยวกับความเป็นสากล บางส่วนของเหล่านี้เป็นเรื่องยากมากที่จะบัญชีสำหรับเพราะพวกเขาต้องใช้ความรู้ไม่เพียง แต่สิ่งที่ภาษาจะถูกใช้ แต่อาจต้องใช้ความรู้เฉพาะของคำในภาษา ตัวอย่างเช่น Digip ไอริช "mb" ใช้ตัวพิมพ์ใหญ่เป็น "mB" ในตอนต้นของคำ อีกตัวอย่างหนึ่งคือ Eszett เยอรมันไม่เคยเริ่มคำ (afaik) แต่ก็ยังช่วยอธิบายปัญหาได้ ตัวพิมพ์เล็ก eszett ("ß") ใช้อักษรตัวพิมพ์ใหญ่เป็น "SS" แต่ "SS" อาจเป็นตัวพิมพ์เล็กเป็น "ß" หรือ "ss" - คุณจำเป็นต้องมีความรู้ภาษาเยอรมันที่ถูกต้อง!

ตัวอย่างที่มีชื่อเสียงที่สุดของปัญหาประเภทนี้อาจเป็นภาษาตุรกี ในภาษาละตินตุรกีรูปแบบตัวพิมพ์ใหญ่ของ i คือİในขณะที่รูปแบบตัวพิมพ์เล็กของฉันคือı - มันเป็นตัวอักษรสองตัวที่แตกต่างกัน โชคดีที่เรามีวิธีการบัญชีสำหรับสิ่งนี้:

function capitalizeFirstLetter([ first, ...rest ], locale) {
  return [ first.toLocaleUpperCase(locale), ...rest ].join('');
}

capitalizeFirstLetter("italy", "en") // "Italy"
capitalizeFirstLetter("italya", "tr") // "İtalya"

ในเบราว์เซอร์แท็กภาษาที่ผู้ใช้ต้องการมากที่สุดจะถูกระบุด้วยnavigator.languageรายการตามลำดับที่ต้องการnavigator.languagesและภาษาขององค์ประกอบ DOM ที่กำหนดสามารถรับได้ (โดยปกติ) พร้อมด้วยObject(element.closest('[lang]')).lang || YOUR_DEFAULT_HEREเอกสารหลายภาษา

ในเอเจนต์ที่สนับสนุนคลาสอักขระคุณสมบัติ Unicode ใน RegExp ซึ่งเปิดตัวใน ES2018 เราสามารถล้างข้อมูลเพิ่มเติมได้โดยแสดงสิ่งที่ตัวละครที่เราสนใจโดยตรง:

function capitalizeFirstLetter(str, locale=navigator.language) {
  return str.replace(/^\p{CWU}/u, char => char.toLocaleUpperCase(locale));
}

สิ่งนี้อาจถูกปรับแต่งเล็กน้อยเพื่อจัดการกับการใช้อักษรตัวพิมพ์ใหญ่หลายคำในสตริงด้วยความแม่นยำที่ค่อนข้างดี กระบวนการCWUหรือการเปลี่ยนแปลงคุณสมบัติของตัวอักษรหรืออักขระ___enhen_Uppercasedตรงกับจุดรหัสทั้งหมดซึ่งก็เปลี่ยนเมื่อตัวพิมพ์ใหญ่ เราสามารถลองใช้ตัวอักษร digraph ที่มีหัวเรื่องเช่นภาษาดัตช์ij :

capitalizeFirstLetter('ijsselmeer'); // "IJsselmeer"

ในช่วงเวลาของการเขียน (ก.พ. 2020) Firefox / Spidermonkey ยังไม่ได้ใช้คุณสมบัติ RegExp ที่แนะนำในช่วงสองปีที่ผ่านมา ***** คุณสามารถตรวจสอบสถานะปัจจุบันของคุณลักษณะนี้ที่โต๊ะ compat Kangax บาเบลสามารถรวบรวมตัวอักษร RegExp ด้วยการอ้างอิงคุณสมบัติไปยังรูปแบบที่เทียบเท่าโดยไม่มีพวกเขา แต่โปรดทราบว่ารหัสผลลัพธ์อาจมีขนาดใหญ่มาก


ในทุกโอกาสคนที่ถามคำถามนี้จะไม่เกี่ยวข้องกับการใช้ตัวพิมพ์ใหญ่หรือการทำให้เป็นสากล แต่ก็เป็นเรื่องดีที่จะต้องตระหนักถึงปัญหาเหล่านี้เพราะมีโอกาสที่ดีที่คุณจะพบพวกเขาในที่สุดแม้ว่าพวกเขาจะไม่กังวล พวกเขาไม่ใช่กรณี "edge" หรือมากกว่านั้นไม่ใช่กรณีแบบ edge -definition - มีทั้งประเทศที่คนส่วนใหญ่พูดภาษาตุรกีอยู่แล้วและการทำให้หน่วยโค้ดกับ codepoints เป็นแหล่งของแมลงที่พบบ่อย (โดยเฉพาะกับ เกี่ยวกับอิโมจิ) ทั้งสตริงและภาษาค่อนข้างซับซ้อน!


* หน่วยรหัสของ UTF-16 / UCS2 นั้นก็เป็น Unicode code points ในแง่ที่ว่าเช่น U + D800 เป็นจุดรหัสทางเทคนิค แต่นั่นไม่ใช่สิ่งที่ "หมายถึง" ที่นี่ ... เรียงลำดับ ... แม้ว่ามันจะสวย เลือน สิ่งที่ตัวแทนจะไม่แน่นอนคือ USVs (ค่าสเกลาร์ Unicode)

** แม้ว่าหน่วยรหัสตัวแทนคือ“ กำพร้า” - กล่าวคือไม่ได้เป็นส่วนหนึ่งของคู่ตรรกะ - คุณยังสามารถรับตัวแทนที่นี่ได้เช่นกัน

*** อาจจะ. ฉันยังไม่ได้ทดสอบ หากคุณไม่ได้พิจารณาว่าการใช้อักษรตัวพิมพ์ใหญ่เป็นคอขวดที่มีความหมายฉันอาจจะไม่เหงื่อออก - เลือกสิ่งที่คุณเชื่อว่าชัดเจนที่สุดและอ่านได้

**** ฟังก์ชั่นดังกล่าวอาจต้องการทดสอบทั้งหน่วยแรกและหน่วยที่สองแทนที่จะเป็นหน่วยแรกเนื่องจากเป็นไปได้ว่าหน่วยแรกเป็นตัวแทนกำพร้า ตัวอย่างเช่นอินพุต "\ uD800x" จะใช้ประโยชน์ X ตามที่เป็นอยู่ซึ่งอาจเป็นหรือไม่คาดหวังก็ได้

***** นี่คือปัญหา Bugzillaหากคุณต้องการติดตามความคืบหน้ามากขึ้นโดยตรง


2
คำตอบนี้ต้องย้ายไปไว้ข้างหน้า
Rúnar Berg

ขอบคุณ @ RúnarBerg - เนื่องจากความคิดเห็นของคุณทำให้ฉันนึกถึงเรื่องนี้ฉันอ่านมันอีกครั้งและตระหนักว่าฉันได้ทำเรื่องสุดท้ายและวิธีแก้ปัญหาที่ควรพูดถึง ยังพยายามอธิบายคำศัพท์บางคำให้ดีขึ้น
Semicolon

คำตอบที่ดี .....
เบ็นแอสตัน

คำตอบนี้ยอดเยี่ยมฉันหวังว่าฉันจะโหวตได้มากกว่านี้
David Barker

37

จะดีกว่าเสมอในการจัดการสิ่งต่าง ๆ เหล่านี้โดยใช้ CSS ก่อนโดยทั่วไปถ้าคุณสามารถแก้ปัญหาโดยใช้ CSS ให้ไปก่อนแล้วลอง JavaScript เพื่อแก้ปัญหาของคุณดังนั้นในกรณีนี้ลองใช้:first-letterใน CSS และใช้text-transform:capitalize;

ดังนั้นลองสร้างคลาสสำหรับสิ่งนั้นเพื่อให้คุณสามารถใช้ได้ทั่วโลกเช่น: .first-letter-uppercaseและเพิ่มสิ่งที่ต้องการด้านล่างใน CSS ของคุณ:

.first-letter-uppercase:first-letter {
    text-transform:capitalize;
}

ตัวเลือกอื่นคือ JavaScript ดังนั้นสิ่งที่ดีที่สุดจะเป็นดังนี้:

function capitalizeTxt(txt) {
  return txt.charAt(0).toUpperCase() + txt.slice(1); //or if you want lowercase the rest txt.slice(1).toLowerCase();
}

และเรียกว่าชอบ:

capitalizeTxt('this is a test'); // return 'This is a test'
capitalizeTxt('the Eiffel Tower'); // return 'The Eiffel Tower'
capitalizeTxt('/index.html');  // return '/index.html'
capitalizeTxt('alireza');  // return 'Alireza'

หากคุณต้องการนำมาใช้ซ้ำแล้วซ้ำอีกมันจะดีกว่าแนบไปกับสตริงพื้นเมือง javascript ดังนั้นสิ่งที่ชอบด้านล่าง:

String.prototype.capitalizeTxt = String.prototype.capitalizeTxt || function() {
    return this.charAt(0).toUpperCase() + this.slice(1);
}

และเรียกมันว่าด้านล่าง:

'this is a test'.capitalizeTxt(); // return 'This is a test'
'the Eiffel Tower'.capitalizeTxt(); // return 'The Eiffel Tower'
'/index.html'.capitalizeTxt();  // return '/index.html'
'alireza'.capitalizeTxt();  // return 'Alireza'

36

หากคุณต้องการฟอร์แมตข้อความตัวพิมพ์ใหญ่ทั้งหมดคุณอาจต้องการแก้ไขตัวอย่างอื่น ๆ เช่น:

function capitalize (text) {
    return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();
}

สิ่งนี้จะทำให้แน่ใจได้ว่าข้อความต่อไปนี้จะเปลี่ยนไป:

TEST => Test
This Is A TeST => This is a test

น่าจะเป็นที่น่าสังเกตว่าสิ่งนี้จะแปลงสิ่งต่าง ๆ เช่นตัวย่อเป็นตัวพิมพ์เล็กดังนั้นอาจไม่ใช่ความคิดที่ดีที่สุดในกรณีส่วนใหญ่
monokrome

นอกจากนี้ยังไม่ GAMITG จริงๆทำให้การแก้ไขเพียงเพื่อเอาชิ้นส่วนของช่องว่างจากส่วนที่ไม่ใช่รหัสการโพสต์หรือไม่ O_O
ขาวดำ

BTW นี้จะทำลายคำย่อตัวพิมพ์ใหญ่ดังนั้นโปรดระวัง y'all <3
monokrome

34
function capitalize(s) {
    // returns the first letter capitalized + the string from index 1 and out aka. the rest of the string
    return s[0].toUpperCase() + s.substr(1);
}


// examples
capitalize('this is a test');
=> 'This is a test'

capitalize('the Eiffel Tower');
=> 'The Eiffel Tower'

capitalize('/index.html');
=> '/index.html'

เสร็จสิ้น @Ram รวมถึงตัวอย่าง
Fredrik A.

สิ่งนี้ดีกว่าคำตอบของปี 2009หรือไม่
Dan Dascalescu

1
มันไม่ใช่ @DanDascalescu ฉันคิดว่าคุณสามารถยืนยันได้ว่าsubstr/ substringเป็นความหมายมากกว่าเมื่อเทียบกับsliceแต่นั่นเป็นเพียงเรื่องของการตั้งค่า อย่างไรก็ตามฉันได้รวมตัวอย่างกับสตริงที่ให้ไว้ในคำถามซึ่งเป็นสิ่งที่ดีที่ไม่มีในตัวอย่าง '09 ฉันคิดอย่างสุจริตว่ามันจะลดลงถึงอายุ 15 ปีฉันอยากได้กรรมใน StackOverflow;)
Fredrik A.

34

นี่คือฟังก์ชั่นที่เรียกว่าucfirst () (สั้นสำหรับ "ตัวพิมพ์ใหญ่ตัวอักษรตัวแรก"):

function ucfirst(str) {
    var firstLetter = str.substr(0, 1);
    return firstLetter.toUpperCase() + str.substr(1);
}

คุณสามารถใช้อักษรตัวพิมพ์ใหญ่สตริงโดยการเรียกucfirst ("some string") - ตัวอย่างเช่น

ucfirst("this is a test") --> "This is a test"

มันทำงานโดยแยกสตริงออกเป็นสองชิ้น ในบรรทัดแรกมันจะดึงfirstLetterจากนั้นในบรรทัดที่สองมันจะพิมพ์ใหญ่firstLetterโดยเรียกfirstLetter.toUpperCase ()และรวมกับส่วนที่เหลือของสตริงซึ่งพบได้โดยการเรียกstr.substr (1)(1)

คุณอาจคิดว่าสิ่งนี้จะล้มเหลวสำหรับสตริงว่างและแน่นอนในภาษาเช่น C คุณจะต้องตอบสนองต่อสิ่งนี้ อย่างไรก็ตามใน JavaScript เมื่อคุณใช้สตริงย่อยของสตริงว่างคุณจะได้รับสตริงว่างกลับมา


4
ใช้ String.substring () หรือ String.slice () ... อย่าใช้ substr () - มันเลิกใช้แล้ว
James

7
@ 999: มันบอกว่าsubstr()เลิกที่ไหน? ถึงแม้ว่าในอีกสามปีต่อมาก็จะไม่พูดซ้ำอีกในปี 2009 เมื่อคุณแสดงความคิดเห็น
Dan Dascalescu

substr()อาจไม่ได้รับการระบุว่าเลิกใช้งานโดยการใช้งาน ECMAScript ยอดนิยมใด ๆ (ฉันสงสัยว่ามันจะไม่หายไปทุกเวลาเร็ว ๆ นี้) แต่ไม่ได้เป็นส่วนหนึ่งของข้อมูลจำเพาะ ECMAScript ฉบับที่ 3 ของสเป็คระบุไว้ในภาคผนวกที่ไม่ใช่กฎเกณฑ์เพื่อ "แนะนำความหมายที่เหมือนกันสำหรับคุณสมบัติดังกล่าวโดยไม่ทำให้คุณสมบัติหรือความหมายของพวกเขาเป็นส่วนหนึ่งของมาตรฐานนี้"
Peter Rust

2
มี 3 วิธีการที่จะทำสิ่งเดียวกัน ( substring, substrและslice) เป็นมากเกินไป IMO ฉันมักจะใช้sliceเพราะมันรองรับดัชนีเชิงลบมันไม่มีพฤติกรรมอาร์ค - การแลกเปลี่ยนที่สับสนและ API นั้นคล้ายกับsliceในภาษาอื่น
Peter Rust

29
String.prototype.capitalize = function(){
    return this.replace( /(^|\s)([a-z])/g , function(m,p1,p2){ return p1+p2.toUpperCase();
    } );
};

การใช้งาน:

capitalizedString = someString.capitalize();

นี่คือสตริงข้อความ => นี่คือสตริงข้อความ


20
นิพจน์ทั่วไปเกินความจริงสำหรับสิ่งนี้
Anthony Sottile

+1 นี่คือสิ่งที่ฉันกำลังมองหา มีข้อผิดพลาดเล็ก ๆ น้อย ๆ คือว่ามันควรจะเป็นreturn.this.toLocaleLowerCase().replace(...
tomdemuyt

+1 ฉันพบหน้านี้เพื่อค้นหา phps ucfirst รุ่น javascript ซึ่งฉันสงสัยว่าเป็นวิธีที่คนส่วนใหญ่พบ
Benubird

@DanDascalescu ฉันพบว่ามีประโยชน์นี้ดังนั้นประโยชน์นิยม +1 และ -1-anal retentiveness เขารวมตัวอย่างดังนั้นหน้าที่ของมันจึงชัดเจน
Travis Webb

String.prototype.capitalize = function(){ return this.replace( /(^|\s)[a-z]/g , function(m){ return m.toUpperCase(); }); }; ฉัน refactor รหัสของคุณเล็กน้อยคุณต้องการเพียงนัดแรก
IGRACH


21

ชำระเงินโซลูชันนี้:

var stringVal = 'master';
stringVal.replace(/^./, stringVal[0].toUpperCase()); // returns Master 

3
นี่ควรเป็นคำตอบที่ยอมรับได้ โซลูชันหลักไม่ควรใช้เฟรมเวิร์กเช่นขีดล่าง
Adam McArthur

3
บันทึกการกดแป้นบางอย่าง;)stringVal.replace(/^./, stringVal[0].toUpperCase());
Alfredo Delgado

1
ไม่ควรใช้ Regex หากไม่จำเป็น มันไม่มีประสิทธิภาพอย่างมากและมันก็ไม่ได้ทำให้รหัสสั้นกระชับขึ้นเช่นกัน ยิ่งกว่านั้นstringVal[0]จะundefinedว่างเปล่าstringValและความพยายามในการเข้าถึงคุณสมบัติดังกล่าว.toUpperCase()จะทำให้เกิดข้อผิดพลาด
Przemek

20
yourString.replace(/^[a-z]/, function(m){ return m.toUpperCase() });

(คุณอาจแค็ปซูลในฟังก์ชั่นหรือเพิ่มลงในต้นแบบเครื่องสายถ้าคุณใช้บ่อย)


5
แม้ว่านี่จะมีคะแนนโหวตบ้าง แต่นี่เป็นวิธีที่ช้าที่สุดที่โพสต์ไว้ที่นี่ ฉันได้รวบรวมการทดสอบเล็กน้อยกับคำตอบที่ได้รับความนิยมมากที่สุดจากโพสต์นี้ที่นี่: forwebonly.com/…
Robin van Baalen

@RobinvanBaalen ลิงก์ของคุณเสียแล้ว มีการอัปเดตหรือไม่
แบรด

1
Regexp เกินความเป็นจริงสำหรับสิ่งนี้เลือกที่ง่ายกว่า: str.charAt (0) .toUpperCase () + str.slice (1)
Simon

@Brad ขออภัยไม่ใช่
Robin van Baalen

บ่อยครั้งหากคุณต้องการแก้ปัญหาด้วย regex คุณจะพบกับปัญหาสองข้อ
Przemek

19

ucfirstฟังก์ชั่นการทำงานถ้าคุณทำเช่นนี้

function ucfirst(str) {
    var firstLetter = str.slice(0,1);
    return firstLetter.toUpperCase() + str.substring(1);
}

ขอบคุณ JP สำหรับการประกาศ


2
ชื่อที่ดีสำหรับฟังก์ชั่น! มันเป็นชื่อที่เทียบเท่ากับ PHP จริงๆแล้วมีฟังก์ชั่น PHP ทั้งหมดที่เขียนใน JS; มันเรียกว่า PHP.js และสามารถพบได้ในhttp://phpjs.org
Hussam

11
สายการบินหนึ่ง:string[0].toUpperCase() + string.substring(1)
dr.dimitru

@TarranJones ที่นี่เป็นกระสุนหนึ่งซับ:(string[0] || '').toUpperCase() + string.substring(1)
dr.dimitru

@ dr.dimitru: แทนที่จะสำนวนคุณสามารถเพียงแค่(string[0] || '') string.charAt(0)
Przemek

18

คุณสามารถทำได้ในหนึ่งบรรทัดเช่นนี้

string[0].toUpperCase() + string.substring(1)

คำตอบนี้ได้รับแล้วในปี 2009
Dan Dascalescu

17
yourString.replace(/\w/, c => c.toUpperCase())

ฉันพบฟังก์ชันลูกศรนี้ง่ายที่สุด แทนที่ตรงกับตัวอักษรตัวแรก ( \w) ของสตริงของคุณและแปลงเป็นตัวพิมพ์ใหญ่ ไม่จำเป็นต้องเป็นนักเล่น


1
นี่ควรเป็นคำตอบที่ยอมรับได้ แต่เกือบจะเป็นคำถามสุดท้ายเพราะ SO ยังคงตัดสินคำถามที่ล้าสมัยอยู่ Btw การใช้ดีกว่า/./ด้วยเหตุผลสองประการ: /\w/จะข้ามอักขระตัวอักษรไม่ใช่ตัวอักษรก่อนหน้าทั้งหมด (ดังนั้น @@ abc จะกลายเป็น @@ Abc) แล้วมันจะไม่ทำงานกับอักขระที่ไม่ใช่ละติน
Cristian Traìna
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.