ජාවාස්ක්‍රිප්ට් හි == භාවිතා කිරීම කවදා හෝ අර්ථවත්ද?


281

දී JavaScript, සුබ අමතර කොටස් , ඩග්ලස් Crockford මෙසේ ලිවීය:

ජාවාස්ක්‍රිප්ට් හි සමානාත්මතා ක්‍රියාකරුවන් දෙදෙනෙකු ඇත: ===සහ !==, ඔවුන්ගේ නපුරු නිවුන් දරුවන් ==සහ !=. හොඳ අය ඔබ බලාපොරොත්තු වන ආකාරයට ක්‍රියා කරයි. ඔපෙරන්ඩ් දෙක එකම වර්ගයේ සහ එකම අගයක් තිබේ නම්, ===නිෂ්පාදනය trueකර !==නිෂ්පාදනය කරයි false. ඔපෙරන්ඩ්ස් එකම වර්ගයේ වන විට නපුරු නිවුන් දරුවන් නිවැරදි දේ කරයි, නමුත් ඔවුන් විවිධ වර්ගවල නම්, ඔවුන් සාරධර්ම බල කිරීමට උත්සාහ කරයි. ඔවුන් කරන නීති රීති සංකීර්ණ හා මතක තබා ගත නොහැකි ය. මේවා සිත්ගන්නා අවස්ථා කිහිපයකි:

'' == '0'           // false
0 == ''             // true
0 == '0'            // true

false == 'false'    // false
false == '0'        // true

false == undefined  // false
false == null       // false
null == undefined   // true

' \t\r\n ' == 0     // true

පාරදෘශ්‍යතාවයේ lack නතාවය තැතිගන්වන සුළුය. මගේ අවවාදය නම් කිසි විටෙකත් නපුරු නිවුන් දරුවන් භාවිතා නොකරන්න. ඒ වෙනුවට, සෑම විටම භාවිතා කරන්න ===සහ !==. දැන් පෙන්වා ඇති සියලුම සැසඳීම් ක්‍රියාකරු falseසමඟ නිෂ්පාදනය කරයි ===.

මෙම නිසැක නිරීක්‍ෂණය සැලකිල්ලට ගෙන, භාවිතා කිරීම ==ඇත්ත වශයෙන්ම සුදුසු විය හැකි කාලයක් තිබේද?


11
එය බොහෝ ස්ථානවල අර්ථවත් කරයි . ඕනෑම වේලාවක ඔබ එකම වර්ගයේ කරුණු දෙකක් සංසන්දනය කරන බව පැහැදිලිය (මෙය මගේ අත්දැකීම් අනුව බොහෝ දේ සිදුවේ), == vs === මනාපයට පැමිණේ. ඔබට සැබවින්ම වියුක්ත සංසන්දනයක් අවශ්‍ය වෙනත් වේලාවන් (ඔබේ පිළිතුරේ සඳහන් කළ ආකාරයට). එය සුදුසු ද යන්න ඕනෑම ව්‍යාපෘතියක් සඳහා වන සම්මුතීන් මත රඳා පවතී.
හේයි

4
"බොහෝ ස්ථාන" සම්බන්ධයෙන්, මගේ අත්දැකීම් අනුව එය වැදගත් වන අවස්ථා එය සිදු වන අවස්ථා වලට වඩා වැඩිය. ඔබේ අත්දැකීම් වෙනස් විය හැකිය; සමහර විට අපට විවිධ ආකාරයේ ව්‍යාපෘති පිළිබඳ අත්දැකීම් තිබේ. මම ==පෙරනිමියෙන් භාවිතා කරන ව්‍යාපෘති දෙස බලන විට , ===කැපී පෙනෙන අතර වැදගත් දෙයක් සිදුවෙමින් පවතින බව මට දන්වයි.
හේයි

4
මම හිතන්නේ නැහැ ජාවාස්ක්‍රිප්ට් එහි බලහත්කාරය සමඟ බොහෝ දුර යයි. BS භාෂාව මෙන් ඊටත් වඩා බලහත්කාරයෙන් බල කිරීමේ විකල්ප තිබිය යුතුය .
මාර්ක් බූත්

5
මා භාවිතා කරන එක් ස්ථානයක් වන්නේ == ඩ්‍රොප් ඩවුන් හැඳුනුම්පත් (සෑම විටම වර්‍ග වන) ආකෘති හැඳුනුම්පත් සමඟ සසඳන විට (ඒවා සාමාන්‍යයෙන් int).
ස්කොටි

12
E ඩෙව්සොලර් වෙබ් සංවර්ධනය ඔබට එක් එක් වේදිකා 15 සඳහා ස්වදේශීය යෙදුමක් නිෂ්පාදනය කිරීම හා එක් වේදිකාවක් ඇති එක් එක් වේදිකාවේ ඒකාධිකාරී යෙදුම් වෙළඳසැලේ සහතික කිරීම සමඟ ගනුදෙනු කිරීමට අවශ්‍ය නොවන විට අර්ථවත් කරයි.
ඩේමියන් යෙරික්

