රික්තය
මුළු ලෝකයේම වටිනාකමක් හිස් දැයි ගණනය කරන ශ්රිතයක් නිර්වචනය කිරීමට හෝ භාවිතා කිරීමට උත්සාහ කිරීම මම නිර්දේශ නොකරමි. “හිස්” යන්නෙන් ඇත්තටම අදහස් කරන්නේ කුමක්ද? මා සතුව let human = { name: 'bob', stomach: 'empty' }
ඇත්නම් isEmpty(human)
ආපසු යා true
යුතුද? මා සතුව let reg = new RegExp('');
ඇත්නම් isEmpty(reg)
ආපසු යා true
යුතුද? කුමක් ගැනද isEmpty([ null, null, null, null ])
- මෙම ලැයිස්තුවේ ඇත්තේ හිස් බව පමණි, එබැවින් ලැයිස්තුවම හිස්ද? ජාවාස්ක්රිප්ට් හි “රික්තය” (හිතාමතාම අපැහැදිලි වචනයක්, පෙර පැවති ඇසුරෙන් වැළකී සිටීම) පිළිබඳ සටහන් මෙහි ඉදිරිපත් කිරීමට මට අවශ්යය - ජාවාස්ක්රිප්ට් අගයන්හි “රික්තය” කිසි විටෙකත් සාමාන්යයෙන් නොසැලකිය යුතු යැයි තර්ක කිරීමට මට අවශ්යය.
සත්යය / මුසාවාදය
සාරධර්මවල “රික්තය” තීරණය කරන්නේ කෙසේද යන්න තීරණය කිරීම සඳහා, සාරධර්ම “සත්ය” හෝ “ව්යාජ” ද යන්න පිළිබඳ ජාවාස්ක්රිප්ට්හි ආවේනික, ආවේනික හැඟීම අප විසින් සකස් කළ යුතුය. ස්වාභාවිකවම, null
සහ undefined
දෙකම "ව්යාජ" වේ. ස්වභාවිකවම, අංකය 0
(සහ වෙනත් සංඛ්යාවක් හැර NaN
) ද "ව්යාජ" ය. අවම වශයෙන් ස්වභාවිකව: ''
falsy, නමුත් []
සහ {}
(හා new Set()
, හා new Map()
) truthy ඇත - ඒ සෑම දැත්තක්ම එක හා සමාන අරුත් සුන් පෙනේ වුවත්!
Null vs නිර්වචනය නොකළ
null
එදිරිව එදිරිව යම් සාකච්ඡාවක් ද ඇත undefined
- අපගේ වැඩසටහන් වල රික්තය ප්රකාශ කිරීම සඳහා අපට ඇත්ත වශයෙන්ම දෙකම අවශ්යද? මගේ කේතයේ එම අනුපිළිවෙලෙහි u, n, d, e, f, i, n, e, d අක්ෂර දිස්වීම මම පෞද්ගලිකව වළක්වයි. මම සෑම විටම භාවිතා null
කරන්නේ "රික්තය" යන්නයි. කෙසේ වෙතත්, නැවතත්, ජාවාස්ක්රිප්ට්හි සහජයෙන්ම ඇති ආකාරය null
සහ undefined
වෙනස් වන්නේ කෙසේද යන්න අපට අනුගත විය යුතුය:
- නොපවතින දේපලකට ප්රවේශ වීමට උත්සාහ කිරීම ලබා දෙයි
undefined
- ශ්රිතයක් ඇමතීමේදී පරාමිතියක් බැහැර කිරීමෙන් එම පරාමිතිය ලැබෙනු ඇත
undefined
:
let f = a => a;
console.log(f('hi'));
console.log(f());
- පෙරනිමි අගයන් සහිත පරාමිතීන්ට පෙරනිමිය ලැබෙන්නේ ලබා දුන් විට පමණි
undefined
, නමුත් null
:
let f = (v='hello') => v;
console.log(f(null));
console.log(f(undefined));
ජනක නොවන රික්තය
රික්තය කිසි විටෙකත් සාමාන්ය ආකාරයකින් ගනුදෙනු නොකළ යුතු යැයි මම විශ්වාස කරමි. අපගේ දත්ත හිස්ද යන්න තීරණය කිරීමට පෙර ඒ පිළිබඳ වැඩිදුර තොරතුරු ලබා ගැනීමට අප සෑම විටම දැඩි විය යුතුය - මම ප්රධාන වශයෙන් මෙය කරන්නේ මා ගනුදෙනු කරන්නේ කුමන ආකාරයේ දත්තද යන්න පරීක්ෂා කිරීමෙනි:
let isType = (value, Cls) => {
try {
return Object.getPrototypeOf(value).constructor === Cls;
} catch(err) {
return false;
}
};
මෙම ශ්රිතය බහුමාපකය නොසලකා හරින බව සලකන්න - එය අපේක්ෂා කරන්නේ උප කාණ්ඩයක value
සෘජු අවස්ථාවක් Cls
මිස උප කාණ්ඩයක අවස්ථාවක් නොවේ Cls
. instanceof
ප්රධාන හේතු දෙකක් නිසා මම වැළකී සිටිමි :
([] instanceof Object) === true
("අරාව යනු වස්තුවකි")
('' instanceof String) === false
("නූලක් නූල් නොවේ")
බව සටහන Object.getPrototypeOf
වැනි නඩුව වළක්වා ගැනීමට යොදා let v = { constructor: String };
ඇති isType
තවමත් නිවැරදිව නැවත කාර්යය isType(v, String)
(බොරු), සහ isType(v, Object)
(සත්ය).
සමස්තයක් ලෙස, isType
මෙම ඉඟි සමඟ මෙම ශ්රිතය භාවිතා කිරීමට මම නිර්දේශ කරමි :
- නොදන්නා වර්ගයේ කේත සැකසුම් අගයන් අවම කරන්න. උදා, මන්ද
let v = JSON.parse(someRawValue);
, අපගේ v
විචල්යය දැන් නොදන්නා ආකාරයේ ය. හැකි ඉක්මනින්, අපගේ හැකියාවන් සීමා කළ යුතුය. උදා: මෙය කිරීමට හොඳම ක්රමය යම් ආකාරයක අවශ්ය විසින් විය හැකි if (!isType(v, Array)) throw new Error('Expected Array');
- මේ ලිපිය තුළ වර්ගීය ස්වභාවය ඉවත් කිරීමට ඇත්තටම ඉක්මන් හා ප්රකාශන මාර්ගය v
, සහ එය හැම විටම තියෙන්නේ සහතික Array
. සමහර විට, අපි ඉඩ දිය යුතුයිv
විවිධ වර්ගවල දිය යුතුය. එවැනි අවස්ථාවන්හිදී, v
හැකි ඉක්මණින් ජනක නොවන කේත කොටස් අප විසින් නිර්මාණය කළ යුතුය :
if (isType(v, String)) {
/* v isn't generic in this block - It's a String! */
} else if (isType(v, Number)) {
/* v isn't generic in this block - It's a Number! */
} else if (isType(v, Array)) {
/* v isn't generic in this block - it's an Array! */
} else {
throw new Error('Expected String, Number, or Array');
}
- වලංගු කිරීම සඳහා සෑම විටම "සුදු ලැයිස්තු" භාවිතා කරන්න. ඔබට වටිනාකමක් අවශ්ය නම්, උදා: නූලක්, අංකයක් හෝ අරාවක්, එම “සුදු” හැකියාවන් 3 පරීක්ෂා කර, 3 න් කිසිවක් සෑහීමකට පත් නොවන්නේ නම් දෝෂයක් විසි කරන්න. "කළු" හැකියාවන් පරික්ෂා කිරීම එතරම් ප්රයෝජනවත් නොවන බව අපට දැක ගත හැකිය: අප ලියන බව පවසන්න
if (v === null) throw new Error('Null value rejected');
- null
සාරධර්ම මගින් එය සිදු නොවන බව සහතික කිරීම සඳහා මෙය විශිෂ්ටයි , නමුත් අගයක් නම් එය හරහා ගමන් කරන්නේ නම්, අපි තවමත් දන්නේ නැති තරම්ය ඒ ගැන ඕනෑම දෙයක්. v
මෙම ශුන්ය චෙක්පත පසු කරන අගයක් තවමත් ඉතා සාමාන්යයි - එය අන් කිසිවක් නොවnull
! අසාධු ලේඛකයින් ජනක-නෙස් බැහැර කරන්නේ නැති තරම්ය.
වටිනාකමක් නොමැති නම් null
, කිසි විටෙකත් "රික්ත අගයක්" ලෙස නොසැලකේ. ඒ වෙනුවට, "රික්තයක් සහිත X" සලකා බලන්න. අත්යවශ්යයෙන්ම, කිසි විටෙකත් එවැනි දෙයක් කිරීම ගැන නොසිතන්න if (isEmpty(val)) { /* ... */ }
- එම isEmpty
ක්රියාකාරිත්වය ක්රියාත්මක වුවද (මට දැන ගැනීමට අවශ්ය නැත ...), එය අර්ථවත් නොවේ! එය සාමාන්ය දෙයක්! රික්තය ගණනය කළ යුත්තේ val
වර්ගය පිළිබඳ දැනුමෙන් පමණි . රික්තය-චෙක්පත් මේ ආකාරයෙන් විය යුතුය:
- "අක්ෂර නොමැති නූලක්":
if (isType(val, String) && val.length === 0) ...
- "මුක්කු 0 ක් සහිත වස්තුවක්":
if (isType(val, Object) && Object.entries(val).length === 0) ...
- "සංඛ්යාවක්, බිංදුවට සමාන හෝ අඩු":
if (isType(val, Number) && val <= 0) ...
"අයිතමයක් නොමැති අරාව": if (isType(val, Array) && val.length === 0) ...
එකම ව්යතිරේකය වන්නේ null
යම් ක්රියාකාරීත්වයක් දැක්වීමට භාවිතා කරන විටය . මෙම අවස්ථාවේ දී කීම අර්ථවත් ය: "රික්ත අගයක්":if (val === null) ...