ในจาวาสคริปต์สตริงว่างเสมอเท็จเป็นบูลีนหรือไม่?


136

ในจาวาสคริปต์

var a = '';
var b = (a) ? true : false;

var bfalseจะถูกตั้งค่า

นี่เป็นพฤติกรรมที่กำหนดไว้ซึ่งสามารถพึ่งพาได้หรือไม่?


แน่ใจหรือว่าฉันมาถึงfalseที่นี่: jsfiddle.net/8CKbd
anubhava

ฉันก้าวไปอีกขั้น สตริงที่มีช่องว่างเป็นจริง ถ้า ('') {console.log ('!')} แต่ '' == 0 เป็นจริง
Azat

2
ฉันคิดว่ารุ่น @JonH ไม่ถูกต้องสตริงว่าง''จะถูกประเมินเป็นเท็จในบริบทบูลีนดังนั้นถ้าa = '';แล้วa ? false : true=> '' ? false : true=> false ? false : true=> true(เนื่องจากเป็นการประเมินค่าเท็จ) ฉันคิดว่ามันควรvar b = (a) ? true : false;จะถูกต้องกับคำสั่งต่อไป
PhoneixS

@PhoneixS แก้ไขหวังว่าตอนนี้จะมีความหมายมากกว่านี้
SwissCoder

1
@SwissCoder ไม่ใช่ว่าไม่สามารถอ่านได้ แต่จะให้คำตอบอื่น ตอนนี้ได้ทำการแก้ไขแล้ว
PhoneixS

คำตอบ:


198

ใช่. Javascript เป็นภาษาถิ่นของ ECMAScript และข้อกำหนดภาษา ECMAScript กำหนดลักษณะการทำงานนี้อย่างชัดเจน:

ToBoolean

ผลลัพธ์จะเป็นเท็จถ้าอาร์กิวเมนต์เป็นสตริงว่าง (ความยาวเป็นศูนย์) มิฉะนั้นผลลัพธ์จะเป็นจริง

อ้างจากhttp://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf


Aaaaand มันตัดสินแล้ว
Anthony

29
ข้อแม้อย่างหนึ่งคือนั่นnew String("")คือความจริง! เนื่องจากเป็นวัตถุในขณะที่รูปแบบสั้น""แสดงถึงเวอร์ชันค่าดั้งเดิม เดียวกันจะไปสำหรับและแม้กระทั่งnew Number(0) new Boolean(false)เป็นเหตุผลที่ดีที่จะไม่ใช้เวอร์ชันอ็อบเจ็กต์ในโค้ดของคุณและหมายความว่าif (str.length)จะจัดการกับเคส edge นี้ในขณะที่if (str)ไม่
Chris Middleton

54

ใช่. ทั้งหมดfalse, 0สตริงที่ว่างเปล่า''และ"", NaN, undefinedและnullจะมีการประเมินเสมอfalse; trueทุกอย่างอื่นเป็น

และในตัวอย่างของคุณ b คือfalseหลังการประเมิน (ฉันคิดว่าคุณเขียนผิดtrue)


2
nullไม่ได้falseไม่true, เป็นnull jsfiddle.net/sq1Lkpg0null
Bruno Finger

7
@ บรูโนคุณสามารถทำการทดสอบเดียวกันกับNaNและundefined. พวกเขาไม่ใช่falseแต่เป็นเท็จ ซึ่งเป็นสิ่งที่ถูกถาม
โจเซฟ

11

var a = '';
var b = (a) ? false : true;   // fixed!
console.log(b);               // => true

var จะถูกตั้งค่าbtrue

นี่เป็นพฤติกรรมที่กำหนดไว้ซึ่งสามารถพึ่งพาได้หรือไม่?

ในฐานะที่ตอบข้างต้นใช่ว่าเป็นพฤติกรรมที่กำหนดของสตริงที่ว่างเปล่าในเงื่อนไข (เป็นifแสดงออก||, &&, ? :, ... ) ( มาตรฐานระบุว่าต้องใช้การดำเนินการToBooleanภายใน)

