JavaScript-ni taqqoslashda qaysi teng operator (== vs ===) ishlatilishi kerak?

JavaScript orqali oʻtish uchun JSLint dan foydalanmoqdaman va u == (ikki teng) oʻrniga koʻplab takliflarni qaytarmoqda. if gap ichidagi idSele_UNVEHtype.value.length == 0 ni solishtirish kabi ishlarni bajarayotganda === (uch tenglik belgisi) bilan belgilar).

== ni === bilan almashtirishning samaradorlik foydasi bormi?

Har qanday ishlash yaxshilanishi mamnuniyat bilan qabul qilinadi, chunki ko'plab taqqoslash operatorlari mavjud.

Agar turdagi konvertatsiya qilinmasa, unumdorlik == dan yuqori bo'ladimi?


person bcasp    schedule 11.12.2008    source manba


Javoblar (48)


Qattiq tenglik operatori (===) mavhum tenglik operatori (==) bilan bir xil ishlaydi, bundan tashqari hech qanday turdagi konvertatsiya amalga oshirilmaydi va teng deb hisoblash uchun turlar bir xil bo'lishi kerak.

Malumot: Javascript qo‘llanma: Taqqoslash operatorlari

== operatori har qanday kerakli turdagi konvertatsiyalarni amalga oshirgandan so'ng tenglik uchun solishtiradi. === operatori konvertatsiyani o'tkazmaydi, shuning uchun ikkita qiymat bir xil turdagi bo'lmasa, === oddiygina false ni qaytaradi. Ikkalasi ham bir xil darajada tez.

Duglas Krokfordning ajoyib JavaScript: Yaxshi qismlardan iqtibos keltirish uchun,

JavaScript-da ikkita tenglik operatorlari mavjud: === va !== va ularning yomon egizaklari == va !=. Yaxshilar siz kutgandek ishlaydi. Agar ikkita operand bir xil turdagi va bir xil qiymatga ega bo'lsa, === true ni va !== false ni hosil qiladi. Yovuz egizaklar operandlar bir xil turdagi bo'lsa, to'g'ri ish qiladilar, lekin ular har xil turdagi bo'lsa, ular qadriyatlarni majburlashga harakat qilishadi. Ular buni qiladigan qoidalar murakkab va unutilmas. Bu qiziqarli holatlarning ba'zilari:

'' == '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

“Tenglikni

Tranzitivlikning yo'qligi tashvishli. Mening maslahatim hech qachon yovuz egizaklardan foydalanmang. Buning o'rniga har doim === va !== dan foydalaning. Ko'rsatilgan barcha taqqoslashlar === operatori bilan false hosil qiladi.


Yangilash:

Yaxshi fikrni @Casebash izohlarda va @Phillipe Laybaert ob'ektlarga oid javob. Ob'ektlar uchun == va === bir-biri bilan izchil harakat qiladi (alohida hol bundan mustasno).

var a = [1,2,3];
var b = [1,2,3];

var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };

var e = "text";
var f = "te" + "xt";

a == b            // false
a === b           // false

c == d            // false
c === d           // false

e == f            // true
e === f           // true

Maxsus holat - toString yoki valueOf usuli tufayli ibtidoiyni bir xil ibtidoiyga baholanadigan ob'ekt bilan solishtirganda. Masalan, String konstruktor yordamida yaratilgan string ob'ekti bilan string primitivini solishtirishni ko'rib chiqing.

"abc" == new String("abc")    // true
"abc" === new String("abc")   // false

Bu erda == operatori ikkita ob'ektning qiymatlarini tekshiradi va true ni qaytaradi, lekin === ularning bir xil turdagi emasligini ko'radi va false ni qaytaradi. Qaysi biri to'g'ri? Bu, albatta, solishtirmoqchi bo'lgan narsangizga bog'liq. Mening maslahatim - bu savolni butunlay chetlab o'tish va string literallaridan string ob'ektlarini yaratish uchun String konstruktoridan foydalanmang.

Ma'lumotnoma
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3

person Bill the Lizard    schedule 11.12.2008
comment
0 === -0 va NaN !== NaN ni ham ta'kidlayman, bu ba'zan chalkashtirib yuborishi mumkin. Agar siz ±0 ni farqlashni istasangiz va NaN ni teng deb hisoblasangiz, Object.is (ES2015) dan foydalaning. - person Ovinus Real; 11.10.2020
comment
Yumshoq matn terish xususiyatdir. Shubhasiz, Crockford dizayn qarorining ba'zi artefaktlariga ishora qilmoqda, ammo yumshoq terish hali ham xususiyatdir. To'g'ri ishlatilsa, undan foydalanish mutlaqo yaxshi. Bolani hammom suvi bilan birga tashlamang. - person aross; 25.03.2021

== operatoridan foydalanish (Tenglik)

true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2;  //true, because "2" is converted to 2 and then compared

=== operatoridan foydalanish (Identity)

true === 1; //false
"2" === 2;  //false

Buning sababi, tenglik operatori == majburlash turini amalga oshiradi, ya'ni tarjimon taqqoslashdan oldin bilvosita qiymatlarni aylantirishga harakat qiladi.

Boshqa tomondan, identifikatsiya operatori === majburlash turini amalga oshirmaydi va shuning uchun taqqoslashda qiymatlarni o'zgartirmaydi va shuning uchun tezroq (Ushbu JS benchmark testi), chunki u bir qadamni oʻtkazib yuboradi.

person Community    schedule 11.12.2008

== va === o'rtasidagi tenglikni taqqoslashning qiziqarli tasviriy tasviri.

Manba: http://dorey.github.io/JavaScript-Equality-Table/


var1 === var2

JavaScript tengligini tekshirish uchun === dan foydalanilganda hamma narsa avvalgidek bo'ladi. Hech narsa baholanmasdan oldin o'zgartirilmaydi.

JSda === tenglikni baholash


var1 == var2

JavaScript tengligini tekshirish uchun == dan foydalanilganda, ba'zi qiziqarli konvertatsiyalar sodir bo'ladi.

JSda == tenglikni baholash


Xulosa:

Har doim === dan foydalaning.

(Agar siz == bilan amalga oshiriladigan konversiyalarni toʻliq tushunmasangiz)

person SNag    schedule 05.05.2014
comment
Yaxshiroq "==" jadvali: algassert.com/ vizualizatsiya/2014/03/27/ - person rocketsarefast; 24.05.2021

Bu yerdagi javoblarda men teng nimani anglatishini hech narsa o'qimaganman. Ba'zilar === teng va bir xil turdagi degan ma'noni anglatadi, deyishadi, lekin bu haqiqatda to'g'ri emas. Bu aslida ikkala operand ham bir xil obyektga havola qiladi yoki qiymat turlarida bir xil qiymatga ega degan ma’noni anglatadi.

Shunday qilib, quyidagi kodni olaylik:

var a = [1,2,3];
var b = [1,2,3];
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

Bu erda ham xuddi shunday:

var a = { x: 1, y: 2 };
var b = { x: 1, y: 2 };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

Yoki hatto:

var a = { };
var b = { };
var c = a;

var ab_eq = (a === b); // false (even though a and b are the same type)
var ac_eq = (a === c); // true

Bu xatti-harakat har doim ham aniq emas. Hikoyada teng bo'lish va bir xil bo'lishdan ko'ra ko'proq narsa bor.

Qoida quyidagicha:

Qiymat turlari (raqamlar) uchun:
a va b bir xil qiymatga ega va bir xil turdagi bo'lsa, a === b rost qaytaradi

Malumot turlari uchun:
Agar a va b bir xil obyektga havola boʻlsa, a === b rost qaytaradi

Strlar uchun:
a === b rost qaytaradi, agar a va b ikkala satr boʻlsa va aynan bir xil belgilarni oʻz ichiga olsa


Strings: maxsus holat ...

Satrlar qiymat turlari emas, lekin Javascriptda ular qiymat turlari kabi ishlaydi, shuning uchun satrdagi belgilar bir xil va bir xil uzunlikda bo'lganda ular teng bo'ladi (uchinchi qoidada tushuntirilganidek)

Endi qiziqarli bo'ladi:

var a = "12" + "3";
var b = "123";

alert(a === b); // returns true, because strings behave like value types

Ammo bu haqida nima deyish mumkin?:

var a = new String("123");
var b = "123";

alert(a === b); // returns false !! (but they are equal and of the same type)

Men satrlar qiymat turlari kabi harakat qiladi deb o'yladim? Xo'sh, bu kimdan so'rashingizga bog'liq ... Bu holda a va b bir xil turdagi emas. a Object turiga, b esa string turiga tegishli. Shuni yodda tutingki, String konstruktor yordamida string ob'ektini yaratish ko'pincha satr sifatida ishlaydigan Object tipidagi narsani yaratadi.

person Philippe Leybaert    schedule 05.06.2009

Menga ushbu maslahatni qo'shishga ruxsat bering:

Agar shubhangiz bo‘lsa, spetsifikatsiyasini o‘qing. !

ECMA-262 - bu JavaScript shevasi bo'lgan skript tilining spetsifikatsiyasi. Albatta, amalda biror narsaning qanday ishlashi kerakligi haqidagi ezoterik ta'rifdan ko'ra, eng muhim brauzerlarning o'zini qanday tutishi muhimroqdir. Lekin nima uchun yangi String(a) !== ani tushunish foydalidir.

Iltimos, ushbu savolga aniqlik kiritish uchun spetsifikatsiyani qanday o'qishni tushuntirib beraman. Ko'ryapmanki, bu juda eski mavzuda hech kim juda g'alati ta'sirga javob bermadi. Shunday qilib, agar siz spetsifikatsiyani o'qiy olsangiz, bu sizga kasbingizda katta yordam beradi. Bu orttirilgan mahorat. Shunday ekan, davom etaylik.

PDF faylni === uchun qidirish meni spetsifikatsiyaning 56-sahifasiga olib keladi: 11.9.4. Strict Equals operatori ( === )va spetsifikatsiyalar bilan tanishib chiqqach, men quyidagilarni topdim:

11.9.6 Qattiq tenglikni taqqoslash algoritmi
Taqqoslash x === y, bu erda x va y qiymatlari to'g'ri yoki noto'g'rini hosil qiladi. >. Bunday taqqoslash quyidagicha amalga oshiriladi:
  1. Agar Type(x) Type(y) dan farqli bo‘lsa, falseni qaytaring.
  2. Type(x) Aniqlanmagan bo‘lsa, qaytaring. to'g'ri.
  3. Type(x) Null bo'lsa, trueni qaytaring.
  4. Agar Type(x) raqam bo'lmasa, 11-bosqichga o'ting. .
  5. Agar x NaN boʻlsa, falseni qaytaring.
  6. Agar y NaN boʻlsa, yolgʻonni qaytaring. .
  7. Agar x y bilan bir xil son qiymati boʻlsa, trueni qaytaring.
  8. Agar x +0 va y −0 boʻlsa, ni qaytaring. rost.
  9. Agar x −0 va y +0 bo‘lsa, to‘g‘rini qaytaring.
  10. noto‘g‘rini qaytaring.
11. Agar Type(x) String bo'lsa, u holda x va y aynan bir xil belgilar ketma-ketligi bo'lsa (tegishli pozitsiyalarda bir xil uzunlik va bir xil belgilar) bo'lsa, trueni qaytaring; aks holda noto'g'rini qaytaring.
  12. Agar Type(x) mantiqiy bo'lsa, x va y ikkalasi ham to'g'ri yoki ikkalasi ham bo'lsa, to'g'rini qaytaring. noto'g'ri; aks holda, falseni qaytaring.
  13. Agar x va y bir xil ob'ektga tegishli bo'lsa yoki ular bir-biriga bog'langan ob'ektlarga tegishli bo'lsa, trueni qaytaring (13.1.2 ga qarang). ). Aks holda, falseni qaytaring.

Qizig'i shundaki, 11-bosqich. Ha, satrlar qiymat turlari sifatida ko'rib chiqiladi. Lekin bu nima uchun yangi String(a) !== ani tushuntirmaydi. ECMA-262 ga mos kelmaydigan brauzerimiz bormi?

Tez emas!

Operandlarning turlarini tekshiramiz. Ularni typeof()ga oʻrash orqali oʻzingiz sinab koʻring. Menimcha, yangi String(a) ob'ektdir va 1-bosqich ishlatiladi: agar turlar boshqacha bo'lsa, falseni qaytaring.

Nima uchun yangi String(a) satrni qaytarmasligiga qiziqsangiz, spetsifikatsiyani oʻqish mashqlari haqida nima deyish mumkin? Bahra oling; vaqtni chog 'o'tkazing!


Aidiakapi buni quyidagi izohda yozgan:

Spetsifikatsiyadan

11.2.2 Yangi Operator:

Agar Type(konstruktor) Ob'ekt bo'lmasa, TypeError istisnosini qo'ying.

Boshqacha qilib aytganda, agar String Object turida bo'lmasa, uni yangi operator bilan ishlatib bo'lmaydi.

new har doim Ob'ektni qaytaradi, hatto String konstruktorlari uchun ham. Va afsuski! Satrlar uchun qiymat semantikasi (11-bosqichga qarang) yo'qoladi.

Va nihoyat, bu degani: yangi String(a) !== a.

person nalply    schedule 28.11.2009

Men buni Firefox-da Firebug bilan quyidagi kod yordamida sinab ko'rdim:

console.time("testEquality");
var n = 0;
while (true) {
  n++;
  if (n == 100000)
    break;
}
console.timeEnd("testEquality");

va

console.time("testTypeEquality");
var n = 0;
while (true) {
  n++;
  if (n === 100000)
    break;
}
console.timeEnd("testTypeEquality");

Mening natijalarim (har biri besh marta sinovdan o'tkazildi va o'rtacha):

==: 115.2
===: 114.4

