ජාවාස්ක්‍රිප්ට් හි නූල් සමානාත්මතාවය පරීක්ෂා කිරීමට නිවැරදි ක්‍රමය කුමක්ද?


873

ජාවාස්ක්‍රිප්ට් හි නූල් අතර සමානාත්මතාවය පරීක්ෂා කිරීමට නිවැරදි ක්‍රමය කුමක්ද?


4
== භාවිතා නොකිරීමට හේතුවක් තිබේද?
කෙන්ඩ්‍රික්

23
End කෙන්ඩ්‍රික් - විශ්වාසයි. එය ටයිප්-බලහත්කාරක ක්‍රමය ඇදහිය නොහැකි තරම් නොදැනුවත්ව කළ හැකි අතර දෝෂ නොසලකා හැරීමට පහසුය (එය නිවැරදිව පෙනේ , නමුත් ඉතා වැරදියි)
STW

22
End කෙන්ඩ්‍රික් - {} == "[object Object]"උදාහරණයක් ලෙස සත්‍යය තක්සේරු කරයි.
චෙතන් එස්

15
String().equals()ජේඑස් හි ක්‍රමයක් නොවන තරමක් කරදරකාරී ...
ඇලෙක්සැන්ඩර් මිල්ස්

2
Lex ඇලෙක්සැන්ඩර්මිල්ස් ඇයි?
රයි-

Answers:


651

සැමවිටම ඔබ==සහ===ක්‍රියාකරුවන්භාවිතා කිරීමේ වෙනස්කම් සහ ඇඟවුම් සම්පූර්ණයෙන් තේරුම් ගන්නා තෙක්, ක්‍රියාකරු භාවිතා කරන්න,===එය අපැහැදිලි (පැහැදිලි නොවන) දෝෂ සහ WTF වලින් ඔබව ගලවා ගනු ඇත. ==අභ්‍යන්තරව ටයිප්-බලහත්කාරය හේතුවෙන්"නිත්‍ය"ක්‍රියාකරුට ඉතා අනපේක්ෂිත ප්‍රති results ල ලබා ගත හැකිය, එබැවින් භාවිතා===කිරීම සැමවිටම නිර්දේශිත ප්‍රවේශය වේ.

මේ පිළිබඳ අවබෝධය සඳහා සහ ජාවාස්ක්‍රිප්ට් හි අනෙකුත් "හොඳ එදිරිව නරක" කොටස් ඩග්ලස් ක්‍රොක්ෆර්ඩ් මහතා සහ ඔහුගේ කෘති පිළිබඳව කියවනු ලැබේ. ඔහු හොඳ තොරතුරු රාශියක් සාරාංශ කරන විශිෂ්ට ගූගල් තාක්ෂණික කතාවක් තිබේ: http://www.youtube.com/watch?v=hQVTIJBZook


යාවත්කාලීන කිරීම:

මෙම ඔබ එපා දැන හඳුනා JS කයිල් සිම්ප්සන් විසින් මාලාවක් විශිෂ්ට (හා සමඟ අමුත්තන් කියවීමට නිදහස්) වේ. මෙම කතා මාලාව භාෂාවේ පොදුවේ වරදවා වටහාගෙන ඇති ප්‍රදේශවලට ගොස් ක්‍රොක්ෆර්ඩ් ඔබට මඟ හැරීමට යෝජනා කරන “නරක කොටස්” පැහැදිලි කරයි. ඒවා තේරුම් ගැනීමෙන් ඔබට ඒවා නිසි ලෙස භාවිතා කළ හැකි අතර අන්තරායන් වළක්වා ගත හැකිය.

" ඉහළට සහ ඉදිරියට යාම " පොතේ සමානාත්මතාවය පිළිබඳ කොටසක් ඇතුළත් වන අතර , ලිහිල් ( ==) එදිරිව දැඩි ( ===) ක්‍රියාකරුවන් භාවිතා කළ යුත්තේ කවදාද යන්න පිළිබඳ මෙම නිශ්චිත සාරාංශය සමඟ :

