ฉันจะตรวจสอบว่า var เป็นสตริงใน JavaScript ได้อย่างไร?


182

ฉันจะตรวจสอบว่า var เป็นสตริงใน JavaScript ได้อย่างไร?

ฉันได้ลองแล้ว แต่มันไม่ทำงาน ...

var a_string = "Hello, I'm a string.";

if (a_string typeof 'string') {
    // this is a string
}

คำตอบ:


381

คุณสนิท:

if (typeof a_string === 'string') {
    // this is a string
}

ในบันทึกที่เกี่ยวข้อง: การตรวจสอบข้างต้นจะไม่ทำงานหากมีการสร้างสตริงด้วยnew String('hello')เนื่องจากจะเป็นประเภทObjectแทน มีวิธีแก้ไขปัญหาที่ซับซ้อนในการแก้ไขปัญหานี้ แต่ก็ควรหลีกเลี่ยงการสร้างสายอักขระแบบที่เคย


1
พวกฉันจะให้คำตอบที่ได้รับการยอมรับกับคุณทั้งคู่ แต่ฉันทำไม่ได้ทั้งหมดที่ฉันทำได้คือ +1 ทั้งคู่แทนที่จะให้คำตอบที่ยอมรับได้ว่าใครใกล้กับปัญหาเฉพาะของฉันมากกว่าที่ฉันไม่ อธิบายอย่างเต็มที่
vitto

สิ่งนี้ใช้ได้กับฉันif(typeof(str) === typeof(String()))
Scott Murphy

78

typeofผู้ประกอบการไม่ได้เป็นมัด (เพื่อ LHS ตัวอย่างของคุณไม่ให้ความรู้สึก)

คุณต้องใช้มันอย่างนั้น ...

if (typeof a_string == 'string') {
    // This is a string.
}

จำไว้ว่าtypeofเป็นผู้ประกอบการไม่ใช่ฟังก์ชั่น อย่างไรก็ตามเรื่องนี้คุณจะเห็นtypeof(var)การใช้งานจำนวนมากในป่า ทำให้รู้สึกเท่าvar a = 4 + (1)นี้

นอกจากนี้คุณอาจใช้==(ตัวดำเนินการเปรียบเทียบความเท่าเทียมกัน) เนื่องจากตัวถูกดำเนินการทั้งสองเป็นStrings ( ส่งกลับค่าtypeof เสมอString ) JavaScript ถูกกำหนดให้ทำตามขั้นตอนเดียวกันกับที่ฉันใช้===(ตัวดำเนินการเปรียบเทียบที่เข้มงวด)

ดังที่Box9 กล่าวถึงสิ่งนี้จะไม่ตรวจจับStringวัตถุที่สร้างอินสแตนซ์

คุณสามารถตรวจจับสิ่งนั้นได้ด้วย ...

var isString = str instanceof String;

jsFiddle

...หรือ...

var isString = str.constructor == String;

jsFiddle

แต่สิ่งนี้จะไม่ทำงานในwindowสภาพแวดล้อมที่หลากหลาย(คิดiframe)

คุณสามารถหลีกเลี่ยงสิ่งนี้ได้ด้วย ...

var isString = Object.prototype.toString.call(str) == '[object String]';

jsFiddle

แต่อีกครั้ง (ตามBox9 กล่าวถึง ) คุณจะดีกว่าเพียงแค่ใช้ตัวอักษรรูปแบบเช่นStringvar str = 'I am a string';

อ่านเพิ่มเติม


1
@ Box9 ไม่ต้องกังวลฉันจะต่อยอดอยู่ดี: P
alex

@alex ตอนนี้ฉันก็เหมือนกัน: o (อีก 10 นาที!)
David Tang

3
@RobG Rep capped คือเมื่อคุณได้รับตัวแทนสูงสุดเป็นระยะเวลา 24 ชั่วโมง หลังจากนั้นผู้โหวตจะไม่นับรวมชื่อเสียงของคุณ
alex

เป็นไปไม่ได้ที่จะตรวจสอบว่าตัวแปรเป็นสตริงโดยเพียงทดสอบว่ามีสมาชิกที่มีสตริงเท่านั้นหรือไม่ ตัวอย่างเช่น: if(myVar.toUpperCase) alert('I am a string');? ดูที่: jsfiddle.net/tb3t4nsx
ingredients_15939

1
@ ingredients_15939 มันไม่ได้เป็นวิธีที่ดีจริงๆ ... เพราะ{ toUpperCase: '' }
alex

14

การรวมคำตอบก่อนหน้านี้ให้โซลูชันเหล่านี้:

if (typeof str == 'string' || str instanceof String)

หรือ

Object.prototype.toString.call(str) == '[object String]'

4

นิพจน์ต่อไปนี้จะคืนค่าเป็นจริง :

'qwe'.constructor === String

นิพจน์ต่อไปนี้จะคืนค่าเป็นจริง :

typeof 'qwe' === 'string'