Shunday qilib, men aytmoqchimanki, kichik farq (bu 100000 dan ortiq iteratsiya, esda tuting) ahamiyatsiz. Ishlash === ni bajarish uchun sabab emas. Xavfsizlikni yozing (yaxshi, JavaScript-da qanday xavfsiz bo'lsangiz) va kod sifati.

person Simon Scarfe    schedule 25.12.2008
comment
Endi, == operatori uchun haqiqiy turdagi majburlash mavjud bo'lganda, ular qanday taqqoslanadi? Esingizda bo'lsin, o'sha paytda samaradorlik oshadi. - person Hubert OG; 14.07.2013
comment
Yuqorida aytib o'tilgan sabablarga ko'ra, to'g'ri sinovdan o'tkazilganda, faqat turdagi tengsizlikni tezroq tekshirish uchun AJO'R farq. jsfiddle.net/4jhuxkb2 - person Doug Morrow; 06.07.2015

PHP va JavaScript-da u qat'iy tenglik operatoridir. Ya'ni, u turni ham, qiymatlarni ham taqqoslaydi.

person Shiki    schedule 12.05.2010

JavaScript-da u bir xil qiymat va turdagi ma'noni anglatadi.

Masalan,

4 == "4" // will return true

lekin

4 === "4" // will return false 
person Dimitar    schedule 12.05.2010

== operatori qat'iy taqqoslash operatori deb ataladi, u == operatoridan farq qiladi.

2 ta a va b ni olaylik.

"a == b"ni haqiqiy deb baholash uchun a va b bir xil qiymat bo'lishi kerak.

"a === b"da a va b baholanishi uchun bir xil qiymat va bir xil turdagi bo'lishi kerak. rost.

Quyidagi misolni oling

var a = 1;
var b = "1";

if (a == b) //evaluates to true as a and b are both 1
{
    alert("a == b");
}

if (a === b) //evaluates to false as a is not the same type as b
{
    alert("a === b");
}

Xulosa; == operatoridan foydalanish siz istamagan holatlarda rost deb baholanishi mumkin, shuning uchun === operatoridan foydalanish xavfsizroq bo'ladi.

90% foydalanish stsenariysida qaysi birini ishlatishingiz muhim emas, lekin bir kun kutilmagan xatti-harakatlarga duch kelganingizda farqni bilish qulay.

person Doctor Jones    schedule 11.12.2008

Nega == oldindan aytib bo'lmaydi?

Bo'sh "" qatorni nol 0 raqami bilan solishtirganda nimaga erishasiz?

true

Ha, bu == ga ko'ra to'g'ri bo'sh satr va nol soni bir vaqtning o'zida.

Va bu bilan tugamaydi, mana yana bir:

'0' == false // true

Masivlar bilan juda g'alati bo'ladi.

[1] == true // true
[] == false // true
[[]] == false // true
[0] == false // true

Keyin torlar bilan g'alatiroq

[1,2,3] == '1,2,3' // true - REALLY?!
'\r\n\t' == 0 // true - Come on!

Bu yomonlashadi:

Qachon tenglik teng emas?

let A = ''  // empty string
let B = 0   // zero
let C = '0' // zero string

A == B // true - ok... 
B == C // true - so far so good...
A == C // **FALSE** - Plot twist!

Yana shuni aytaman:

(A == B) && (B == C) // true
(A == C) // **FALSE**

Va bu shunchaki ibtidoiy narsalarga ega bo'lgan aqldan ozgan narsalar.

Ob'ektlar bilan == dan foydalansangiz, bu butunlay yangi darajadagi aqldan ozishdir.

Shu nuqtada, ehtimol siz hayron bo'lasiz ...

Nega bu sodir bo'ldi?

Buning sababi, "uch barobar" (===) dan farqli o'laroq, ikkita qiymat bir xil yoki yo'qligini tekshiradi.

==to'liq boshqa narsalarni qiladi.

Unda funksiyalar uchun maxsus ishlov berish, nulllar, aniqlanmagan, satrlar uchun maxsus ishlov berish mavjud.

Bu juda g'alati bo'lib qoladi.

Aslida, agar siz == bajaradigan funksiyani yozishga harakat qilsangiz, u quyidagicha ko'rinadi:

function isEqual(x, y) { // if `==` were a function
    if(typeof y === typeof x) return y === x;
    // treat null and undefined the same
    var xIsNothing = (y === undefined) || (y === null);
    var yIsNothing = (x === undefined) || (x === null);

    if(xIsNothing || yIsNothing) return (xIsNothing && yIsNothing);

    if(typeof y === "function" || typeof x === "function") {
        // if either value is a string 
        // convert the function into a string and compare
        if(typeof x === "string") {
            return x === y.toString();
        } else if(typeof y === "string") {
            return x.toString() === y;
        } 
        return false;
    }

    if(typeof x === "object") x = toPrimitive(x);
    if(typeof y === "object") y = toPrimitive(y);
    if(typeof y === typeof x) return y === x;

    // convert x and y into numbers if they are not already use the "+" trick
    if(typeof x !== "number") x = +x;
    if(typeof y !== "number") y = +y;
    // actually the real `==` is even more complicated than this, especially in ES6
    return x === y;
}

function toPrimitive(obj) {
    var value = obj.valueOf();
    if(obj !== value) return value;
    return obj.toString();
}

Xo'sh, bu nimani anglatadi?

Bu == murakkab ekanligini anglatadi.

Bu murakkab bo'lgani uchun uni ishlatganingizda nima bo'lishini bilish qiyin.

Bu degani, siz xatolarga duch kelishingiz mumkin.

Demak, hikoyaning axloqi...

Hayotingizni kamroq murakkablashtiring.

== oʻrniga === dan foydalaning.

Yakun.

person Luis Perez    schedule 09.08.2016

=== bir xil tomonlar turi hamda qiymat boʻyicha tengligini tekshiradi.


Misol:

'1' === 1 // will return "false" because `string` is not a `number`

Umumiy misol:

0 == ''  // will be "true", but it's very common to want this check to be "false"

Yana bir keng tarqalgan misol:

null == undefined // returns "true", but in most cases a distinction is necessary

Ko'p marta yozilgan tekshirish qulay bo'ladi, chunki siz qiymatning undefined, null, 0 yoki "" ekanligiga ahamiyat bermaysiz.

person vsync    schedule 12.05.2010

Qattiq tenglik uchun Javascriptni bajarish oqim diagrammasi / Taqqoslash '==='

Javascript qat'iy tenglik>

Qat'iy bo'lmagan tenglik/taqqoslash uchun Javascriptni bajarish oqim diagrammasi '=='

Javascript teng emas>

person Samar Panda    schedule 05.09.2015

JavaScript === vs == .

0==false   // true
0===false  // false, because they are of a different type
1=="1"     // true, auto type coercion
1==="1"    // false, because they are of a different type
person Community    schedule 03.07.2013

Bu turdagi majburlashsiz tenglik degani, JavaScript boshqa maʼlumotlar turlarini string maʼlumotlar turlariga avtomatik ravishda aylantirmasligini bildiradi.

0==false   // true,although they are different types

0===false  // false,as they are different types

2=='2'    //true,different types,one is string and another is integer but 
            javaScript convert 2 to string by using == operator 

2==='2'  //false because by using === operator ,javaScript do not convert 
           integer to string 

2===2   //true because both have same value and same types 
person Pop Catalin    schedule 12.05.2010

Oddiy skriptda ishlash farqi bo'lmaydi. Muhimroq bo'lishi mumkinki, mingta "===" mingtadan 1 KB og'irroq "==" :) JavaScript profillovchilari sizning holatingizda ishlash farqi bor yoki yo'qligini sizga aytishi mumkin.

Lekin shaxsan men JSLint taklif qilgan narsani qilaman. Ushbu tavsiya ishlash bilan bog'liq muammolar tufayli emas, balki majburlash turi ('\t\r\n' == 0) to'g'ri ekanligini anglatadi.

person Constantin    schedule 16.12.2008

Teng taqqoslash operatori == chalkash va undan qochish kerak.

Agar siz u bilan yashashniSHAROR bo'lsangiz quyidagi 3 narsani yodda tuting:

  1. U tranzitiv emas: (a == b) va (b == c) (a == c)ga olib kelmaydi. em>
  2. Bu inkor qilish uchun bir-birini istisno qiladi: (a == b) va (a != b) har doim qarama-qarshi mantiqiy qiymatlarga ega, barcha a va b.< /strong>
  3. Shubha tug'ilsa, quyidagi haqiqat jadvalini yoddan bilib oling:

JAVASCRIPTDA TENG OPPERATOR HAQIQAT JADVALI

  • Jadvaldagi har bir satr 3 ta o'zaro "teng" qiymatlar to'plamidir, ya'ni ular orasidagi istalgan 2 qiymat teng == belgisi yordamida teng bo'ladi*

** G'alati: birinchi ustundagi har qanday ikkita qiymat bu ma'noda teng emasligiga e'tibor bering.**

''       == 0 == false   // Any two values among these 3 ones are equal with the == operator
'0'      == 0 == false   // Also a set of 3 equal values, note that only 0 and false are repeated
'\t'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\r'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\n'     == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
'\t\r\n' == 0 == false   // -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

null == undefined  // These two "default" values are not-equal to any of the listed values above
NaN                // NaN is not equal to any thing, even to itself.
person CuongHuyTo    schedule 16.09.2011

Foydalanishingizda ikkita operatsiya o'rtasida unumdorlik farqi bo'lishi dargumon. Har ikkala parametr ham bir xil turdagi bo'lgani uchun hech qanday turdagi konvertatsiya qilinmaydi. Har ikkala operatsiyada ham turdagi taqqoslash, so'ngra qiymat solishtirish bo'ladi.

person Sean    schedule 11.12.2008

Ha! Bu muhim.

Javascriptdagi === operatori qiymat bilan bir qatorda turni ham tekshiradi bunda == operatori shunchaki qiymatni tekshiradi (agar kerak bo'lsa, turdagi konvertatsiya qiladi).

rasm tavsifini shu yerga kiriting

Siz uni osongina sinab ko'rishingiz mumkin. Quyidagi kodni HTML faylga joylashtiring va uni brauzerda oching

<script>

function onPageLoad()
{
    var x = "5";
    var y = 5;
    alert(x === 5);
};

</script>

</head>

<body onload='onPageLoad();'>

Siz “false” xabarini olasiz. Endi onPageLoad() usulini alert(x == 5); ga o'zgartiring, siz to'g'riga erishasiz.

person Aniket Thakur    schedule 14.11.2014

=== operatori qiymatlarni hamda oʻzgaruvchilar turlarini tenglik uchun tekshiradi.

== operatori faqat o'zgaruvchilar qiymatini tenglik uchun tekshiradi.

person Niraj CHoubey    schedule 12.05.2010

Oddiygina

== operandlar oʻrtasidagi qiyoslashni bildiradi.

va

=== operandlar oʻrtasidagi qiyoslashni bildiradi.

JavaScript-da yozishni majburlash ma'lumotlar turlarini boshqa ma'lumotlar turlariga avtomatik ravishda aylantirishni anglatadi.

Masalan:

123 == "123"  // Returns true, because JS coerces string "123" to number 123
              // and then goes on to compare `123 == 123`.

123 === "123" // Returns false, because JS does not coerce values of different types here.
person Amit    schedule 20.03.2015

Bu qattiq tekshiruv sinovi.

Bu yaxshi narsa, ayniqsa siz 0 va noto'g'ri va null o'rtasida tekshirayotgan bo'lsangiz.

Masalan, agar sizda:

$a = 0;

Keyin:

$a==0; 
$a==NULL;
$a==false;

Hammasi rostni qaytaradi va siz buni xohlamasligingiz mumkin. Faraz qilaylik, sizda massivning 0-indeksini yoki muvaffaqiyatsizlikka uchraganida false qaytara oladigan funksiya bor. Agar siz "==" false bilan belgilasangiz, chalkash natija olishingiz mumkin.

Shunday qilib, yuqoridagi kabi, lekin qattiq sinov:

$a = 0;

$a===0; // returns true
$a===NULL; // returns false
$a===false; // returns false
person Daniel    schedule 12.05.2010
comment
JavaScript-da bu mutlaqo noto'g'ri va noto'g'ri to'liq emas. 0 != null. -1 - person Ry-♦; 06.05.2013

JSLint ba'zan sizga narsalarni o'zgartirish uchun haqiqiy bo'lmagan sabablarni beradi. Agar turlar allaqachon bir xil bo'lsa, === == bilan bir xil ishlashga ega.

U faqat turlar bir xil bo'lmaganda tezroq bo'ladi, bu holda u turlarni aylantirishga urinmaydi, balki to'g'ridan-to'g'ri yolg'onni qaytaradi.

Shunday qilib, IMHO, JSLint yangi kod yozish uchun ishlatilishi mumkin, ammo foydasiz ortiqcha optimallashtirishdan har qanday holatda ham qochish kerak.

Ya'ni, a faqat String bo'lishi mumkinligini bilsangiz, if (a == 'test') kabi chekda == ni === ga o'zgartirish uchun hech qanday sabab yo'q.

Ko'pgina kodlarni o'zgartirish ishlab chiquvchilar va sharhlovchilarning vaqtini behuda sarflaydi va hech narsaga erishmaydi.

person ashes    schedule 05.06.2012
comment
Qizig'i shundaki, a.length===4 aslida Firefox'da a.length==4ga qaraganda sekinroq. Bu, baribir, mikro-optimallashtirish, lekin bu odamlar da'vo qilgan narsaga ziddir. - person aross; 25.03.2021

Qoida tariqasida, men odatda == o'rniga === dan foydalanardim (va != o'rniga !==).

Sabablari yuqoridagi javoblarda tushuntirilgan va Duglas Krokford bu haqda juda aniq (JavaScript: Yaxshi qismlar).

Biroq, bitta istisno bor: == null "nol yoki aniqlanmagan" ni tekshirishning samarali usulidir:

if( value == null ){
    // value is either null or undefined
}

Masalan, jQuery 1.9.1 bu naqshni 43 marta ishlatadi va JSHint sintaksis tekshiruvi hattoki Shuning uchun eqnull tasalli beruvchi variant.

jQuery uslubi bo‘yicha qo‘llanma dan:

Qattiq tenglikni tekshirish (===) == foydasiga qo'llanilishi kerak. Faqatgina istisno - bu noaniq va nullni null orqali tekshirish.

// Check for both undefined and null values, for some important reason. 
undefOrNull == null;

Tahrirlash 2021-03:

Hozirgi kunda ko'pchilik brauzerlar Nullish birlashtiruvchi operator (??) va Mantiqiy nullish belgilash (??=), agar oʻzgaruvchi null yoki aniqlanmagan boʻlsa, standart qiymatni belgilashning yanada ixcham usulini beradi. misol:

if (a.speed == null) {
  // Set default if null or undefined
  a.speed = 42;
}

ushbu shakllarning istalgani sifatida yozilishi mumkin

a.speed ??= 42;
a.speed ?? a.speed = 42;
a.speed = a.speed ?? 42;
person mar10    schedule 27.04.2013
comment
== null - '2_ yoki undefined' ekanligini tekshirishning samarali usuli”yoki document.all. - person Sebastian Simon; 15.03.2021

Oddiy misol

2 == '2'  -> true, values are SAME because of type conversion.

2 === '2'  -> false, values are NOT SAME because of no type conversion.
person Vikas    schedule 14.05.2015

Yuqoridagi ikkita javob == tenglikni va === o'ziga xoslikni bildiradi. Afsuski, bu bayonot noto'g'ri.

Agar == ning ikkala operandlari ham ob'ektlar bo'lsa, ular bir xil ob'ekt yoki yo'qligini tekshirish uchun solishtiriladi. Agar ikkala operand bir xil ob'ektga ishora qilsa, u holda teng operator rostni qaytaradi. Aks holda, ikkalasi teng emas.

var a = [1, 2, 3];  
var b = [1, 2, 3];  
console.log(a == b)  // false  
console.log(a === b) // false  

Yuqoridagi kodda == va === ikkalasi ham noto'g'ri bo'ladi, chunki a va b bir xil ob'ektlar emas.

Ya'ni: agar == ning ikkala operandlari ham ob'ektlar bo'lsa, == o'zini === bilan bir xil qiladi, bu ham identifikatsiyani anglatadi. Ushbu ikki operatorning asosiy farqi turni o'zgartirish bilan bog'liq. == tenglikni tekshirishdan oldin konvertatsiyaga ega, lekin === yo'q.

person Harry He    schedule 09.09.2013

Muammo shundaki, siz osongina muammoga duch kelishingiz mumkin, chunki JavaScript juda ko'p yashirin konversiyalarga ega ...

var x = 0;
var isTrue = x == null;
var isFalse = x === null;

Tez orada muammoga aylanadi. Yashirin konvertatsiya nima uchun "yomon" ekanligining eng yaxshi namunasini MFC / C++ da ushbu koddan olish mumkin. CString-dan HANDLE-ga ko'rsatgich turi bo'lgan aniq konvertatsiya tufayli aslida kompilyatsiya qilinadi...

CString x;
delete x;

Bu aniq ish vaqtida juda aniqlanmagan narsalarni qiladi...

Google C++ va STL va unga qarshi ba'zi dalillarni olish uchun yashirin konvertatsiya qilish uchun...

person Thomas Hansen    schedule 29.12.2008
comment
0 == null noto'g'ri. - person Garrett; 13.01.2014

asosiy javascript ma'lumotnomasidan

=== Operandlar mutlaqo teng bo'lsa (yuqoriga qarang) true ni qaytaradi, hech qanday turdagi konversiyasiz.

person Paul Butcher    schedule 12.05.2010

Tenglikni taqqoslash:

Operator ==

Har ikkala operand teng bo'lsa, true qiymatini qaytaradi. Operandlar solishtirishdan oldin bir xil turga aylantiriladi.

>>> 1 == 1
true
>>> 1 == 2
false
>>> 1 == '1'
true

Tenglik va turlarni taqqoslash:

Operator ===

Ikkala operand teng va bir xil turdagi bo'lsa, true qiymatini qaytaradi. Agar shu tarzda solishtirsangiz, bu odatda yaxshiroq va xavfsizroq bo'ladi, chunki parda ortidagi turdagi konvertatsiyalar mavjud emas.

>>> 1 === '1'
false
>>> 1 === 1
true
person user2601995    schedule 02.10.2013

Bu erda sodir bo'ladigan konvertatsiyalar va == va === orasidagi farqlarni ko'rsatadigan qulay taqqoslash jadvali.

Xulosada aytilganidek:

"Ikki tenglik uchun sodir bo'ladigan konvertatsiyalarni to'liq tushunmaguningizcha uchta tengdan foydalaning."

http://dorey.github.io/JavaScript-Equality-Table/

person Christian Hagelid    schedule 27.03.2014

null va noaniq hechlikdir, ya'ni

var a;
var b = null;

Bu erda a va b qiymatlari yo'q. Holbuki, 0, false va '' barcha qiymatlardir. Bularning barchasi o'rtasida umumiy narsa shundaki, ularning barchasi yolg'on qiymatlardir, ya'ni ularning barchasi soxta shartlarniqoniqardini bildiradi.

Shunday qilib, 0, yolg'on va '' birgalikda kichik guruhni tashkil qiladi. Boshqa tomondan, null va undefined ikkinchi kichik guruhni tashkil qiladi. Quyidagi rasmdagi taqqoslashlarni tekshiring. null va undefined teng bo'ladi. Qolgan uchtasi bir-biriga teng bo'ladi. Biroq, ularning barchasi JavaScript-da noto'g'ri shartlar sifatida ko'rib chiqiladi.

Rasm tavsifini shu yerga kiriting

Bu har qanday ob'ekt bilan bir xil (masalan, {}, massivlar va h.k.), bo'sh bo'lmagan satr va mantiqiy to'g'ri - barchasi haqiqat shartlari. Biroq, ularning barchasi teng emas.

person Community    schedule 14.04.2014

*Operatorlar === vs == *

1 == true    =>    true
true == true    =>    true
1 === true    =>    false
true === true    =>    true
person Mr.G    schedule 19.03.2014

JavaScript qat'iy va turni o'zgartiruvchi taqqoslashlarga ega. Qattiq taqqoslash (masalan, ===) operandlar bir xil turdagi bo'lsagina to'g'ri bo'ladi. Ko'proq qo'llaniladigan mavhum taqqoslash (masalan, ==) taqqoslashdan oldin operandlarni bir xil turga aylantiradi.

  • Tenglik (==) operatori, agar ular bir xil turdagi bo'lmasa, operandlarni o'zgartiradi, keyin qat'iy taqqoslashni qo'llaydi. Agar operandlardan biri raqam yoki mantiqiy bo'lsa, operandlar iloji bo'lsa raqamlarga aylantiriladi; Aks holda, agar operandlardan biri satr bo'lsa, agar iloji bo'lsa, satr operandi raqamga aylantiriladi. Agar ikkala operand ham ob'ekt bo'lsa, JavaScript operandlar xotirada bir xil ob'ektga murojaat qilganda teng bo'lgan ichki havolalarni solishtiradi.

    Sintaksis:

    x == y

    Misollar:

    3 == 3     // true
    "3" == 3   // true
    3 == '3'   // true
    
  • Identity/qat'iy tenglik(===) operatori operandlar qat'iy teng bo'lsa (yuqoriga qarang), hech qanday turdagi konvertatsiya qilinmasa, rostni qaytaradi.

    Sintaksis:

    x === y

    Misollar:

    3 === 3 // true

Malumot uchun: Taqqoslash operatorlari< /em> (Mozilla Developer Network)

person garakchy    schedule 08.08.2014

Agar siz veb-ilova yoki himoyalangan sahifa yaratayotgan bo'lsangiz, har doim foydalanishingiz kerak (faqat iloji bo'lsa)

