ในจาวาสคริปต์
var a = '';
var b = (a) ? true : false;
var bfalseจะถูกตั้งค่า
นี่เป็นพฤติกรรมที่กำหนดไว้ซึ่งสามารถพึ่งพาได้หรือไม่?
ในจาวาสคริปต์
var a = '';
var b = (a) ? true : false;
var bfalseจะถูกตั้งค่า
นี่เป็นพฤติกรรมที่กำหนดไว้ซึ่งสามารถพึ่งพาได้หรือไม่?
''จะถูกประเมินเป็นเท็จในบริบทบูลีนดังนั้นถ้าa = '';แล้วa ? false : true=> '' ? false : true=> false ? false : true=> true(เนื่องจากเป็นการประเมินค่าเท็จ) ฉันคิดว่ามันควรvar b = (a) ? true : false;จะถูกต้องกับคำสั่งต่อไป
คำตอบ:
ใช่. Javascript เป็นภาษาถิ่นของ ECMAScript และข้อกำหนดภาษา ECMAScript กำหนดลักษณะการทำงานนี้อย่างชัดเจน:
ToBoolean
ผลลัพธ์จะเป็นเท็จถ้าอาร์กิวเมนต์เป็นสตริงว่าง (ความยาวเป็นศูนย์) มิฉะนั้นผลลัพธ์จะเป็นจริง
อ้างจากhttp://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
new String("")คือความจริง! เนื่องจากเป็นวัตถุในขณะที่รูปแบบสั้น""แสดงถึงเวอร์ชันค่าดั้งเดิม เดียวกันจะไปสำหรับและแม้กระทั่งnew Number(0) new Boolean(false)เป็นเหตุผลที่ดีที่จะไม่ใช้เวอร์ชันอ็อบเจ็กต์ในโค้ดของคุณและหมายความว่าif (str.length)จะจัดการกับเคส edge นี้ในขณะที่if (str)ไม่
ใช่. ทั้งหมดfalse, 0สตริงที่ว่างเปล่า''และ"", NaN, undefinedและnullจะมีการประเมินเสมอfalse; trueทุกอย่างอื่นเป็น
และในตัวอย่างของคุณ b คือfalseหลังการประเมิน (ฉันคิดว่าคุณเขียนผิดtrue)
NaNและundefined. พวกเขาไม่ใช่falseแต่เป็นเท็จ ซึ่งเป็นสิ่งที่ถูกถาม
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
var b จะถูกตั้งค่าเป็น trueจะถูกตั้งค่าเนื่องจากสตริงว่างจะนับเป็นค่า 'เท็จ' ใน JavaScript เช่นเดียวกับค่าอื่น ๆ
โปรดดูที่http://www.sitepoint.com/javascript-truthy-falsy/สำหรับค่าที่เป็นเท็จ
var bจะถูกตั้งค่าเป็นtrueเพราะมันตรงกันข้ามกับvar aถ้าคุณดูโค้ด
ตัวอย่างของนิพจน์ที่สามารถแปลงเป็นเท็จ ได้แก่ นิพจน์ที่ประเมินค่าเป็น null, 0, สตริงว่าง ("") หรือไม่ได้กำหนด (ดูข้อมูลอ้างอิง MDN )
falseที่นี่: jsfiddle.net/8CKbd