นิพจน์ต่อไปนี้จะคืนค่าเท็จ (sic!):

typeof new String('qwe') === 'string'

นิพจน์ต่อไปนี้จะคืนค่าเป็นจริง :

typeof new String('qwe').valueOf() === 'string'

วิธีที่ดีที่สุดและถูกต้อง ( imho ):

if (someVariable.constructor === String) {
   ...
}

1

วันนี้ฉันเชื่อว่าเป็นที่นิยมใช้รูปแบบฟังก์ชัน typeof () ดังนั้น ...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}

ไม่มีรูปแบบฟังก์ชั่นtypeofคุณเพียงแค่ควบคุมลำดับการปฏิบัติงานด้วยวงเล็บเหล่านั้น บางคนอาจพบว่าอ่านได้มากขึ้นในบางสถานการณ์
Jon z

@Jonz คุณหมายถึงอะไรโดย "การควบคุมลำดับการปฏิบัติงาน" ขอบคุณ
a20

ฉันคิดว่าในภายหลังฉันรู้ว่าคุณสามารถตรวจสอบนวกรรมิกและชอบมันในทางทฤษฎีที่ฉันคิดว่าจะเร็วกว่า แต่ก็ไม่เร็วกว่านี้ไหม ตัวอย่างหมายเลข 4 ที่นี่แสดงให้เห็นถึงการใช้งานวงเล็บพัฒนา developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...... มันสามารถอ่านได้ง่ายขึ้นและน้อยลงสำหรับการแยกวิเคราะห์คอมไพเลอร์ที่จะต้องพิจารณา ฉันเดาว่า 'ลำดับ' อาจเป็นปัญหาความเร็วหรือเกี่ยวข้องกับวิธีที่คอมไพเลอร์โหลดสแต็กอาร์กิวเมนต์ฉันไม่แน่ใจ
อาจารย์เจมส์

1
คำสั่งการดำเนินการ @ a20 อธิบายถึงลำดับการดำเนินการสำหรับคำสั่งที่มีการดำเนินการหลายอย่าง ดูdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...... - วงเล็บ (การจัดกลุ่มปฏิบัติการ) มีลำดับความสำคัญสูงสุดของผู้ให้บริการและจะถูกประเมินก่อน ในกรณีนี้วงเล็บจะล้อมรอบfilenameคำแถลงกลุ่มเดียวดังนั้นจึงไร้ประโยชน์และไม่เกี่ยวข้อง มันเป็นสิ่งที่ดีคำตอบนี้มีคะแนนเป็น 0 เพราะมันผิดทำให้เข้าใจผิดและไม่ช่วยเหลือ มันจะดีกว่าถ้ามีคะแนนเป็นลบ
Jon z

ขอบคุณมากสำหรับการเชื่อมโยงข้อมูล ดังนั้นจะต้องตรวจสอบและเรียกใช้วงเล็บก่อนหรือไม่ เพื่อที่จะทำงานทันทีโดยไม่ตรวจสอบวิธีการโทรอื่น ๆ aka โดยไม่ต้องวงเล็บซึ่งจะเป็นขั้นตอนในภายหลังและช้าลง? ไม่ได้หรือไม่ ฉันไม่เข้าใจเกี่ยวกับคอมไพเลอร์รันไทม์ที่นั่น
ปริญญาโท James

0

ตรวจสอบ null หรือ undefined ในทุกกรณี a_string

if (a_string && typeof a_string === 'string') {
    // this is a string and it is not null or undefined.
}

typeof nullและtypeof undefinedจะไม่กลับมา'string'ดังนั้นtypeof a_stringก็เพียงพอแล้ว ขออภัยสำหรับการทำลายล้าง
Ivan Frolov

-3

วิธีการส่วนตัวของฉันซึ่งดูเหมือนจะใช้ได้กับทุกกรณีคือการทดสอบว่ามีสมาชิกคนใดบ้างที่จะปรากฏต่อสายอักขระเท่านั้น

function isString(x) {
    return (typeof x == 'string' || typeof x == 'object' && x.toUpperCase && x.substr && x.charAt && x.trim && x.replace ? true : false);
}

ดู: http://jsfiddle.net/x75uy0o6/

ฉันต้องการทราบว่าวิธีการนี้มีข้อบกพร่องหรือไม่ แต่มันให้บริการฉันดีมาหลายปี


2
สิ่งนี้ถูกหลอกอย่างง่ายดายโดยวัตถุเก่า ๆ ที่มีวิธีการเหล่านั้น
alex

8
สิ่งนี้เรียกว่าการพิมพ์เป็ด - เช่นถ้ามันเดินเหมือนสตริงและมันพูดถึงเหมือนสตริงมันก็อาจจะเป็นสตริง คุณคลั่งไคล้เล็กน้อยถ้าคุณคิดว่านี่เป็นวิธีที่ดีที่สุดในการทดสอบสตริง แต่ Javascript เป็น Thunderdome คุณก็เป็นเช่นนั้น
Jon z
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.