රික්තය
මුළු ලෝකයේම වටිනාකමක් හිස් දැයි ගණනය කරන ශ්රිතයක් නිර්වචනය කිරීමට හෝ භාවිතා කිරීමට උත්සාහ කිරීම මම නිර්දේශ නොකරමි. “හිස්” යන්නෙන් ඇත්තටම අදහස් කරන්නේ කුමක්ද? මා සතුව 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) ...