Answers:


235

මම තර්කයක් ඉදිරිපත් කරන්නයි යන්නේ ==

ඔබ උපුටා දැක්වූ ඩග්ලස් ක්‍රොක්ෆර්ඩ් ඔහුගේ බොහෝ හා බොහෝ විට ප්‍රයෝජනවත් අදහස් සඳහා ප්‍රසිද්ධය. මෙම විශේෂ අවස්ථාවෙහිදී මම ක්‍රොක්ෆර්ඩ් සමඟ සිටින අතර එය එකම මතය නොවන බව සඳහන් කිරීම වටී . භාෂා නිර්මාතෘ බ්‍රෙන්ඩන් අයිච් වැනි තවත් අය විශාල ගැටලුවක් නොදකිති ==. තර්කය පහත දැක්වෙන ආකාරයට මඳක් ඉදිරියට යයි:

ජාවාස්ක්‍රිප්ට් යනු චර්යාත්මකව * ටයිප් කළ භාෂාවකි. දේවල් සලකනු ලබන්නේ ඔවුන්ට කළ හැකි දේ මත මිස ඒවායේ නියම වර්ගය මත නොවේ. ඔබට .mapNodeList එකක හෝ jQuery තේරීම් කට්ටලයක් මත අරාව ක්‍රමයක් ඇමතිය හැක්කේ මේ නිසා ය . ඔබට එය කළ හැකි 3 - "5"අතර අර්ථවත් යමක් ආපසු ලබා ගත හැක්කේ එබැවිනි - "5" අංකයක් ලෙස ක්‍රියා කළ හැකි බැවිනි.

ඔබ ==සමානාත්මතාවයක් සිදු කරන විට , විචල්‍යයක අන්තර්ගතය එහි වර්ගයට වඩා සංසන්දනය කරයි . මෙය ප්‍රයෝජනවත් වන අවස්ථා කිහිපයක් මෙන්න:

  • පරිශීලකයාගෙන් අංකයක් කියවීම - .valueDOM හි ආදාන අංගයක් කියවීම ? කිසිම ප්රශ්නයක් නැ! ඔබට එය වාත්තු කිරීම හෝ එහි වර්ගය ගැන කරදර වීම ආරම්භ කළ යුතු නැත - ඔබට ==එය වහාම අංකවලට යොමු කර අර්ථවත් යමක් ලබා ගත හැකිය.
  • ප්‍රකාශිත විචල්‍යයක “පැවැත්ම” පරීක්ෂා කිරීමට අවශ්‍යද? - == nullචර්යාත්මකව nullනිරූපණය වන බැවින් එහි කිසිවක් නොමැති අතර නිර්වචනය කර ඇති කිසිවක් එහි නොමැත.
  • ඔබට පරිශීලකයෙකුගෙන් අර්ථවත් ආදානයක් තිබේදැයි පරීක්ෂා කළ යුතුද? - ==තර්කය සමඟ ආදානය අසත්‍ය දැයි පරීක්ෂා කරන්න , එය පරිශීලකයා කිසිවක් ඇතුළත් කර නැති අවස්ථාවන්ට හෝ ඔබට සුදු අවකාශයක් ලබා දෙනු ඇත.

අපි ක්‍රොක්ෆර්ඩ්ගේ උදාහරණ දෙස බලා ඒවා චර්යාත්මකව පැහැදිලි කරමු:

'' == '0'           // got input from user vs. didn't get input - so false
0 == ''             // number representing empty and string representing empty - so true
0 == '0'            // these both behave as the number 0 when added to numbers - so true    
false == 'false'    // false vs got input from user which is truthy - so false
false == '0'        // both can substitute for 0 as numbers - so again true

false == undefined  // having nothing is not the same as having a false value - so false
false == null       // having empty is not the same as having a false value - so false
null == undefined   // both don't represent a value - so true

' \t\r\n ' == 0     // didn't get meaningful input from user vs falsey number - true 

මූලික වශයෙන්, ජාවාස්ක්‍රිප්ට් හි ==ප්‍රාථමිකයන් හැසිරෙන ආකාරය මත පදනම්ව ක්‍රියා කිරීමට සැලසුම් කර ඇත . මෙම දෘෂ්ටි කෝණයෙන් මා පෞද්ගලිකව එකඟ නොවන අතර එය සිදුකිරීමේ අනිවාර්යයෙන්ම සුදුසුකමක් ඇත - විශේෂයෙන් ඔබ භාෂාව පුරා පැතිරී ඇති හැසිරීම් මත පදනම්ව ප්‍රතිකාර කිරීමේ මෙම ආදර්ශය ගතහොත්.

* සමහරු වඩාත් පොදු වන ව්‍යුහාත්මක ටයිප් කිරීමට කැමති විය හැකි නමුත් වෙනසක් ඇත - මෙහි වෙනස සාකච්ඡා කිරීමට සැබවින්ම උනන්දු නොවේ.


8
මෙය හොඳ පිළිතුරක් වන අතර, මම ඔබේ 'for ==' අවස්ථා තුනම භාවිතා කරමි. # 1 සහ # 3 විශේෂයෙන් ප්‍රයෝජනවත් වේ.
ක්‍රිස් සයිරෆිස්

227
ගැටලුව ==වන්නේ එහි සැසඳීම් කිසිවක් ප්‍රයෝජනවත් නොවීම, නීති රීති මතක තබා ගැනීමට නොහැකි වීම නිසා ඔබට වැරදි කිරීමට ආසන්න වශයෙන් සහතික වීමයි. උදාහරණයක් ලෙස: "ඔබට පරිශීලකයෙකුගෙන් අර්ථවත් ආදානයක් ලැබී ඇත්දැයි පරීක්ෂා කළ යුතුද?", නමුත් '0' යනු අර්ථවත් ආදානයක් වන අතර '0'==falseඑය සත්‍යයකි. ඔබ භාවිතා කළේ නම් ඔබට ===ඒ ගැන පැහැදිලිව සිතා බැලිය යුතු අතර ඔබ වැරැද්ද නොකරනු ඇත.
ටිම්ම්ම්

44
"නීති මතක තබා ගත නොහැක" <== ජාවාස්ක්‍රිප්ට් හි "අර්ථවත්" කිසිවක් කිරීමෙන් මා බිය ගන්වන එකම දෙය මෙයයි. (සහ මූලික ගණනය කිරීම් වල ගැටළු වලට තුඩු දෙන පාවෙන ගණිතය)
වර්නර්සීඩී

9
මෙම 3 - "5"උදාහරණය තමන්ගේ ම හොඳ අදහසක් මතු කරයි: ඔබ පමණක්ම භාවිතා වුවද ===විචල්ය ජාවාස්ක්රිප්ට් වැඩ හුදෙක් මාර්ගය බව, සංසන්දනය, සඳහා. එයින් සම්පූර්ණයෙන්ම ගැලවීමට ක්‍රමයක් නැත.
ජැරට් මිලර්ඩ්

23
Im තිම්ම්ම් සටහන මම මෙහි යක්ෂයාගේ අධිනීති ate යා ලෙස රඟපානවා. මම ==මගේ කේතයේ භාවිතා නොකරමි, එය ප්‍රති-රටාවක් ලෙස මම දකිමි. වියුක්ත සමානාත්මතා ඇල්ගොරිතම මතක තබා ගැනීම දුෂ්කර බව මම සම්පූර්ණයෙන්ම එකඟ වෙමි. මම මෙහි කරන්නේ මිනිසුන් ඒ සඳහා ඉදිරිපත් කරන තර්කයයි.
බෙන්ජමින් ග ru න්බෝම්

97

JQuery විසින් ඉදිකිරීම් භාවිතා කරන බව පෙනේ

if (someObj == null) {
  // do something
}

සමාන කේතය සඳහා කෙටිමං ලෙස පුළුල් ලෙස:

if ((someObj === undefined) || (someObj === null))  {
  // do something
}

මෙම ප්රතිඵලයක් වන මෙම සම්මතයන් භාෂා පිරිවිතර § 11.9.3, නිපැයුමක් සමානතා සංසන්දනය ඇල්ගොරිතමය බව, වෙනත් දේ අතර, සඳහන් කර

1.  If Type(x) is the same as Type(y), then  
    a.  If Type(x) is Undefined, return true.  
    b.  If Type(x) is Null, return true.

හා

2.  If x is null and y is undefined, return true.
3.  If x is undefined and y is null, return true.

මෙම විශේෂිත තාක්‍ෂණය JSHint සඳහා විශේෂයෙන් නිර්මාණය කර ඇති ධජයක් ඇති තරම් පොදු ය.


10
ඔබේම ප්‍රශ්නයට සාධාරණ පිළිතුරක් දීමට මට අවශ්‍ය == null or undefinedනොවීය :) මම භාවිතා නොකරන එකම ස්ථානය ===හෝ!==
pllee

27
සාධාරණ ලෙස jQuery යනු ආදර්ශ කේත පදනමක් නොවේ. JQuery මූලාශ්‍රය කිහිප වතාවක් කියවීමෙන් එය කූඩු කළ ත්‍රිකෝණ, අපැහැදිලි බිටු, කැදැල්ල සහ සැබෑ කේතයෙන් මා වැළකී සිටින දේවල් සහිත මගේ අවම ප්‍රියතම කේත පදනම් වලින් එකකි. ඒ සඳහා මගේ වචනය නොගන්න - එය කියවන්න github.com/jquery/jquery/tree/master/src ඉන්පසු එය සෙප්ටෝ සමඟ සංසන්දනය කරන්න. එය jQuery ක්ලෝනයක් වේ: github.com/madrobby/zepto/tree/master/src
බෙන්ජමින් ග ru න්බෝම්

4
සෙප්ටෝ පෙරනිමිය ලෙස පෙනෙන බවත් එය අවශ්‍ය අවස්ථාවන්හිදී ==පමණක් භාවිතා ===කරන බවත් සලකන්න : github.com/madrobby/zepto/blob/master/src/event.js
හේයි