===

chunki u bir xil tarkib yoki yo'qligini tekshiradi!

shuning uchun kimdir kirsa:

var check = 1;
if(check == '1') {
    //someone continued with a string instead of number, most of the time useless for your webapp, most of the time entered by a user who does not now what he is doing (this will sometimes let your app crash), or even worse it is a hacker searching for weaknesses in your webapp!
}

lekin bilan

var check = 1;
if(check === 1) {
    //some continued with a number (no string) for your script
} else {
    alert('please enter a real number');
}

xaker hech qachon xatolarni topish va ilovangizni yoki foydalanuvchilaringizni buzish uchun tizimga chuqurroq kirmaydi

Mening fikrim shuki, bu

===

skriptlaringizga xavfsizlikni oshiradi

Albatta, siz kiritilgan raqamning haqiqiyligini, satr ekanligini va hokazolarni tekshirishingiz mumkin. Birinchi misol ichidagi boshqa if iboralari bilan, lekin buni hech bo'lmaganda men uchun tushunish va ishlatish osonroq.

Buni yozishimga sabab, bu suhbatda hech qachon “xavfsizroq” yoki “xavfsizlik” so‘zi aytilmagan (agar siz iCloud.com saytiga qarasangiz, u 2019 marta === va 1308 marta == ishlatadi, bu sizning ba'zan === o'rniga == dan foydalaning, chunki u aks holda sizning funktsiyangizni bloklaydi, lekin boshida aytib o'tilganidek, iloji boricha === dan foydalanishingiz kerak)

person Sake Salverda    schedule 28.11.2014

Sinovni o'tkazish uchun emacs org-mode va node.js dan foydalangan holda mening fikrlash jarayonim.

| use ==     | '' | '0' | false | 'false' | undefined | null | ' \t\r\n ' |
| ''         | x  | f   | t     | f       | f         | f    | f          |
| '0'        |    | x   | t     | f       | f         | f    | f          |
| false      |    |     | x     | f       | f         | f    | t          |
| 'false'    |    |     |       | x       | f         | f    | f          |
| undefined  |    |     |       |         | x         | t    | f          |
| null       |    |     |       |         |           | x    | f          |
| ' \t\r\n ' |    |     |       |         |           |      | x          | 



| use ===    | '' | '0' | false | 'false' | undefined | null | ' \t\r\n ' |
| ''         | x  | f   | f     | f       | f         | f    | f          |
| '0'        |    | x   | f     | f       | f         | f    | f          |
| false      |    |     | x     | f       | f         | f    | f          |
| 'false'    |    |     |       | x       | f         | f    | f          |
| undefined  |    |     |       |         | x         | f    | f          |
| null       |    |     |       |         |           | x    | f          |
| ' \t\r\n ' |    |     |       |         |           |      | x          |

Quyidagi test skriptim: ishga tushirish > tugun xxx.js

var rowItems = ['', '0', false, 'false', undefined, null, ' \t\r\n ']
var colItems = rowItems

for(var i = 0; i < rowItems.length; i++) {
    for (var j = 0; j < colItems.length; j++) {
        var r = (rowItems[i] === colItems[j]) ? true : false;
        console.log(rowItems[i] + " = " + colItems[j] + " " + r + " [" + i + "] ==> [" + j + "]")
    };
}
person CodeFarmer    schedule 06.08.2015

=== ob'ektlar bir xil bo'lsa, g'amxo'rlik qiladi. Shuning uchun, new String("Hello world") === "Hello world" false qaytaradi. Biroq, == ob'ektlarning bir xil ekanligiga ahamiyat bermaydi; u shunchaki bitta argumentni boshqasining turiga aylantiradi: agar konvertatsiya qilishning iloji bo'lmasa, false ni qaytaring. Keyin new String("Hello world") == "Hello world" false o'rniga rostni qaytaradi.

person Community    schedule 29.03.2015
comment
Bu javob biroz noto'g'ri, yoki, hech bo'lmaganda, unchalik aniq emas ... "ob'ektlar"? Siz "turlar" ni nazarda tutyapsizmi? == turlari bir xil bo'lsa, bo'ladi; agar ular bo'lsa, qat'iy tenglikni solishtirishni topshiradi. Ikki ob'ekt mos yozuvlar bo'yicha taqqoslanadi, lekin bu ikkala operator uchun ham shunday. “agar konvertatsiya qilish mumkin bo'lmasa” — Menimcha… lekin majburlash odatda mumkin va bu solishtirishning u yoki bu natijasini keltirib chiqarish uchun etarli emas, masalan. "undefined" != undefined, garchi majburlash mumkin bo'lsa ham. - person Sebastian Simon; 15.03.2021

Javascript zaif terilgan tildir, ya'ni C,c++ da bo'lgani kabi hech qanday ma'lumotlar turiga ega emas. int, mantiqiy, float va boshqalar. Shunday qilib, o'zgaruvchi har qanday turdagi qiymatni ushlab turishi mumkin, shuning uchun bu maxsus taqqoslash operatorlari mavjud

Eg

var i = 20;var j = "20";

Agar taqqoslash operatorlarini qo'llasak, bu o'zgaruvchilar natija bo'ladi

i==j //result is true

or

j != i//result is false

Buning uchun bizga o'zgaruvchiningqiymati va ma'lumotlar turini tekshiradigan maxsus taqqoslash operatorlari kerak.

if we do

i===j //result is false
person Akshay Khale    schedule 22.07.2015

=, = =, = = = orasidagi farq

  • = operatori value ni belgilash uchun ishlatiladi.
  • = = operatori datatype emas values ni solishtirish uchun ishlatiladi
  • = = = operatori values va datatype raqamlarini solishtirish uchun ishlatiladi.
person RïshïKêsh Kümar    schedule 25.06.2017

== operatori faqat ma'lumotlar turini emas, balki qiymatlarni solishtiradi.

=== operatori qiymatlarni ma'lumotlar turini solishtirish bilan solishtiradi.

eg :

1 == "1" //true

1 === "1" //false

Bu operator ("===") avtomatik translatsiyani amalga oshiradigan tillarda ishlatiladi, masalan. PHP, Javascript.
"===" operatori avtomatik yozish natijasida yuzaga keladigan kutilmagan taqqoslashlarning oldini olishga yordam beradi.

person Sharad Kale    schedule 28.04.2017
comment
'==' uchun ma'lumotlar turi muhim emas - person mrmr68; 25.05.2017
comment
@mrmr68 Mavhum tenglikni taqqoslash operandlarining turi judamuhim — operandlarni solishtirish uchun boshqa turlarga majburlash uchun ishlatiladi. - person Sebastian Simon; 22.05.2020

har doim '==='dan foydalaning va siz minglab xatolardan qochasiz. Hozirgi vaqtda uchlik tenglikdan foydalanish turli uslublar qo'llanmalari tomonidan ko'proq afzalroq, chunki u operandlar turini hisobga olgan holda taqqoslanadi.

person Alexandr    schedule 01.07.2016

Ha, tenglik == va identifikatsiya === operatorlari o'rtasida katta farq bor.
Odatda identifikatsiya operatori tezroq ishlaydi, chunki hech qanday turdagi konvertatsiya qilinmaydi. Ammo qiymatlar bir xil bo'lsa, siz hech qanday farqni ko'rmaysiz.
Mening postimni tekshiring JavaScript tenglik operatori afsonasi, unda ko'plab misollar bilan ma'lumotlarni, jumladan turlarni o'zgartirish va taqqoslash algoritmlarini tushuntiradi.

person Dmitri Pavlutin    schedule 04.01.2016

Bitta === dan foydalanish uchun eslatilmagan sabab - siz coffee-script ga/dan oʻzaro kompilyatsiya bilan birga boʻlganingizda. CoffeeScript haqida kichik kitobdan...

JavaScript-dagi zaif tenglikni taqqoslash ba'zi chalkash xatti-harakatlarga ega va ko'pincha chalkash xatolarning manbai hisoblanadi.

Buning o'rniga uchta teng belgidan iborat qat'iy tenglik operatoridan foydalanish kerak: ===. Bu oddiy tenglik operatori kabi ishlaydi, lekin hech qanday majburlashsiz. Har doim qat'iy tenglik operatoridan foydalanish va kerak bo'lganda turlarni aniq konvertatsiya qilish tavsiya etiladi.

Agar siz muntazam ravishda coffee-script ga va undan o'tayotgan bo'lsangiz, shunchaki === dan foydalaning. Aslida, coffee-script kompilyatori sizni majburlaydi...

CoffeeScript buni barcha zaif taqqoslashlarni qat'iy taqqoslashlar bilan almashtirish orqali hal qiladi, boshqacha qilib aytganda, barcha == taqqoslashlarini === ga aylantiradi. CoffeeScript-da zaif tenglikni taqqoslash mumkin emas va agar kerak bo'lsa, ularni solishtirishdan oldin turlarni aniq o'zgartirishingiz kerak.

person Alex Gray    schedule 15.05.2016

Qattiq tenglik ko'p jihatdan yaxshiroqdir

Javascript bo'shashmasdan yozilgan til ekanligi, u bilan ishlayotganingizda doimo sizning fikringiz oldida bo'lishi kerak. Ma'lumotlar strukturasi bir xil bo'lsa, qat'iy tenglikdan foydalanmaslik uchun hech qanday sabab yo'q, muntazam tenglik bilan siz ko'pincha avtomatik ravishda sodir bo'ladigan qiymatlarni bilvosita o'zgartirasiz, bu sizning kodingizga keng qamrovli ta'sir ko'rsatishi mumkin. Ushbu konvertatsiya bilan bog'liq muammolarga duch kelish juda oson, chunki ular avtomatik ravishda sodir bo'ladi.

Qattiq tenglik bilan avtomatik yashirin konvertatsiya bo'lmaydi, chunki qiymatlar allaqachon to'g'ri ma'lumotlar tuzilishiga ega bo'lishi kerak.

person Neil Meyer    schedule 16.11.2017

Javascript xuddi PHP kabi erkin terilgan,

var x = "20";
var y =20;

if (x===y) // false

Bu sizga har doim noto'g'ri ma'lumot beradi, chunki o'zgaruvchilarning qiymatlari bir xil bo'lsa ham, ma'lumotlar turlari bir xil emas.

Biri string, ikkinchisi int

If(x==y)//true

Biroq, bu faqat ma'lumotlar turlaridan qat'i nazar, tarkibning bir xilligini tekshiradi ...

Men qiymatlarni teng deb aytmoqchi emasman, chunki string qiymati mantiqiy ravishda int qiymatiga teng bo'lishi mumkin emas

person yanguya995    schedule 01.07.2016

Birinchidan, Javascript satriga oid ba'zi terminologiya tengdir: Double equals rasman mavhum tenglikni taqqoslash operatori sifatida tanilgan, uch barobar esa qat'iy tenglikni taqqoslash operatori deb ataladi. Ularning orasidagi farqni quyidagicha umumlashtirish mumkin: Abstrakt tenglik taqqoslashdan oldin ma'lumotlar turlarini majburlash orqali hal qilishga harakat qiladi. Turlar boshqacha bo'lsa, qat'iy tenglik false qaytaradi. Quyidagi misolni ko'rib chiqing:

console.log(3 == "3"); // true
console.log(3 === "3"); // false.
console.log(3 == "3"); // true
console.log(3 === "3"); // false.

Ikkita teng belgidan foydalanish haqiqatni qaytaradi, chunki taqqoslashdan oldin “3” qatori 3 raqamiga aylantiriladi. Uchta teng belgi turlarning har xil ekanligini ko'radi va yolg'onni qaytaradi. Mana boshqasi:

console.log(true == '1'); // true
console.log(true === '1'); // false
console.log(true == '1'); // true
console.log(true === '1'); // false

Shunga qaramay, mavhum tenglikni taqqoslash turdagi konvertatsiyani amalga oshiradi. Bu holda mantiqiy to'g'ri va "1" qatori 1 raqamiga aylantiriladi va natija haqiqatdir. Qattiq tenglik yolg'onni qaytaradi.

Agar siz == va === ni farqlash yo'lida ekanligingizni tushunsangiz. Biroq, ushbu operatorlarning xatti-harakatlari intuitiv bo'lmagan ba'zi stsenariylar mavjud. Keling, yana bir nechta misollarni ko'rib chiqaylik:

console.log(undefined == null); // true
console.log(undefined === null); // false. Undefined and null are distinct types and are not interchangeable.
console.log(undefined == null); // true     
console.log(undefined === null); // false. Undefined and null are distinct types and are not interchangeable.

console.log(true == 'true'); // false. A string will not be converted to a boolean and vice versa.
console.log(true === 'true'); // false
console.log(true == 'true'); // false. A string will not be converted to a boolean and vice versa.
console.log(true === 'true'); // false

Quyidagi misol qiziqarli, chunki u satr literallari satr ob'ektlaridan farq qiladi.

console.log("This is a string." == new String("This is a string.")); // true
console.log("This is a string." === new String("This is a string.")); // false
console.log("This is a string." == new String("This is a string.")); // true
console.log("This is a string." === new String("This is a string.")); // false
person Rotimi    schedule 24.04.2017

== ni === bilan almashtirishni taklif qilishining sababi shundaki, === operatori == ga qaraganda ishonchliroq. Bizning kontekstimizda ishonchli vositalar === turini tekshirish uchun ham qo'llaniladi. Eng yaxshi dasturlash amaliyotlarini hisobga olgan holda, biz har doim kamroq ishonchli xususiyatdan ko'ra ishonchli xususiyatni tanlashimiz kerak. Ko'pincha operatorga to'liq tenglik haqida o'ylaganimizda, biz sukut bo'yicha tur bir xil bo'lishi kerak deb hisoblaymiz. === xuddi shunday ta'minlaganidek, biz bunga borishimiz kerak.

person Narendra Kalekar    schedule 01.08.2017

“JavaScript solishtirishda == yoki === dan foydalanishim kerakmi” dilemmasi quyidagi savolga teng yoki oʻxshash: “Ovqatlanish uchun“ qoshiq” yoki “vilka” dan foydalanishim kerakmi?

Bu savolga yagona mantiqiy javob shu

  1. Taqqoslash uchun boʻsh tur uchun Dinamik tur solishtirishdan foydalaning, masalan:==.
  2. Taqqoslash uchun kuchli tur uchun Statik tur solishtirishdan foydalaning, masalan:===.

Buning sababi, ular bir xil emas. Ular bir xil maqsadga ega emas va bir xil maqsadda foydalanish uchun mo'ljallanmagan.

Albatta, "vilkalar" ham, "qoshiqlar" ham "ovqatlanish" uchun mo'ljallangan, ammo siz ularni nima iste'mol qilganingizga qarab ishlatishni tanlaysiz.

Ma'nosi: siz "qoshiq" dan foydalanishga qaror qilasiz, ya'ni: "sho'rva" ichish uchun == va / yoki "vilkalar", ya'ni: === terish uchun.

"Ovqatlanish" uchun "vilka" yoki "qoshiq" dan foydalanish yaxshiroqmi degan savol - dinamik [==] va dinamik [==] tenglamasidan foydalanish yaxshiroqmi degan savolga tengdir. JSda. Ikkala savol ham bir xil darajada noto'g'ri va ko'rib chiqilayotgan mavzuni juda tor yoki sayoz tushunishni aks ettiradi.

person Bekim Bacaj    schedule 26.11.2017
comment
p.s.: JSLint (yoki Crockford) bir xil turdagi qiymatlar bilan ishlashda qat'iy turdagi taqqoslashdan foydalanishni talab qilish yoki talab qilish noto'g'ri. JavaScript length xususiyati har doim shunday turdagi: raqam. Va shuning uchun soxta pozitivlar uchun joy yoki imkoniyat yo'q. Bundan tashqari, uning o'rniga !dSele_UNVEHtype.value.length ning to'g'ridan-to'g'ri qisqartmasidan foydalanish mumkin bo'lsa, dSele_UNVEHtype.value.length === 0 ga hojat yo'q. - person Bekim Bacaj; 06.12.2017
comment
Nega 9 yoshli savolga javob berasiz, u allaqachon 49 ta javobga ega, shuningdek, 5 mingdan ortiq ijobiy ovoz bilan qabul qilingan javob, g'alati o'xshatishni o'z ichiga olgan va hali aytilmagan narsalarni tushuntirmaydigan javob bilan? - person Jasper; 22.12.2017
comment
Chunki JavaScript-ni yoshi qancha bo'lishidan qat'i nazar, professional tarzda noto'g'ri ishlatish holatlari ko'p. Va siz, masalan, bu nima ekanligini tushuna olmadingiz va Live Script-ning statik turdagi tillardan farqli o'laroq farqining mohiyatini tushuna olmadingiz. Va nima uchun bizga uning aqlli dinamikasi kerak. JavaScript ahmoqlar uchun emas, ijodiy aqlli odamlar uchun yaratilgan. - person Bekim Bacaj; 26.12.2017
comment
Ha, men JavaScript-dan noto'g'ri foydalanish holatlariga qo'shilaman. Shunga qaramay, men sizning o'xshashligingizni g'alati deb o'ylayman, chunki uni osongina noto'g'ri tushunish mumkin va u asosiy asoslarni mazmunli tarzda qamrab olmaydi. - person Jasper; 27.12.2017
comment
Berilgan o'xshashlik ularning farqi va foydalanish sifatining eng yaxshi namunasidir. Bu JSga to'liq yangi kelgan bo'lsangiz ham, mutlaq mohiyatni o'rganish uchun eng yaxshi qisqa insho. Va bir xil darajada yaxshi, ehtimol JS massivini [haqiqiy] bo'shatish haqidagi kech javobimdan yaxshiroq. - person Bekim Bacaj; 28.12.2017

Agar JavaScript-da bir nechta narsani solishtirmoqchi boʻlsangiz, === dan foydalaning, bu qat'iy tenglik deb ataladi, demak, agar faqat tur va qiymat bir xil boʻlsa bu rost boʻladi. Agar siz == dan foydalansangiz, siz asosan turga ahamiyat bermaysiz va ko'p hollarda bo'sh tenglikni taqqoslash bilan bog'liq muammolarga duch kelishingiz mumkin.

=== yordamida qat'iy tenglik

Qattiq tenglik tenglik uchun ikkita qiymatni taqqoslaydi. Hech bir qiymat solishtirishdan oldin bilvosita boshqa qiymatga aylantirilmaydi. Agar qiymatlar turli xil bo'lsa, qiymatlar teng emas deb hisoblanadi. Aks holda, agar qiymatlar bir xil turdagi bo'lsa va raqamlar bo'lmasa, ular bir xil qiymatga ega bo'lsa, ular teng hisoblanadi. Va nihoyat, agar ikkala qiymat ham raqamlar bo'lsa, ikkalasi ham NaN bo'lmasa va bir xil qiymatga ega bo'lsa yoki biri +0 va biri -0 bo'lsa, ular teng hisoblanadi.

var num = 0;
var obj = new String('0');
var str = '0';

console.log(num === num); // true
console.log(obj === obj); // true
console.log(str === str); // true

console.log(num === obj); // false
console.log(num === str); // false
console.log(obj === str); // false
console.log(null === undefined); // false
console.log(obj === null); // false
console.log(obj === undefined); // false


Bo'sh tenglik == yordamida

Bo'sh tenglik ikkala qiymatni umumiy turga aylantirgandan so'ng, tenglik uchun ikkita qiymatni taqqoslaydi. Konvertatsiyadan so'ng (bir yoki ikkala tomon ham konversiyadan o'tishi mumkin), yakuniy tenglikni taqqoslash xuddi === bajargandek amalga oshiriladi. Bo'sh tenglik simmetrikdir: A == B har doim A va B ning har qanday qiymatlari uchun B == A ga bir xil semantikaga ega (qo'llaniladigan konvertatsiya qilish tartibidan tashqari).