සරල තොරතුරු කිහිපයක් සඳහා සම්පූර්ණ තොරතුරු තම්බා ගැනීමට සහ භාවිතා කිරීමට ==හෝ ===විවිධ අවස්ථාවන්හිදී ඔබට දැන ගැනීමට උදව් කිරීමට , මෙන්න මගේ සරල නීති:

  • සංසන්දනයක දී අගය (අකා පැත්ත) trueහෝ falseඅගය විය හැකි නම් , වළක්වා ==භාවිතා කරන්න ===.
  • සංසන්දනය එක්කෝ අගය මෙම නිශ්චිත අගයන් (විය හැකි නම් 0, ""හෝ [], වැලැක්විමට - හිස් අරා) ==හා භාවිතය ===.
  • දී සියලු අවස්ථාවල දී, ඔයා තමයි භාවිතා කිරීමට ආරක්ෂිත ==. එය ආරක්ෂිත පමණක් නොව, බොහෝ අවස්ථාවලදී එය කියවීමේ හැකියාව වැඩි දියුණු කරන ආකාරයෙන් ඔබේ කේතය සරල කරයි.

ජාවාස්ක්‍රිප්ට් සැබවින්ම වටහා ගැනීම සඳහා කාලය ආයෝජනය කිරීමට අකමැති සංවර්ධකයින් සඳහා ක්‍රොක්ෆෝර්ඩ්ගේ කතාව මම තවමත් නිර්දේශ කරමි J ඉඳහිට ජාවාස්ක්‍රිප්ට් හි පමණක් වැඩ කරන සංවර්ධකයෙකුට එය හොඳ උපදේශයකි.


8
ඔපෙරන්ඩ් දෙකම නූල් බව ඔබට විශ්වාස නම් එය අවශ්‍ය නොවේ, උදා: භාවිතා කරන විටif (typeof foo == "string")
මාර්සල් කෝර්පල්

29
Ar මාර්සල් - ඔබ නිවැරදියි, නමුත් සෑම විටම=== ක්‍රියාකරු භාවිතා කිරීම වඩා හොඳ වන අතර "මම ඇත්ත වශයෙන්ම, මුළුමනින්ම, 100% ක්ම විශ්වාස ==කරනවාද, එය මා සිතන ආකාරයට හැසිරෙනු ඇත්ද?"
STW

7
@STW - ක්‍රොක්ෆර්ඩ් ජාවාස්ක්‍රිප්ට්හි ඇල්ෆා සහ ඔමේගා නොවීමට එක් උදාහරණයක් නම්, ඒකීය වර්ධක / අඩුවීම ( ++/ --) භාවිතා නොකිරීමට ඔහුගේ අවවාදයයි .
මාසෙල් කෝර්පල්

11
හා භාවිතා කවදාවත් ++හෝ --තනි මාර්ගය හෝ if/elseප්රකාශ හෝ continueහෝnew ක්රියාකරු හෝ Crockford "හානිකර" සලකනු ඇති බව ඉතා හොඳින් නීත්යානුකූල කේතය භාවිතයන් වෙනත් ඕනෑම සංඛ්යාව. එමෙන්ම ඇත්ත කවදාවත් මෙතෙක් පවා භාවිතා කරන ආකාරය පිළිබඳව කල්පනා සලකා evalහෝ withඔවුන්ගේ උගුල් හොඳින් වටහා පවා නම්. JS හි ඊළඟ අනුවාදය ඔබ දැක තිබේද? දැඩි වාක්‍ය ඛණ්ඩය සහ උපකාරක කාර්යයන් අතලොස්සක්, සමහර ඒවා වසර ගණනාවක් තිස්සේ පාවෙමින් පවතී, මේ සියල්ලෙන් පසු අපට ලැබෙන සියල්ල ගැන ය. වාක්‍ය ඛණ්ඩය කිසිසේත්ම පරිණාමය වී නැත. ක්‍රොක්ෆර්ඩ් මේ පිටුපස සිටින්නේ නම් එය නරක දෙයකි.
MooGoo

4
@CoffeeAddict - JSFiddle හි ඉක්මන් පරීක්ෂණයකට එකඟ නොවන බව පෙනේ. ඔවුන් දෙදෙනාම සිද්ධි සංවේදී ය: jsfiddle.net/st2EU
STW

211

ඒවා නූල් බව ඔබ දන්නේ නම්, වර්ගය පරීක්ෂා කිරීම අවශ්‍ය නොවේ.