2
Ey සාධාරණ වීමට සෙප්ටෝ කිසිසේත්ම ආදර්ශ කේත පදනමක් නොවේ - එය භාවිතා කිරීම සම්බන්ධයෙන් කුප්‍රකට වන අතර __proto__ජංගම වෙබ් අඩවි බිඳ දැමීම වළක්වා ගැනීම සඳහා එය තනි අතින් භාෂා පිරිවිතරයන්ට බල කරයි.
බෙන්ජමින් ග ru න්බෝම්

2
En බෙන්ජමින් ග ru න්බෝම් ඔවුන්ගේ කේත පදනමේ ගුණාත්මකභාවය පිළිබඳ විනිශ්චයක් නොවන අතර, විවිධ ව්‍යාපෘති විවිධ සම්මුතීන් අනුගමනය කරන බව පෙන්වා දෙයි.
හේයි

15

බහුල ලෙස පැහැදිලි කර ඇති පරිදි, එක් දෙයක් සඳහා අගයන් පරීක්ෂා කිරීම nullහෝ undefinedඑකකි.

තවත් දෙයක් තිබේ, එහිදී ==බැබළෙයි:

ඔබට ඒ හා >=සමාන සංසන්දනය අර්ථ දැක්විය හැකිය (මිනිසුන් සාමාන්‍යයෙන් ආරම්භ වන >නමුත් මට මෙය වඩාත් අලංකාරයි):

  • a > b <=> a >= b && !(b >= a)
  • a == b <=> a >= b && b >= a
  • a < bහා a <= bපාඨකයා වෙත අභ්යාස ලෙස ඉතිරි වේ.

අප දන්නා පරිදි, ජාවාස්ක්‍රිප්ට් "3" >= 3සහ "3" <= 3ඔබ ලබා ගන්නා 3 == "3". නූල් විග්‍රහ කිරීමෙන් නූල් සහ සංඛ්‍යා අතර සංසන්දනය ක්‍රියාත්මක කිරීමට ඉඩ දීම භයානක අදහසක් බව ඔබට පෙන්වා දිය හැකිය. නමුත් මේ ඒක වැඩ මාර්ගය බව ලබා දී, ==සයුරු තෙර විසින් එම සම්බන්ධතාව ක්රියාකරු ක්රියාත්මක නිවැරදි ක්රමය.

ඉතින් ඇත්තෙන්ම හොඳ දෙය ==නම් එය අනෙක් සියලුම සම්බන්ධතාවන්ට අනුකූල වීමයි. එය වෙනස් ලෙස කිවහොත්, ඔබ මෙය ලියන්නේ නම්:

function compare(a, b) {
  if (a > b) return 1;
  if (a < b) return -1;
  return 0;
}

ඔබ ==දැනටමත් ව්‍යංගයෙන් භාවිතා කරයි.

දැන් තරමක් සම්බන්ධ ප්‍රශ්නයට: අංක සහ නූල් එය ක්‍රියාත්මක කරන ආකාරය සංසන්දනය කිරීම නරක තේරීමක් ද? හුදකලාව සිටිනු දැකීම තරමක් මෝඩ දෙයක් ලෙස පෙනේ. නමුත් ජාවාස්ක්‍රිප්ට් සහ ඩොම් හි අනෙකුත් කොටස් වල සන්දර්භය තුළ එය සාපේක්ෂව ප්‍රායෝගික ය:

  • ගුණාංග සෑම විටම නූල් වේ
  • යතුරු සැමවිටම නූල් වේ (භාවිතයේ අවස්ථාව නම් ඔබ භාවිතා කරන්නේ Objectඉන්ට්ස් සිට අගයන් දක්වා විරල සිතියමක් තිබීමයි)
  • පරිශීලක ආදානය සහ පෝරම පාලන අගයන් සැමවිටම නූල් වේ (ප්‍රභවය ගැලපුණත් input[type=number])

හේතු ගණනාවක් නිසා අවශ්‍ය වූ විට නූල් සංඛ්‍යා ලෙස හැසිරවීම අර්ථවත් විය. නූල් සංසන්දනය හා නූල් ::සම්මුතියට විවිධ ක්‍රියාකරුවන් සිටින බව උපකල්පනය කිරීම (උදා: සම්මුතිය සඳහා සහ සංසන්දනය කිරීමේ ක්‍රමයක් (එහිදී ඔබට සිද්ධි සංවේදීතාව පිළිබඳ සියලු වර්ගවල පරාමිතීන් භාවිතා කළ හැකිය සහ නොකළ යුතු දේ), මෙය ඇත්ත වශයෙන්ම අවුලකට වඩා අඩු වනු ඇත. නමුත් මෙම ක්‍රියාකරු අධික ලෙස පැටවීම බොහෝ විට “ජාවාස්ක්‍රිප්ට්” හි “ජාවා” පැමිණෙන්නේ;)


4
සාධාරණ >=වීම ඇත්ත වශයෙන්ම සංක්‍රාන්ති නොවේ. JS හි එය කළ හැකි a > bහෝ a < bනොවිය හැකිය b == a(උදාහරණයක් ලෙස :) NaN.
බෙන්ජමින් ග ru න්බෝම්

8
En බෙන්ජමින් ග ru න්බෝම්: එය හරියට සංක්‍රාන්ති +නොවන බව පැවසීම හා සමානයි NaN + 5 == NaN + 5. කාරණය වන්නේ >=සංඛ්‍යාත්මකව ක්‍රියාත්මක වන සංඛ්‍යා-ඊෂ් අගයන් සමඟ ==ක්‍රියා කිරීමයි. “සංඛ්‍යාවක් නොවේ” යන්න එහි ස්වභාවයෙන්ම අංක-
ඊෂ්

4
ඉතින් දුර්වල හැසිරීමේ ==දුර්වල හැසිරීමට අනුරූපද >=? නියමයි, දැන් මම කැමතියි >==...
එල්ඩ්‍රිච් කොන්ඩ්‍රම්

2
DEldritchConundrum: මම පැහැදිලි කිරීමට උත්සාහ කළ පරිදි, හැසිරීම >=අනෙක් භාෂා / සම්මත API වලට අනුරූප වේ. එහි සමස්තයක් ලෙස ගත් කල, ජාවාස්ක්‍රිප්ට් එහි විචක්ෂණ කොටස්වල එකතුවට වඩා වැඩියෙන් කළමනාකරණය කරයි. ඔබ කැමති නම් >==, ඔබටත් දැඩි +අවශ්‍යද? ප්රායෝගිකව, මෙම තීරණ බොහොමයක් බොහෝ දේ පහසු කරයි. ඒ නිසා මම ඔවුන් දුප්පතුන් ලෙස විනිශ්චය කිරීමට ඉක්මන් නොවෙමි.
back2dos

2
LDEldritchConundrum: නැවතත්: සම්බන්ධතා ක්‍රියාකරුවන් යනු සංඛ්‍යාත්මක අගයන් සංසන්දනය කිරීම සඳහා වන අතර එහිදී එක් ඔපෙරන්ඩ් එකක් ඇත්ත වශයෙන්ම නූලක් විය හැකිය. ඔපෙරන්ඩ් වර්ග සඳහා >=අර්ථවත්, ==සමානව අර්ථවත් වේ - එපමණයි . ඔයා කාටවත් සංසන්දනය කළ යුතුය පවසයි [[]]සමග false. සී වැනි භාෂාවල මෙම මට්ටමේ විකාරයේ ප්‍රති result ලය නිර්වචනය නොකළ හැසිරීමයි. එය එකම ආකාරයකින් සලකන්න: එය නොකරන්න. ඔබ හොඳින් වේවි. ඔබට කිසිදු මැජික් නීති මතක තබා ගැනීමට අවශ්‍ය නොවනු ඇත. එවිට එය සැබවින්ම කෙළින්ම ඉදිරියට ය.
back2dos

8

වෘත්තීය ගණිතඥයෙකු ලෙස මා දකින Javscript ගේ විෂමත්වයක් ක්රියාකරු == (ද "වියුක්ත සංසන්දනය" නම්, "නින්දිත සමානාත්මතාවය" ) යනු ගොඩ නැගීමට උත්සාහ සමතාව සම්බන්ධයෙන් වීම ද ඇතුළත් වන, ආයතන අතර සිද්ධ , සමමිතික හා අධිෂ්ඨාන පූර්වකව . අවාසනාවට, මෙම මූලික ගුණාංග තුනෙන් දෙකක් අසමත් වේ:

==ප්‍රත්‍යාවර්තක නොවේ :

A == A අසත්‍ය විය හැකිය, උදා

NaN == NaN // false

==සංක්‍රාන්ති නොවේ :

A == Bහා B == Cඑකට අදහස් කරන්නේ නැහැ A == C, උදා:

'1' == 1 // true
1 == '01' // true
'1' == '01' // false

සමමිතික දේපල පමණක් ඉතිරිව පවතී:

A == Bඑයින් ගම්‍ය වන්නේ B == A, කුමන උල්ලං violation නයක් ඕනෑම අවස්ථාවක සිතාගත නොහැකි අතර බරපතල කැරැල්ලකට තුඩු දෙනු ඇත;)

සමානතා සම්බන්ධතා වැදගත් වන්නේ ඇයි?

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

==සමාන නොවන සම්බන්ධතාවයක් සඳහා ලිවීම එතරම් භයානක අදහසක් වන්නේ ඇයි?

මක්නිසාද යත් එය අපගේ හුරුපුරුදුකම සහ ප්‍රතිභානය බිඳ හෙළන හෙයිනි, වචනාර්ථයෙන් සමානකම්, සමානාත්මතාවය, සමගිය, සමාවයවිකතාව, අනන්‍යතාවය යනාදී ඕනෑම රසවත් සම්බන්ධතාවයක් සමාන වේ.

පරිවර්තනය ටයිප් කරන්න

ජාවාස්ක්‍රිප්ට් ප්‍රත්‍යක්‍ෂ සමානතාවයක් මත රඳා සිටීම වෙනුවට, වර්ග පරිවර්තනය පරිවර්තනය කරයි:

සමානාත්මතා ක්‍රියාකරු ඔපෙරන්ඩ් එකම වර්ගයට අයත් නොවේ නම් පරිවර්තනය කරයි, පසුව දැඩි සංසන්දනය අදාළ වේ.

නමුත් වර්ගය පරිවර්තනය අර්ථ දක්වන්නේ කෙසේද? බොහෝ ව්‍යතිරේකයන් සහිත සංකීර්ණ නීති මාලාවක් හරහා?

සමානතා සම්බන්ධතාවයක් ගොඩනඟා ගැනීමට උත්සාහ කිරීම

බූලියන්. පැහැදිලිවම trueහා falseසමාන නොවන අතර විවිධ පංතිවල සිටිය යුතුය.

අංක. වාසනාවකට මෙන්, සංඛ්‍යා වල සමානාත්මතාවය දැනටමත් මනාව නිර්වචනය කර ඇති අතර, විවිධ සංඛ්‍යා දෙකක් කිසි විටෙකත් එකම සමානතා පන්තියේ නොමැත. ගණිතයේ දී, එනම්. ජාවාස්ක්‍රිප්ට් හි සංඛ්‍යා පිළිබඳ සංකල්පය තරමක් විකෘති වී ඇත්තේ වඩාත් විදේශීය -0, Infinityසහ -Infinity. අපගේ ගණිතමය දෙබස් කවන ශිල්පීනියක ආඥාවන් 0හා -0එකම පන්තිය තුළ විය යුතු (ඇත්ත -0 === 0true), infinities එක් එක් වෙනම පන්ති ගතවේ.

අංක සහ බූලියන්. පන්ති අංක අනුව, අපි බූලියන් තබන්නේ කොහේද? falseසමාන බවට පත් වෙයි 0බැවින්ද, trueසමාන බවට පත් වෙයි 1නමුත් වෙනත් කිසිදු අංකය:

true == 1 // true
true == 2 // false

එහි කිසිදු තර්ක දමා මෙතන trueසමග එක්ව 1? පිළිගත හැකි 1ලෙස කැපී පෙනේ, නමුත් එසේ ය -1. මම පෞද්ගලිකව බවට පරිවර්තනය කිරීමට කිසිදු සාධාරණ හේතුවක් නැහැ trueකිරීමට 1.

එය තවත් නරක අතට හැරේ:

true + 2 // 3
true - 1 // 0

එබැවින් trueසැබවින්ම 1සියලු සංඛ්‍යා අතරට පරිවර්තනය වේ! එය තර්කානුකූලද? එය බුද්ධිමත් ද? පිළිතුර ව්‍යායාමයක් ලෙස ඉතිරිව ඇත;)

නමුත් මේ ගැන කුමක් කිව හැකිද:

1 && true // true
2 && true // true

එකම වීජ xසමග x && trueවීම truex = true. දෙකම බව ඔප්පු 1හා 2(සහ වඩා වෙනත් ඕනෑම අංකය 0) පරිවර්තනය true! වීම - මොකක්ද ඒ පෙන්නුම් අපගේ පරිවර්තනය තවත් වැදගත් දේපල අසමත් බව ය bijection . විවිධ ආයතන දෙකක් එකම එකකට පරිවර්තනය කළ හැකි බව එයින් අදහස් වේ. එය තනිවම විශාල ගැටලුවක් විය යුතු නැත. විශාල පරිවර්තනයක් අප මෙම පරිවර්තනය භාවිතා කරන විට අපට එය හැඳින්වීමට අවශ්‍ය ඕනෑම දෙයක “සමානත්වය” හෝ “ලිහිල් සමානාත්මතාවය” පිළිබඳ විස්තරයක් විස්තර කරයි. නමුත් එක් දෙයක් පැහැදිලිය - එය සමානතා සම්බන්ධතාවයක් නොවනු ඇති අතර එය සමානතා පන්ති හරහා බුද්ධිමත්ව විස්තර කිරීමට යන්නේ නැත.

නමුත් අපට මීට වඩා හොඳින් කළ හැකිද?

අවම වශයෙන් ගණිතමය වශයෙන් - අනිවාර්යයෙන්ම ඔව්! Booleans සහ අංක අතර සරල සමතාව සම්බන්ධයෙන් පමණක් ඉදි කිරීමට falseහා 0එකම පන්තිය තුළ වීම. ඒ නිසා false == 0එකම-නොවැදගත් නොවන ලිහිල් සමානාත්මතාවය වනු ඇත.

නූල් ගැන කුමක් කිව හැකිද?

ආරම්භයේ සහ අවසානයේ සංඛ්‍යා බවට පරිවර්තනය කිරීම සඳහා අපට හිස් අවකාශයේ සිට නූල් කපා දැමිය හැකිය, එසේම අපට ඉදිරියෙන් ඇති ශුන්‍යයන් නොසලකා හැරිය හැකිය:

'   000 ' == 0 // true
'   0010 ' == 10 // true