var num = 0;
var obj = new String('0');
var str = '0';

console.log(num == num); // true
console.log(obj == obj); // true
console.log(str == str); // true

console.log(num == obj); // true
console.log(num == str); // true
console.log(obj == str); // true
console.log(null == undefined); // true

// both false, except in rare cases
console.log(obj == null);
console.log(obj == undefined);
person Alireza    schedule 07.05.2017
comment
Men nima qilmasligingiz kerakligi haqida sub'ektiv va kimgadir har doim ma'lum bir harakatdan foydalanishni aytish noto'g'ri ekanligiga ishonaman. Ko'p hollarda "===" va "==" dan foydalanishga rozi bo'lsam-da, siz turdagi konvertatsiya qilishni xohlayotganingizda alohida holat bo'lishi mumkin. - Mening boshimdan aniq foydalanish holati haqida o'ylay olmayman, lekin dizayn bo'sh chekka ega bo'lishi mumkin. Nima bo'lishidan qat'iy nazar, agar biror narsa tilga kiritilgan bo'lsa, buning sababi bor. Menimcha, biz "har doim x ni bajaring" degan qo'pol so'zlardan qochishga harakat qilishimiz kerak. - person SeanRamzan; 18.05.2017
comment
Men sizning fikringizga qo'shilaman, agar siz mening to'liq javobimni o'qib chiqsangiz, men keyinroq batafsilroq tushuntirib beraman, rostini aytsam, Javascript-da biz ishlatadigan holatlar unchalik ko'p emas va ularni taqqoslash kerak... Men 5 foizdan kam deyishim mumkin. , bundan ham kamroq, lekin js foni bo'lmagan, == JavaScript-da qat'iy taqqoslashni tekshiradigan odamlar uchun "har doim" dan foydalanaman, ular ehtiyotkor bo'lishni va birinchi navbatda undan foydalanmaslikni o'rganadilar, lekin ular ko'proq mutaxassis bo'lib, ular qaysi kamdan-kam hollarda foydalanishi mumkinligini biling. Shuning uchun javobimni shunday yozaman. - person Alireza; 18.05.2017

var a = new String("123");
var b = "123";

alert(a === b); // returns false !! (but they are equal and of the same type)

Buni javoblardan birida ko'rgan. Bu holatda a va b bir xil tur emas, agar typeof(a) ni tekshirsangiz, siz 'obyekt'ni olasiz, typeof(b) esa 'string'.

person Orri Scott    schedule 05.07.2016