Заголовок документа
Берілген кестеде, ToNumber(A) салыстыру алдында өз аргументін санға келтіруге тырысады. Мұндай жағдай +A (унарлы оператор +) баламалы. Егер ToPrimitive(A) аргумент ретінде объект алынса, онда оны примитивтіге аудару A талпыныстары. toString және A. valueOf әдістерімен жүргізіледі. Дәстүрлі (және ECMAScript сәйкес), бірде-бір обьект undefined немесе null тең емес. Бірақ көптеген браузерлер белгілі бір класс объектілері (атап айтқанда, document.all объектілерге кез келген парақ) undefined мәнін эмулирлеуге мүмкіндік береді. Теңдік операторы null == A және undefined == A үшін true мәні қайтарады, сонда және тек сонда ғана, обьект undefined мәнін эмулирлегенде. Қалған барлық жағдайларда обьект undefined немесе null –ге тең болуы мүмкін емес. var num = 0; var obj = new String("0"); var str = "0"; var b = false; 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 // оба false, кроме очень редких случаев console.log(obj == null); console.log(obj == undefined); Кейбір қолданушылар әрқашан қатаң теңдік салыстыру операторын салыстыру типтерімен бірге қолдануды жақсы деп санайды. Қатаң теңдік нәтижесін болжау оңай, тіпті салыстыру мағынасында, олардың сәйкес келтіруінсіз ұтыс жылдамдығын алуға болады. Қатаң теңдік === пайдалана отырып Қатаң теңдік екі шаманың теңдігін тексереді, мұнда әрбір шаманың түрі салыстыру алдында өзгермейді. Егер мәні ажыратылатын түрлерді қабылдаса, онда олар тең болмайды. Екінші жағынан, барлық сандық айнымалы, тиесілі бір түр болып саналады, егер құрамында бірдей шамалар бір-бірімен тең болса. Сандық айнымалылар тең болып есептеледі, егер олар бірдей мағыналы болады, біреуі 0, ал екіншісі -0болса. Егер ең болмағанда сандық айнымалының біреуінің құрамында мәні NaN болса, өрнек false- ны қайтарады. var num = 0; var obj = new String("0"); var str = "0"; var b = false; 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 Іс-жүзінде әрқашан салыстыру үшін қатаң теңдік операторын пайдалану керек. Барлық мәндерін үшін, сандықты қоспағанда айқын семантика пайдаланылады: шамасы тек өз-өзіне тең. Жоғарыда айтылғандай сандық типтері үшін екі ерекше жағдайды бөлуге болады. Біріншіден, салыстыру +0 және -0. Нөл үшін белгісі кейбір есептеулерді жеңілдету үшін құбылмалы үтірден бастап, алайда, математика тұрғысынан, +0 және -0 арасында айырмасы жоқ, сондықтан, қатаң теңдік оператор оларды тең деп санайды. Екіншіден, NaN шамаларды салыстыру. NaN (Not a number) белгілі бір шама мәні болып табылмайды, ол нақты белгілі бір математикалық тапсырмалар үшін қолданылмайды (мысалы ∞ -∞). NaN қатаң теңдік оператор үшін бірде- бір шама тең болмайды, оның ішінде өз-өзіне (жалғыз болған жағдайда (х!==x) true болады). Бірдей шамалар теңдігіБірдей шамалар теңдігі барлық контексттер салыстырылатын шамаларда функционалдық ұқсастықты анықтайды. (Бұл тәсіл салыстыру принципіне негізделеді). Мысал, өзгертудің өзгертілмейтін (immutable) қасиеттері: // Добавление неизменяемого свойства NEGATIVE_ZERO (отрицательный ноль) в конструктор Number. Object.defineProperty(Number, "NEGATIVE_ZERO", { value: -0, writable: false, configurable: false, enumerable: false }); function attemptMutation(v) { Object.defineProperty(Number, "NEGATIVE_ZERO", { value: v }); } Өзгермейтін қасиеттерді өзгерту кезінде, Object.defineProperty шақыруды алып тастау, егер жаңа қасиет ескі өзгерістермен тең болса, өзгерістер болмайды және ерекшелік алып тасталынбайды. Егер v құрамында -0 болса, өзгерістер болмайды, демек, код ерекшеліктерді шығарылмай пысықтайды. Алайда, егер v құрамында +0 болса, Number.NEGATIVE_ZERO өз өзгермейтін шамасын жояды. Дәл салыстыру үшін Object.is әдіспен берілген, жаңа және ағымдағы өзгермейтін қасиеттерін салыстыруда бірдей шамалар пайдаланылады (2- кесте). кесте
Object.is қашан пайдалану керек?Object.is нөлдердің өңдеу ерекшелігі метабағдарламалауда пайдалы болады, қажет болғанда қарама-қарсы мәні қасиеті Object.defineProperty дескриптор арқылы берілсін. Егер сіздің міндеттеріңіз осыларды талап етпесе, онда === артықшылығын беріп Object.is –ті пайдаланудан қалыс қалған жақсы. Тіпті кодыда екі NaN салыстыру қажет болса, әдетте, әр түрлі белгілермен нөлдерді салыстыруға ықпал ететін келесі есептеулер үшін, isNaN қолданыстағы әдісін пайдалану оңай. Операторлар мен әдістер мысалдары, -0 жән +0 арасындағы айырмашылықтарды айқын жасай алатын, бұл міндетті түрде сіздің кодыңызға әсер етеді: - (унарлы минус) Унарлы минусты қолдану нөлді -0 береді. Бірақ, кейде, бұл елеусіз білінбей. Мысалы: let stoppingForce = obj.mass * -obj.velocity Егер obj.velocity мәні 0 болса, онда нәтижесі -0 болады, соңғы нәтижесінде stoppingForce айнымалыға оң өзгерістер әсер етеді: Math.atan2 Math.ceil Math.pow Math.round Мүмкіндік бар, егер оны анық параметрлердің бірі жасамасада,бұл әдістер -0 қайтаруы мүмкін.Мысалы, егер Math.pow әдісімен -Infinity кез келген теріс дәрежесіне салу. Деректер әдістерімен танысыңыз. Math.floor Math.max Math.min Math.sin Math.sqrt Math.tan Кейбір жағдайларда нәтижеге қол жеткізуге болады, -0 тең, егер жоғарыда аталған әдістеріне бірі параметрлерді берсе -0. Мысалы, Math.min(-0, 0) -0 қайтарады. ~ << >> Бұл операторлар ToInt32 ішкі алгоритмін пайдаланады. Онда теріс нөлге орын жоқ, сондықтан мәні -0 ұқсас операциялар аман қалмайды. Яғни Object.is(~~(-0), -0), және Object.is(-0 > 2, -0) түпнұсқаны false қайтарып береді. Алынынған мәліметтен, Object.is пайдалану анық,кейде мәселелі болуы мүмкін. Әрине, егер сіз -0 және +0 анық ажырата алатын болсаңыз, онда дәл осы әдіс керек. жүктеу/скачать 465.78 Kb. Достарыңызбен бөлісу: |