วิธีที่ถูกต้องในการตรวจสอบความเท่าเทียมกันระหว่าง 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
==
แล้ว