"a" == "b"

කෙසේ වෙතත්, නූල් වස්තු සමාන නොවන බව සලකන්න.

new String("a") == new String("a")

බොරු නැවත පැමිණේ.

සංගීත වස්තු සඳහා ප්‍රාථමිකයක් බවට පරිවර්තනය කිරීම සඳහා අගය ඕෆ් () ක්‍රමය අමතන්න,

new String("a").valueOf() == new String("a").valueOf()

නැවත සත්‍ය වනු ඇත


4
එම JSS ට ස්තූතියි, අගය නොසලකා එකම වස්තුවක් නම් නූල් වස්තු දෙකක් කිසි විටෙකත් සමාන නොවේ.
අනුරග්

4
@ ජේඑස්එස්: මීට අමතරව, new String("a") == "a"සත්‍ය වේ (නමුත් එසේ නොවේ ===), මන්ද වම් පස ප්‍රාථමික නූල් අගයක් බවට පරිවර්තනය වේ.
මැතිව් ක්‍රම්ලි

5
@JSS: new String("a") == new String("a"), new String("a") === new String("b"), new String("a") === new String("a")සියලු ආපසු ඇත false, ඔබ වස්තු යොමු සමඟ කටයුතු කරන්නේ සිට Stringපන්ති, වර්ගයේ සැලකෙතත් නොවේ string.
palswim

5
එය කියවන ඕනෑම කෙනෙකුට මෙය පැහැදිලි කිරීම සඳහා ය. new String(foo)වැලක් නිර්මාණය වස්තුව , සහ String(foo) පරිවර්තනය ප්රාථමික වැලක් කිරීමට foo.
බ්‍රිගේඩ්

9
AkeFakeRainBrigand - මඩ ලෙස පැහැදිලිය, නමුත් එය ජාවාස්ක්‍රිප්ට් ගැන නොවේද?
Periata Breatta

60

පිළිතුරු සඳහා එක් එකතු කිරීමක් පමණි: මෙම සියලු ක්‍රම අසත්‍ය බවට පත්වුවහොත්, නූල් සමාන යැයි පෙනුනත්, එක් නූලක වමට හෝ දකුණට සුදු පැහැති අවකාශයක් තිබිය හැකිය. එබැවින්, .trim()සංසන්දනය කිරීමට පෙර නූල් අවසානයේ a එකක් තබන්න :

if(s1.trim() === s2.trim())
{
    // your code
}

වැරැද්ද කුමක්දැයි වටහා ගැනීමට මට පැය ගණනක් අහිමි වී ඇත. මෙය යමෙකුට උපකාරී වේ යැයි සිතමු!


1
ගොඩක් ස්තුතියි. එය මට අමුතු දෙයක්, මන්ද වමට හෝ දකුණට සුදු පැහැති අවකාශයක් නොමැති බවට මා වග බලා ගත් අතර තවමත් මගේ ගැටලුව විසඳීමට ඇති එකම ක්‍රමය මෙයයි. සමහර විට එය නූලක අභ්‍යන්තර නිරූපණයට සම්බන්ධද?
නිකෝ

2
ස්තූතියි @akelec !! Ik නිකෝ, එය පියවි ඇසට නොපෙනෙන ශුන්‍ය-පළල-අභ්‍යවකාශ චරිතය නිසා විය හැකිය. En.wikipedia.org/wiki/Zero-width_space බලන්න . මෙම චරිතයට එහි අරමුණු තිබුණත්, බොහෝ සංවර්ධකයින් එහි පැවැත්මට අමනාප වේ!
stwr667

ස්තූතියි, මගේ සමානාත්මතා පරීක්‍ෂණය අසාර්ථක වුව ද, නිදොස් කිරීමේදී පරීක්‍ෂා කිරීමේදී කිසිදු අවකාශයක් මා දුටුවේ නැත.
drzounds

පෙළ ගොනුවකින් විචල්‍යයක් පූරණය කිරීමේදී පොදු ගැටළුවක් (එනම්: භාවිතා කිරීම fetch). ගොඩක් ස්තුතියි.
සොපාලජෝ ඩි ඇරියරෙස්