การประเมินจะแตกต่างกันเมื่อใช้สตริงว่างในการเปรียบเทียบ (ดูความจริงความเท่าเทียมและ JavaScript ) แม้ว่าผลลัพธ์ส่วนใหญ่จะเหมือนกัน:

// conditional (note: evaluation to false prints false here!)
console.log('' ? true : false); // zero length     => false

// comparisons
console.log('' == true);        // +0 === 1        => false
console.log('' == false);       // +0 === +0       => true
console.log('' === true);       // different types => false
console.log('' === false);      // different types => false

คำอธิบาย: โดยพื้นฐานแล้วเมื่อตัวถูกดำเนินการ==มีประเภทที่แตกต่างกัน JavaScript จะพยายามอย่างเต็มที่ในการแปลงเป็น Numbers ตามค่าของมัน ( โดยใช้ การดำเนินการตามมาตรฐานการเรียกToNumberและToPrimitive ) จากนั้นจึงนำ===ไปใช้ภายใน แต่เมื่อคุณใช้โดยตรงประเภทจะไม่แปลงเพื่อเปรียบเทียบสตริงเพื่อบูลีนอยู่เสมอ===false

พูดโดยประมาณคือการทดสอบเงื่อนไข JavaScript ( ToBoolean ) สำหรับค่าที่กำหนดไว้ไม่ใช่ค่าว่างไม่ใช่ศูนย์ไม่ว่างเปล่าไม่ใช่เท็จ (สตริงว่างคือ ... ว่างเปล่าตัวเลข -0 หรือ +0 คือ ... ศูนย์น่านไม่ได้เป็นจำนวนที่กำหนดไว้ แต่วัตถุที่ว่างเปล่าก็ดูเหมือนจะไม่ได้จริงๆว่าง) หรือเป็นผมชอบที่จะคิดว่าเงื่อนไขสำหรับการทดสอบสิ่งที่ (จริง)ในขณะที่==เปรียบเทียบชัดเจนแปลงอย่างระมัดระวังค่า ( ToPrimitive , ToNumber ) ของ ตัวถูกดำเนินการของตนและ===มองหาเหมือนกันแน่นอน

if (X) {}        // is X a (true) thing?
if (X == Y) {}   // are the values of X and Y same-ish?
if (X === Y) {}  // are X and Y exactly the same?

มีตัวอย่างเพิ่มเติมในTruth, Equality และ JavaScriptซึ่งความแตกต่างนี้มีความสำคัญมากเช่น'0'อยู่trueในเงื่อนไข (ความยาวที่ไม่ใช่ศูนย์หรือเป็นสิ่งของ ) แต่falseในการ==เปรียบเทียบ ( ค่าเป็นศูนย์) '1'อีกครั้งtrueในทั้งสองกรณี (เป็นสิ่งของและมีค่าที่ไม่ใช่ศูนย์)

console.log('' ? true : false);   // zero length     => false
console.log('' == true);          // +0 === 1        => false
console.log('0' ? true : false);  // non-zero length => true
console.log('0' == true);         // +0 === 1        => false
console.log('1' ? true : false);  // non-zero length => true
console.log('1' == true);         //  1 === 1        => true


1
ตอนแรกฉันคิดว่า "pssh มันเกินความจริงนี่ตอบได้ดีแล้ว" แต่นั่นเป็นการนำเสนอที่ดีและให้ข้อมูล ขอบคุณ.
Marc L.

8

var b จะถูกตั้งค่าเป็น trueจะถูกตั้งค่าเนื่องจากสตริงว่างจะนับเป็นค่า 'เท็จ' ใน JavaScript เช่นเดียวกับค่าอื่น ๆ

โปรดดูที่http://www.sitepoint.com/javascript-truthy-falsy/สำหรับค่าที่เป็นเท็จ


คุณผิดในคำตอบของคุณ var bจะถูกตั้งค่าเป็นtrueเพราะมันตรงกันข้ามกับvar aถ้าคุณดูโค้ด
bombek

@bombek ขอบคุณ - ฉันจะพอใจ ดูเหมือนว่าคำถามเดิมได้รับการแก้ไขหลังจากคำตอบของฉัน (ค่าถูกสลับไปมา)
Jonathon Bolster

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