ในจาวาสคริปต์
var a = '';
var b = (a) ? true : false;
var b
false
จะถูกตั้งค่า
นี่เป็นพฤติกรรมที่กำหนดไว้ซึ่งสามารถพึ่งพาได้หรือไม่?
ในจาวาสคริปต์
var a = '';
var b = (a) ? true : false;
var b
false
จะถูกตั้งค่า
นี่เป็นพฤติกรรมที่กำหนดไว้ซึ่งสามารถพึ่งพาได้หรือไม่?
''
จะถูกประเมินเป็นเท็จในบริบทบูลีนดังนั้นถ้า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 จะถูกตั้งค่า
b
true
นี่เป็นพฤติกรรมที่กำหนดไว้ซึ่งสามารถพึ่งพาได้หรือไม่?
ในฐานะที่ตอบข้างต้นใช่ว่าเป็นพฤติกรรมที่กำหนดของสตริงที่ว่างเปล่าในเงื่อนไข (เป็น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