O සොපාලජෝඩ් ඇරියරෙස්, හරියටම, නූල් අවසානයේ බොහෝ දුරට ඉඩක් හෝ කරත්තයක් තිබේ. ඔබව සාදරයෙන් පිලිගන්නවා.
akelec

23

මෙම ප්‍රශ්නයට මා යොමු කළේ paddingසහwhite-spaces

මගේ නඩුව පරීක්ෂා කරන්න

 if (title === "LastName")
      doSomething();

සහ මාතෘකාව විය " LastName"

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ඒ නිසා සමහර විට ඔබට මේ trimවගේ ශ්‍රිතයක් භාවිතා කිරීමට සිදුවේ

var title = $(this).text().trim();

2
ස්තූතියි මෙහි මා .toString().trim()
යතුරු ලියනයෙහි

12

ජාවාස්ක්‍රිප්ට් වල නූල් සෑදිය හැකි ආකාර දෙකක් තිබේ.

  1. var str = 'Javascript'; මෙය ප්‍රාථමික නූල් අගයක් නිර්මාණය කරයි.

  2. var obj = new String('Javascript');මෙය වර්ගයේ එතීමේ වස්තුවක් නිර්මාණය කරයි String.

    typeof str // string
    typeof obj // object

එබැවින් සමානාත්මතාවය පරීක්ෂා කිරීම සඳහා හොඳම ක්‍රමය වන්නේ === ක්‍රියාකරු නිසා එහි වටිනාකම මෙන්ම ඔපෙරන්ඩ් දෙකේම වර්ගයද පරීක්ෂා කරයි.

ඔබට වස්තු දෙකක් අතර සමානාත්මතාවය පරීක්ෂා කිරීමට අවශ්‍ය නම් භාවිතා String.prototype.valueOfකිරීම නිවැරදි ක්‍රමයයි.

new String('javascript').valueOf() == new String('javascript').valueOf()


5

ඔබට භාවිතා කළ හැකි ==හෝ ===නමුත් පසුගිය තවත් එක් සරල ක්රමයක් (වැඩ src )

a == b (සහ එය ප්‍රතික්ෂේප කිරීම ! = )

රූප විස්තරය මෙහි ඇතුළත් කරන්න

a === b (සහ එය ප්‍රතික්ෂේප කිරීම ! == )

රූප විස්තරය මෙහි ඇතුළත් කරන්න


1

නූල් දෙකම ඉතා විශාල විය හැකි බව සලකන විට, ප්‍රධාන ප්‍රවේශයන් 2 ක් bitwise searchසහlocaleCompare

මම මෙම කාර්යය නැවත නිර්දේශ කළෙමි

function compareLargeStrings(a,b){
    if (a.length !== b.length) {
         return false;
    }
    return a.localeCompare(b) === 0;
}

-8

පරීක්ෂා කිරීමේදී මම විකල්ප විසඳුමක් ඉදිරිපත් කළෙමි. ඔබට නූල් මූලාකෘතියේ ක්‍රියාකාරිත්වය භාවිතා කළ හැකිය.

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

ක්‍රෝම් බ්‍රව්සර් වල හොඳින් ක්‍රියා කරයි


ප්රශ්නය අසන්නේ "හෙලෝ වර්ල්ඩ්" = "හෙලෝ වර්ල්ඩ්" යන්න පරීක්ෂා කරන්නේ කෙසේද යන්න මිස "හෙලෝ වර්ල්ඩ්" යනු නූලක් දැයි පරීක්ෂා කරන්නේ කෙසේද යන්නයි.
නික්

4
මෙය මෝඩ වැඩකි. ඔබ රූබ් ගෝල්ඩ්බර්ග් අනුවාදයක් නිර්මාණය කර ඇත ==.
ජේ.ජේ

හායි ඕපී, ඔබගේ සංස්කරණය එහි අධ්‍යාත්මික කොටසෙන් සම්පූර්ණයෙන්ම වෙනස් වන අතර, ඔබේ පිළිතුරට දැනටමත් අඩු අගයක් ඇත. කරුණාකර මෙම පිළිතුර ඉවත් කර ඔබගේ සංස්කරණය කළ අනුවාදය සමඟ නව එකක් පළ කරන ලෙස මම ඔබෙන් ඉල්ලා සිටිමි
යෙල්මාස් ඩර්මාස්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.