วิธีที่ถูกต้องในการตรวจสอบความเท่าเทียมกันระหว่าง Strings ใน JavaScript คืออะไร?
{} == "[object Object]"ค่าได้จริงเช่น
String().equals()ไม่ได้เป็นวิธีการใน JS แล้ว ...
วิธีที่ถูกต้องในการตรวจสอบความเท่าเทียมกันระหว่าง Strings ใน JavaScript คืออะไร?
{} == "[object Object]"ค่าได้จริงเช่น
String().equals()ไม่ได้เป็นวิธีการใน JS แล้ว ...
คำตอบ:
เสมอจนกว่าคุณจะเข้าใจความแตกต่างและความหมายของการใช้==และ===โอเปอเรเตอร์ให้ใช้===โอเปอเรเตอร์เพราะมันจะช่วยให้คุณประหยัดจากข้อผิดพลาด (ไม่ชัดเจน) และ WTF ตัวดำเนินการ "ปกติ"==สามารถมีผลลัพธ์ที่ไม่คาดคิดได้มากเนื่องจากการบังคับประเภทภายในเพื่อใช้===เป็นแนวทางที่แนะนำเสมอ
สำหรับข้อมูลเชิงลึกเกี่ยวกับเรื่องนี้และส่วนอื่น ๆ ของ "ดีกับไม่ดี" ของจาวาสคริปต์อ่านได้ที่ Mr. Douglas Crockford และงานของเขา มี Google Tech Talk ที่ยอดเยี่ยมที่เขาสรุปข้อมูลที่ดีมากมาย: http://www.youtube.com/watch?v=hQVTIJBZook
ปรับปรุง:
ซีรี่ส์The Don't Don't Know JSของ Kyle Simpson นั้นยอดเยี่ยม (และสามารถอ่านออนไลน์ได้ฟรี) ซีรีส์เข้าสู่ส่วนที่เข้าใจผิดโดยทั่วไปของภาษาและอธิบาย "ส่วนที่ไม่ดี" ที่ Crockford แนะนำให้คุณหลีกเลี่ยง โดยการทำความเข้าใจพวกเขาคุณสามารถใช้งานได้อย่างเหมาะสมและหลีกเลี่ยงหลุมพราง
หนังสือ " Up & Going " ประกอบด้วยหัวข้อเกี่ยวกับความเท่าเทียมโดยมีบทสรุปเฉพาะเรื่องเวลาที่จะใช้โอเปอเรเตอร์Loose ( ==) และเข้มงวด ( ===):
เพื่อต้มรายละเอียดมากมายให้เป็นเรื่องง่าย ๆ และช่วยให้คุณรู้ว่าจะใช้
==หรือ===ในสถานการณ์ต่าง ๆ นี่เป็นกฎง่าย ๆ ของฉัน:
- หากทั้งสองค่า (ด้าน aka) ในการเปรียบเทียบอาจจะเป็น
trueหรือfalseค่าหลีกเลี่ยงและการใช้งาน=====- หากค่าทั้งในการเปรียบเทียบอาจจะมีค่าเฉพาะเหล่านี้ (
0,""หรือ[]- อาร์เรย์ว่างเปล่า) หลีกเลี่ยงและการใช้งาน=====- ในทุกกรณีอื่น ๆ
==คุณปลอดภัยในการใช้งาน ไม่เพียง แต่จะปลอดภัยเท่านั้น แต่ในหลาย ๆ กรณีมันทำให้รหัสของคุณง่ายขึ้นในวิธีที่ช่วยเพิ่มความสามารถในการอ่าน
ฉันยังคงแนะนำการพูดคุยของ Crockford สำหรับนักพัฒนาที่ไม่ต้องการลงทุนเวลาเพื่อทำความเข้าใจกับ Javascript จริงๆ - เป็นคำแนะนำที่ดีสำหรับนักพัฒนาที่ทำงานใน Javascript ได้เป็นครั้งคราวเท่านั้น
if (typeof foo == "string")
===โอเปอเรเตอร์เสมอและไม่ต้องกังวลกับ "ฉันจริง ๆ ทั้งหมด 100% แน่นอนว่ามัน==จะทำงานเหมือนที่ฉันคิดว่ามันจะเป็นอย่างไร"
++/ --)
++หรือ--หรือif/elseคำสั่งบรรทัดเดียวหรือcontinueหรือnewผู้ประกอบการหรือจำนวนอื่น ๆ ของการปฏิบัติรหัสอย่างถูกต้องตามกฎหมายที่ Crockford ได้ถือว่า "เป็นอันตราย" และแน่นอนไม่เคยแม้แต่จะคิดเกี่ยวกับการใช้evalหรือwithแม้แต่ความผิดพลาดของพวกเขาเป็นที่เข้าใจกันดี และคุณเห็น JS รุ่นต่อไปหรือไม่ ไวยากรณ์ที่เข้มงวดขึ้นและฟังก์ชั่นผู้ช่วยเหลือจำนวนหนึ่งซึ่งบางส่วนได้รับการลอยมาหลายปีเป็นเรื่องที่เราได้รับมาตลอดเวลา ไวยากรณ์ยังไม่ได้รับการพัฒนาเลย หาก Crockford อยู่เบื้องหลังสิ่งนี้มันก็เป็นเรื่องเลวร้าย
หากคุณรู้ว่าพวกเขาเป็นสตริงแล้วไม่จำเป็นต้องตรวจสอบประเภท
"a" == "b"
อย่างไรก็ตามโปรดทราบว่าวัตถุสตริงจะไม่เท่ากัน
new String("a") == new String("a")
จะกลับเท็จ
เรียกใช้เมธอด valueOf () เพื่อแปลงเป็นแบบดั้งเดิมสำหรับวัตถุ String
new String("a").valueOf() == new String("a").valueOf()
จะกลับมาจริง
new String("a") == "a"เป็นจริง (แต่จะไม่อยู่ด้วย===) เพราะด้านซ้ายมือจะถูกแปลงเป็นค่าสตริงดั้งเดิม
new String("a") == new String("a"), new String("a") === new String("b"), new String("a") === new String("a")จะกลับมาทั้งหมดfalseตั้งแต่คุณจัดการกับการอ้างอิงไปยังวัตถุของชั้นไม่วิทยาการประเภทString string
new String(foo)สร้างวัตถุสตริงและString(foo) แปลง foo เป็นสายอักขระดั้งเดิม
นอกจากคำตอบเดียว: หากวิธีการทั้งหมดเหล่านี้ส่งคืนค่าเท็จแม้ว่าสตริงดูเหมือนว่าจะเท่ากันก็เป็นไปได้ว่ามีช่องว่างทางซ้ายและขวาของสตริงเดียว ดังนั้นให้ใส่.trim()ท้ายสตริงก่อนเปรียบเทียบ:
if(s1.trim() === s2.trim())
{
// your code
}
ฉันเสียเวลาหลายชั่วโมงในการหาว่ามีอะไรผิดปกติ หวังว่าสิ่งนี้จะช่วยให้ใครบางคน!
fetch) ขอบคุณมาก.
สิ่งที่ทำให้ฉันมีคำถามนี้คือpaddingและwhite-spaces
ตรวจสอบกรณีของฉัน
if (title === "LastName")
doSomething();
และชื่อเรื่องคือ " LastName"
ดังนั้นคุณอาจต้องใช้
trimฟังก์ชั่นเช่นนี้
var title = $(this).text().trim();
.toString().trim()ใน
นอกจากว่าคุณจะรู้ว่าการข่มขู่ทำงานอย่างไรคุณควรหลีกเลี่ยง==และใช้ตัวดำเนินการประจำ===ตัวแทน แต่คุณควรอ่านเพื่อทำความเข้าใจว่ามันทำงานอย่างไร
หากคุณใช้==คุณปล่อยให้ภาษาทำการบีบบังคับบางประเภทให้กับคุณตัวอย่างเช่น:
"1" == 1 // true
"0" == false // true
[] == false // true
ดังที่ Douglas Crockford พูดไว้ในหนังสือของเขา:
ควรใช้ตัวดำเนินการประจำตัวดีกว่าเสมอ
{}==" "ให้Unexpected token ==วิธีที่ถูกต้องในการทำกับฉัน
จริงๆแล้วมีสองวิธีที่สตริงสามารถสร้างเป็นจาวาสคริปต์
var str = 'Javascript'; สิ่งนี้จะสร้างค่าสตริงดั้งเดิม
var obj = new String('Javascript');Stringนี้จะสร้างวัตถุเสื้อคลุมประเภท
typeof str // string
typeof obj // object
ดังนั้นวิธีที่ดีที่สุดในการตรวจสอบความเท่าเทียมกันคือการใช้ตัว===ดำเนินการเพราะมันจะตรวจสอบค่าเช่นเดียวกับชนิดของตัวถูกดำเนินการทั้งสอง
หากคุณต้องการตรวจสอบความเท่าเทียมกันระหว่างวัตถุสองรายการการใช้String.prototype.valueOfเป็นวิธีที่ถูกต้อง
new String('javascript').valueOf() == new String('javascript').valueOf()
สตริงObjectsสามารถตรวจสอบได้โดยใช้JSON.stringyfy()เคล็ดลับ
var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);
พิจารณาว่าทั้งสองสายอาจมีขนาดใหญ่มากมี 2 วิธีหลักbitwise searchและlocaleCompare
ฉันแนะนำฟังก์ชั่นนี้อีกครั้ง
function compareLargeStrings(a,b){
if (a.length !== b.length) {
return false;
}
return a.localeCompare(b) === 0;
}
วิธีที่ง่ายที่สุดในการทำคือใช้ผู้ประกอบการที่ประกอบไปด้วย:
"was" == "was" ? true : false
แต่ถ้าสตริงที่คุณต้องการเปรียบเทียบอยู่ในอาร์เรย์คุณจะใช้ตัวกรอง es6
let stringArray = ["men", "boys", "girls", "sit", "can", "gotten"]
stringArray.filter(I=> I === boys ?
stringArray.pop(indexOf(I)) : null)
ด้านบนจะตรวจสอบ stringArray ของคุณและสตริงที่ตรงกับจากอาร์เรย์ซึ่งในกรณีของเราเราเลือก "เด็กชาย"
ฉันมากับโซลูชันทางเลือกระหว่างการทดสอบ คุณสามารถใช้ฟังก์ชันกับต้นแบบสตริง
String.prototype.betwenStr = function(one){
return JSON.stringify(new String(this)) === JSON.stringify(new String(one));
}
//call it
"hello world".betweenStr("hello world"); //returns boolean
//value
ทำงานได้ดีในเบราว์เซอร์ Chrome
==แล้ว