එබැවින් අපට නූලක් සඳහා සරල රීතියක් ලැබේ - ඉදිරියෙන් ඇති සුදු අවකාශය සහ ශුන්‍යය කපා දමන්න. එක්කෝ අපට අංකයක් හෝ හිස් නූලක් ලැබෙනු ඇත, එම අවස්ථාවේදී අපි එම අංකයට හෝ ශුන්‍යයට පරිවර්තනය කරමු. නැතහොත් අපට අංකයක් ලැබෙන්නේ නැත, එවැනි අවස්ථාවකදී අපි හැරී නොයන අතර නව සම්බන්ධතාවයක් නොලැබේ.

මේ ආකාරයෙන් අපට ඇත්ත වශයෙන්ම සම්පූර්ණ බූලියන්, සංඛ්‍යා සහ නූල් සමූහයට පරිපූර්ණ සමානතා සම්බන්ධතාවයක් ලබා ගත හැකිය! එය හැර ... ජාවාස්ක්‍රිප්ට් නිර්මාණකරුවන්ට පැහැදිලිවම වෙනත් මතයක් තිබේ:

' ' == '' // false

එබැවින් දෙකම පරිවර්තනය කරන නූල් දෙක 0හදිසියේම සමාන නොවේ! ඇයි හෝ ඇයි? රීතියට අනුව, නූල් තදින් සමාන වන විට හරියටම ලිහිල්ව සමාන වේ! මෙම රීතිය අප දකින පරිදි පාරදෘශ්‍යතාව බිඳ දමනවා පමණක් නොව එය අතිරික්තයක් ද වේ! අනෙක් ක්‍රියාකරු ==සමඟ අනෙකට වඩා තදින් සමාන කිරීමට වෙනත් ක්‍රියාකරුවෙකු නිර්මාණය කිරීමේ තේරුම ===කුමක්ද?

නිගමනය

==සමහර මූලික ගණිතමය නීතිවලට අනුකූල නම් ලිහිල් සමානාත්මතා ක්‍රියාකරුට එය බෙහෙවින් ප්‍රයෝජනවත් වනු ඇත. නමුත් එය කනගාටුවට කරුණක් නොවන බැවින් එහි ප්‍රයෝජනය දුක් විඳියි.


කුමක් ගැනද NaN? එසේම, නූල් සමඟ සංසන්දනය කිරීම සඳහා නිශ්චිත සංඛ්‍යා ආකෘතියක් බලාත්මක නොකරන්නේ නම්, නොදැනුවත්වම නූල් සංසන්දනය හෝ සංක්‍රාන්ති නොවන ප්‍රති result ල ලැබිය යුතුය.
සොලමන් උකෝ

Ol සොලමන් උකෝ NaNනරක පුරවැසියෙකු ලෙස ක්‍රියා කරයි :-). සංක්‍රාන්ති භාවය ඕනෑම සමානතා සැසඳීමක් සඳහා ඉදිරිපත් කළ හැකි හා පිළිගත යුතුය.
දිමිත්‍රි සයිට්සෙව්

7

ඔව්, මම ඒ සඳහා භාවිත නඩුවක් හරහා දිව ගියෙමි, එනම් ඔබ යතුරක් සංඛ්‍යාත්මක අගයක් සමඟ සංසන්දනය කරන විට :

for (var key in obj) {
    var some_number = foo(key, obj[key]);  // or whatever -- this is just an example
    if (key == some_number) {
        blah();
    }
}

මම එය ලෙස සංසන්දනය ඉටු කිරීමට වඩා ගොඩක් ස්වාභාවික හිතන්නේ key == some_numberලෙස වඩා Number(key) === some_numberහෝ key === String(some_number).


3

මම අද ඉතා ප්‍රයෝජනවත් යෙදුමක් හරහා දිව ගියෙමි. 01සාමාන්‍ය නිඛිල සංඛ්‍යාවක් මෙන් පෑඩ් අංක සංසන්දනය කිරීමට ඔබට අවශ්‍ය නම් ==එය හොඳින් ක්‍රියාත්මක වේ. උදාහරණයක් වශයෙන්:

'01' == 1 // true
'02' == 1 // false

එමඟින් 0 ඉවත් කර පූර්ණ සංඛ්‍යාවක් බවට පරිවර්තනය වේ.


4
මට හොඳටම විශ්වාසයි මෙය කිරීමේ 'නිවැරදි' ක්‍රමය '04'-0 === 4හෝ සමහර විටparseInt('04', 10) === 4
රැට්බම්

ඔබට මෙය කළ හැකි බව මම දැන සිටියේ නැත.
ජෝන් ස්නෝ

7
මට ඒක ගොඩක් ලැබෙනවා.
ජෝන් ස්නෝ


1
'011' == 011 // falseදැඩි නොවන ආකාරයෙන් සහ සින්ටැක්ස් දෝෂය දැඩි ප්‍රකාරයේදී. :)
බ්‍රයන් එස්

3

මෙය ප්‍රමාද පිළිතුරක් බව මම දනිමි, නමුත් යම් යම් ව්‍යාකූලතා ඇති බව පෙනේ , nullසහ undefinedIMHO යනු ==නපුරට හේතුවන දෙයයි , ඊට වඩා සංක්‍රාන්ති lack නතාවය, එය නරක ය. සලකා බලන්න:

p1.supervisor = 'Alice';
p2.supervisor = 'None';
p3.supervisor = null;
p4.supervisor = undefined;

මේවායින් අදහස් කරන්නේ කුමක්ද?

  • p1 "ඇලිස්" යන නමින් අධීක්ෂකවරයෙක් සිටී.
  • p2 "කිසිවක් නැත" යන නමින් අධීක්ෂකවරයෙක් සිටී.
  • p3පැහැදිලිවම, නිසැකවම, අධීක්ෂකවරයෙකු නොමැත .
  • p4අධීක්ෂකවරයෙකු හෝ විය හැකිය. අපි දන්නේ නැහැ, අපි ගණන් ගන්නේ නැහැ, අපි දැනගත යුතු නැහැ (රහස්‍යතා ප්‍රශ්නය?), එය අපගේ ව්‍යාපාරයක් නොවේ.

ඔබ භාවිතා කරන විට ==ඔබ ගොඩට දැමීමක් ද ඇත nullහා undefinedවන පූර්ණ අනිසි වේ. මෙම පද දෙකෙන් අදහස් කරන්නේ සම්පූර්ණයෙන්ම වෙනස් දේවල්! මගේ අධීක්ෂක කවුදැයි ඔබට පැවසීම ප්‍රතික්ෂේප කළ නිසා මට අධීක්ෂකවරයෙකු නොමැති බව පැවසීම වැරදිය!

මෙම වචන අතර වෙනස ගැන තැකීමක් නොකරන nullසහ undefinedමෙම යෙදුම් වෙනස් ලෙස භාවිතා කිරීමට තෝරා ගන්නා ක්‍රමලේඛකයින් සිටින බව මට වැටහේ . ඔබේ ලෝකය භාවිතා කරන්නේ නම් නැත nullහා undefinedනිවැරදිව නම්, හෝ ඔබ විසින් එය විය යුතු අතර, මෙම නියමයන් ඔබේ ම අර්ථ දෙන්න කැමති. මම හිතන්නේ නැහැ ඒක හොඳ අදහසක් කියලා.

දැන් මාර්ගය වන විට මට කිසිදු ගැටළුවක් නොමැති nullඅතර undefinedදෙදෙනාම බොරු ය! කීම කමක් නැත

if (p.supervisor) { ... }

එවිට nullසහ undefinedඅධීක්ෂක සැකසෙන කේතය මඟ හැරීමට හේතු වේ. එය නිවැරදියි, මන්ද අප නොදන්නා හෝ අධීක්ෂකවරයෙකු නොමැති බැවිනි. සියල්ල හොඳයි. නමුත් අවස්ථා දෙක සමාන නොවේ . මේ නිසා ==වැරදියි. නැවතත්, දේවල් ව්‍යාජ විය හැකි අතර තාරා ටයිප් කිරීමේ අර්ථයෙන් භාවිතා කළ හැකිය, එය ගතික භාෂාවන් සඳහා විශිෂ්ටයි. එය නිසි ජාවාස්ක්‍රිප්ට්, පයිතොනික්, රුබිෂ් යනාදියයි. නමුත් නැවතත්, මේ දේවල් සමාන නොවේ.

මට-transitivity නොවන දින ආරම්භ නැහැ ලබා ගන්න: "0x16" == 10, 10 == "10"නමුත් "10" == "0x16". ඔව්, ජාවාස්ක්‍රිප්ට් දුර්වල ලෙස වර්ග වේ. ඔව්, එය බලහත්කාරය. එහෙත් බලහත්කාරය කිසි විටෙකත් සමානාත්මතාවයට අදාළ නොවිය යුතුය.

මාර්ගය වන විට, ක්‍රොක්ෆර්ඩ්ට ප්‍රබල මත තිබේ. නමුත් ඔබ දන්නවාද මොකක්ද? ඔහු මෙහි නිවැරදියි!

FWIW ==පහසු අවස්ථා ඇති බව මම පෞද්ගලිකව තේරුම් ගෙන ඇත්තෙමි . සංඛ්‍යා සඳහා නූල් ආදානය ගැනීම හා 0 ට සාපේක්ෂව කියන්න. කෙසේ වෙතත්, මෙය හැක් වේ. ලෝකයේ සාවද්‍ය ආකෘතියක් සඳහා වෙළඳාමක් ලෙස ඔබට පහසුව ඇත.

TL; DR: ව්‍යාජත්වය යනු විශිෂ්ට සංකල්පයකි. එය සමානාත්මතාවයට ව්‍යාප්ත නොවිය යුතුය.


විවිධ තත්වයන් පෙන්වීමට ස්තූතියි :) කෙසේ වෙතත්, ඔබ p5typeof(p5.supervisor) === typeof(undefined)
මඟ හැරී ඇත
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.