Заголовок документа



бет10/26
Дата15.03.2024
өлшемі465.78 Kb.
#495676
1   ...   6   7   8   9   10   11   12   13   ...   26
JAVA SCRIPT-ОБЪЕКТІГЕ БАҒЫТТАЛҒАН СКРИПТІК БАҒДАРЛАМАЛАУ ТІЛІ-оқулық

ОперандB







Undefined

Null

Number

String

Boolean

Object




Undefined

true

true

false

false

false

false




Null

true

true

false

false

false

false






Number

false


false


A === B



A ===
ToNumber (B)

A ===
ToNumber (B)

A ==
ToPrimitive (B)



Операнд A



String

false


false


ToNumber
(A) === B

A === B



ToNumber (A)
===
ToNumber (B)

A ==
ToPrimitive (B)













ToNumber




ToNumber




Boolean

false

false

ToNumber
(A) === B

(A) === ToNumber

A === B

(A) == ToPrimitive
















(B)




(B)






Object

false


false


ToPrimitive
(A) == B

ToPrimitive
(A) == B

ToPrimitive
(A) == ToNumber (B)

A === B



Берілген кестеде, 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- кесте).



    1. кесте

Салыстыру операторларының салыстырмалы кестесі

x

y

==

===

Object.is

undefined

undefined

true

true

true

null

null

true

true

true

true

true

true

true

true

false

false

true

true

true

"foo"

"foo"

true

true

true

{ foo: "bar" }

x

true

true

true

0

0

true

true

true

+0

-0

true

true

false

0

false

true

false

false

""

false

true

false

false

""

0

true

false

false

"0"

0

true

false

false

"17"

17

true

false

false

[1,2]

"1,2"

true

false

false

new String("foo")

"foo"

true

false

false

null

undefined

true

false

false

null

false

false

false

false

undefined

false

false

false

false

{ foo: "bar" }

{ foo: "bar" }

false

false

false

new String("foo")

new String("foo")

false

false

false

0

null

false

false

false

0

NaN

false

false

false

Салыстыру операторларының салыстырмалы кестесі

x

y

==

===

Object.is

"foo"

NaN

false

false

false

NaN

NaN

false

false

true



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 анық ажырата алатын болсаңыз, онда дәл осы әдіс керек.




Достарыңызбен бөлісу:
1   ...   6   7   8   9   10   11   12   13   ...   26




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет