JavaScript හි නියතයන් තිබේද?


1137

ජාවාස්ක්‍රිප්ට් හි නියතයන් භාවිතා කිරීමට ක්‍රමයක් තිබේද?

එසේ නොවේ නම්, නියතයන් ලෙස භාවිතා වන විචල්‍යයන් නියම කිරීම සඳහා පොදු භාවිතාව කුමක්ද?


35
Chromeconstනියතයන් භාවිතා කිරීම සඳහා මූල පදය භාවිතා කිරීමට ඔබට ඉඩ සලසයි . උදා const ASDF = "asdf". කෙසේ වෙතත්, constබහු බ්‍රව්සරයට අනුකූල නොවන බැවින් , මම සාමාන්‍යයෙන් varප්‍රකාශයක් සමඟ බැඳී සිටිමි .
ජැක්සන්කර්

20
try{const thing=1091;}catch(e){var thing=1091;}කටයුතු.
ඩෙරෙක් 朕 會 功夫

13
ඩෙරෙක්: ඔබගේ උත්සාහය / අල්ලා ගැනීම ඔබ උත්සාහ කරන / අල්ලා ගැනීමේ වාරණයට ප්‍රකාශ කරන දෙයෙහි විෂය පථය සීමා නොකරන්නේද? ඔබ නිසි කරුණු නිශ්චය කිරීෙම් නෑ නම් නියම කාරණය මොකක්ද constහෝ varසියලු දී?
කෝඩර්

8
Implementation වර්තමාන ක්‍රියාවට නැංවීමේදී කේතකරුවා, මෙය constඑකම විෂය පථයක් ඇති පරිදි ක්‍රියා කරනු ඇති varඅතර එය ක්‍රියාකාරී මට්ටමේ මිස අවහිර මට්ටමේ නොවේ. ඒ වෙනුවට ඔබ එළඹෙන ECMAScript ප්‍රමිතිය අනුගමනය කරන්නේ නම්, ඒ constහා සමාන විෂය පථයක් ඇත let, එයින් අදහස් වන්නේ එය ක්‍රියාත්මක නොවන බවයි.
ජැස්පර්

3
Ode කෝඩරර් වැරදි භාෂාව. ජාවාස්ක්‍රිප්ට් හි විචල්‍යයන් ශ්‍රිත විෂය පථය වේ. මෙය සී නොවේ
doug65536

Answers:


1021

ES2015 සිට , ජාවාස්ක්‍රිප්ට් හි අදහසක් ඇත const:

const MY_CONSTANT = "some-value";

IE 8, 9 සහ 10 හැර අනෙකුත් සියලුම බ්‍රව්සර් වල මෙය ක්‍රියා කරයි. සමහරුන්ට දැඩි මාදිලිය සක්‍රීය කිරීම අවශ්‍ය විය හැකිය .

ඔබට varපැරණි බ්‍රව්සර් සඳහා සහය දැක්වීමට අවශ්‍ය නම් හෝ උරුම කේතය සමඟ වැඩ කරන්නේ නම් ඇතැම් අගයන් වෙනස් නොකළ යුතු බව පෙන්වීමට ඔබට ALL_CAPS වැනි සම්මුතීන් සමඟ භාවිතා කළ හැකිය :

var MY_CONSTANT = "some-value";

60
කොස් x = 24;
සැකරි ස්කොට්

93
ඔබට හරස් බ්‍රව්සර් අනුකූලතාව අවශ්‍ය නොවේ නම් (හෝ ඔබ රයිනෝ හෝ නෝඩ්.ජේ හි සේවාදායක පාර්ශවීය වැඩසටහන්කරණය) ඔබට constමූලික පදය භාවිතා කළ හැකි බව සලකන්න . IE හැර අනෙකුත් සියලුම නවීන බ්‍රව්සර් මගින් දැනට එයට සහය දක්වයි.
හස්කි

17
මේ දිනවල (අවුරුදු 3.5 කට පසුව) ඔබට Object.definePropertyකියවිය හැකි ගුණාංග නිර්මාණය කිරීමට භාවිතා කළ හැකි අතර ඒවා මකා දැමිය නොහැක. මෙය සියලුම ප්‍රධාන බ්‍රව්සර් වල වර්තමාන අනුවාදයේ ක්‍රියාත්මක වේ (නමුත් වැරදි ලෙස IE8 හි ).
Phrogz

12
@ අමීත් එය ඇත්තෙන්ම ප්‍රයෝජනවත් නොවේ. එය තනි වෙළෙන්දෙකු විසින් යෝජනා කරන ලද විලාසිතාවේ මාර්ගෝපදේශයකි . ඉහත හස්කිගේ කරුණට අනුව, සේවාදායක පාර්ශවීය ජේඑස් ලිවීමේදී IE අනුකූලතාව මුළුමනින්ම අදාළ නොවේ.
aendrew

32
මෙම පිළිතුර ගූගල් විසින් 2015 දී තවමත් ඉහළ ශ්‍රේණිගත කර ඇති බැවින් එය දැන් යල්පැන ඇති බව පැවසිය යුතුය. මෙම constමූල පදය දැන් නිල භාෂාව කොටසක් වන අතර, සෑම බ්රවුසරය විසින් ආධාර කරනු ලබයි. Statcounter.com වෙබ් අඩවියට අනුව, අන්තර්ජාල භාවිතා කරන්නන්ගෙන් සියයට කිහිපයක් පමණක් තවමත් සහාය නොදක්වන පැරණි බ්‍රව්සර් අනුවාද භාවිතා කරයි const.
ට්‍රිස්තානය

311

වෙනස් කිරීමට එරෙහිව විචල්යයන් ආරක්ෂා කිරීමට ඔබ උත්සාහ කරනවාද? එසේ නම්, ඔබට මොඩියුල රටාවක් භාවිතා කළ හැකිය:

var CONFIG = (function() {
     var private = {
         'MY_CONST': '1',
         'ANOTHER_CONST': '2'
     };

     return {
        get: function(name) { return private[name]; }
    };
})();

alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

CONFIG.MY_CONST = '2';
alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

CONFIG.private.MY_CONST = '2';                 // error
alert('MY_CONST: ' + CONFIG.get('MY_CONST'));  // 1

මෙම ප්‍රවේශය භාවිතා කරමින් අගයන් වෙනස් කළ නොහැක. නමුත්, ඔබ CONFIG :( හි get () ක්‍රමය භාවිතා කළ යුතුය.

ඔබට විචල්‍යතා අගය දැඩි ලෙස ආරක්ෂා කිරීමට අවශ්‍ය නොවන්නේ නම්, යෝජනා කළ පරිදිම කර සියලු කැප්ස් සම්මුතියක් භාවිතා කරන්න.


13
ඔබට CONFIG හි අගය සඳහා ශ්‍රිතයක් ආපසු ලබා දිය හැකි බව සලකන්න. එමඟින් ඔබට CONFIG.get () ඇමතීම සැමවිටම ඉතිරි වේ.
මැතිව් බර්න්

4
ලස්සන විසඳුමක්. එහෙත් එවැනි දේ කිසියම් නව ව්‍යාපෘතියක නව සොයාගැනීම් නොකිරීමට පුස්තකාලයක් ලෙස ඔතා තිබිය යුතුය.
andrii

82
CONFIG.get = someNewFunctionThatBreaksTheCode... සියල්ලට ම, ඔබට නියත වශයෙන්ම JS හි නියතයන් බලාත්මක කළ නොහැක (w / o const keyword). ඔබට කළ හැකි එකම දෙය දෘශ්‍යතාව සීමා කිරීමයි.
තෝමස් එඩින්

28
privateඑය ජාවාස්ක්‍රිප්ට් හි අනාගත වෙන් කළ වචනයක් යැයි මම විශ්වාස කරමි, මම ඔබ නම් මම එය භාවිතා නොකරමි.
සාක්

මෙයද රෙජිස්ට්රි රටාවයි.

122

මෙම constමූල පදය වේ ද සම්මතයන් 6 කෙටුම්පත නමුත් එය මෙතෙක් බ්රවුසරය සහාය ක smattering පමණක් හිමිව තිබේ: http://kangax.github.io/compat-table/es6/ . වාක්‍ය ඛණ්ඩය:

const CONSTANT_NAME = 0;

13
ඔබ a ට අගයක් පැවරීමට උත්සාහ කරන්නේ නම් const, එය කිසිදු දෝෂයක් නොදක්වයි. පැවරුම අසමත් වන අතර නියතයට තවමත් එහි මුල් වටිනාකම ඇත. මෙය ප්‍රධාන සැලසුම් දෝෂයකි IMHO නමුත් පැහැදිලි, ස්ථාවර නම් කිරීමේ සම්මුතියක් පවතින තාක් කල් (ජනප්‍රිය ALL_CAPS වැනි) එය අධික ශෝකයක් ඇති කරනු ඇතැයි මම නොසිතමි.
MatrixFrog

6
බ්‍රව්සර් සහාය ගැන මෙහි අවධානයෙන්
මාර්ක් මැක්ඩොනල්ඩ්

6
AtMatrixFrog පැවරුම සමඟ දෝෂයක් මතු වේ 'use strict'.
සෑම්

මම නියතයන් අර්ථ දැක්විය යුතුද ALL CAPS?
ලුවිස්

1
Res ට්රෙස්ඩින් එය සෑම තොප්පියකම නියතයන් අර්ථ දැක්වීම පොදු නම් කිරීමේ සම්මුතියකි. භාෂා පිරිවිතරයේ කිසිවක් එයට බල කරන්නේ නැත, නමුත් එය නරක අදහසක් නොවේ. එය ඔබගේ අභිප්‍රාය කුමක්ද යන්න පැහැදිලි කරයි, එබැවින් එය කේත කියවීමේ හැකියාව වැඩි දියුණු කරයි.
බිල් ද කටුස්සා

68
"use strict";

var constants = Object.freeze({
    "π": 3.141592653589793 ,
    "e": 2.718281828459045 ,
    "i": Math.sqrt(-1)
});

constants.π;        // -> 3.141592653589793
constants = 3;    // -> TypeError: Cannot assign to read only property 'π' …
constants.π;        // -> 3.141592653589793

delete constants.π; // -> TypeError: Unable to delete property.
constants.π;        // -> 3.141592653589793

Object.freeze බලන්න . ඔබට යොමු කිරීම කියවීමට පමණක් අවශ්‍ය නම් ඔබට භාවිතාconst කළ හැකිය constants.


2
මෙය ක්‍රියාත්මක වන්නේ IE9 + kangax.github.io/compat-table/es5 මත පමණක් බව සඳහන් කළ යුතුය .
කෝඩ්ල්

මම, ඒ සඳහා තීරණය කර ඇති කැඩුණු ක්රියාත්මක කර නැති නම්i
Alnitak

සටහන: මෙය ES6 constප්‍රකාශයට සමාන වේ , උදා: ගුණාංග නැවත ප්‍රකාශයට පත් කිරීමට හෝ නැවත පැවරීමට නොහැකිය, නමුත් ඒවා දත්ත සමුදායන් objectනම් ඒවා විකෘති කළ හැකිය.
le_m

හරියටම මම සොයන දේ. විචල්‍යය නැවත පැවරීම වැළැක්වීම const constantsවෙනුවට ඔබට භාවිතා කළ හැකිය var constants.
ජැරට් මිලර්ඩ්

බලන්න, උදා: පුනරාවර්තන කැටි කිරීම සඳහා ගැඹුරු කැටි කිරීම.
සෑම්

64

IE නියතයන්ට සහය දක්වයි, වර්ග කිරීම, උදා:

<script language="VBScript">
 Const IE_CONST = True
</script>
<script type="text/javascript">
 if (typeof TEST_CONST == 'undefined') {
    const IE_CONST = false;
 }
 alert(IE_CONST);
</script>

50
කොල්ලා, හරස් බ්‍රව්සරයක් නැති දෙයක් ගැන කතා කරන්න. . . කොටුවෙන් පිටත මඳක් සිතීම සඳහා තවමත් +1.
ටොම්

14
VBScript? එය කුමක් ද? ;)
tybro0103

2
මම සාමාන්‍යයෙන් IE නිශ්චිත පිළිතුරක් සමඟ සාමාන්‍ය සම්බන්ධිත බ්‍රව්සර් ප්‍රශ්නයට ඡන්දය දෙමි. අයිඊ ජාවාස්ක්‍රිප්ට් ක්‍රියාත්මක කිරීම 'එක' යැයි සිතන අයට මම වෛර කරන අතර අනෙක් ඒවා නොසලකා හැරිය යුතුය. IE, btw හැර වෙනත් බෝර්සර් භාවිතා කරන්නේ කවුද?
කුහුඹුවා

Scol කූලුහුරු මෙම ස්ක්‍රිප්ට් එක IE බ්‍රව්සර් (VBScript භාවිතා කරමින්) සහ IE නොවන බ්‍රව්සර් (ජාවාස්ක්‍රිප්ට් භාවිතා කරමින් const) හැසිරවිය හැකි බව පෙනේ . එහි ඇති වැරැද්ද කුමක්දැයි ඔබට පැහැදිලි කළ හැකිද?
ග්‍රිම්

නියතයන් වෙනස් කළ හැකි බව පිළිගැනීමට මට තවමත් අපහසුය.
නොර්බට් නොර්බට්සන්

59

ECMAScript 5 හඳුන්වා දෙන්නේ Object.defineProperty:

Object.defineProperty (window,'CONSTANT',{ value : 5, writable: false });

සෑම නවීන බ්‍රව්සරයකම එය සහාය දක්වයි (මෙන්ම IE ≥ 9) .

මෙයද බලන්න: ES5 හි Object.defineProperty?


1
මෙය සාම්ප්‍රදායික නියතයක් මෙන් නොවන බව සඳහන් කිරීම වටී. මෙය ඔබට ඉඩ දෙන්නේ නියත දේපලක් (නියත නොවන වස්තුවක) අර්ථ දැක්වීමට පමණි. එසේම මෙය දෝෂයක් ජනනය නොකරන අතර ඔබ සැකසීමට උත්සාහ කරන අගය පවා ලබා දෙයි. එය හුදෙක් වටිනාකම ලියන්නේ නැත.
කෝරි දළ

3
සමග දේපළ පවරා ගැනීමට උත්සාහ කරන මෑතකදී මා කියවා writable: false ඇත පැවරුම සම්මතයන් 5 ගේ දැඩි මාදිලිය යටතේ අර්ථ කොට ඇත කරන්නේ බව කේතය නම් ඇත්තටම දෝෂයක් දමන්න. 'use strict'ඔබේ කේතයට ලිවීමට තවත් හේතුවක් .
කෝරි දළ

6
writable: falseඑය පෙරනිමිය බැවින් ඔබට සැබවින්ම අතහැර දැමිය හැකිය .
සෑම්

24

නැත, පොදුවේ නොවේ. ෆයර්ෆොක්ස් ක්‍රියාත්මක කරන constනමුත් මම දන්නවා අයි.ඊ.


O ජෝන් වෙනත් භාෂාවලින් වසර ගණනාවක් තිස්සේ භාවිතා කර ඇති කොන්ස්ට් සඳහා පොදු නම් කිරීමේ ක්‍රමයක් පෙන්වා දෙයි, ඔබට එය භාවිතා කිරීමට නොහැකි වීමට හේතුවක් මට නොපෙනේ. ඇත්ත වශයෙන්ම එයින් අදහස් කරන්නේ යමෙකු විචල්‍යයේ අගය කෙසේ හෝ ලියන්නේ නැති බවයි. :)


11
සියලු දෙනා දන්නා පරිදි, IE එය ක්‍රියාත්මක නොකරන්නේ නම්, එය නොපවතිනු ඇත.
ජොෂ් හින්මන්

3
අවාසනාවට හා ප්රායෝගිකව කථා කිරීම - එය සත්යයකි. IE හි වෙළඳපලෙන් විශාල කොටසක් හිමි වේ. මා සතුව ව්‍යාපාරයක් තිබුනේ නම් සහ අභ්‍යන්තරව වෙබ් යෙදුම් භාවිතා කර ඇත්නම්, මම එෆ්එෆ් මත ප්‍රමිතිකරණය කරමි. බොහෝ අය IE ගැන සැලකිලිමත් වන්නේ මන්දැයි මම නොදනිමි.
ජේසන් බන්ටිං

Ich රිච්: මගේ මතය සත්‍ය යැයි කීවේ කවුද? ඔබ තරමක් උපකල්පනය කළා. ඇරත්, මා සිතන පරිදි, IE උරා බොන කාරණය සත්‍යයකි. ඔබට ඔබේම කරුණු තිබිය හැකිය, මම කීවේ නැහැ ඔබ මගේ විශ්වාස කළ යුතුයි කියා. : P Xanax හෝ වෙනත් දෙයක් ගන්න ...
ජේසන් බන්ටිං

Ich රිච් බී, ඔව්, එය ගොළු අදහස් දැක්වීමක් පමණයි, මාව විශ්වාස කරන්න, මම දන්නවා, මම ගොළු අදහස් දක්වන්නෙමි. Ason ජේසන් බී - සිත්ගන්නා සුළුය, මම ඊයේ රාත්‍රියේ මෙම ගැටලුවට මුහුණ දුන්නෙමි. පැහැදිලි කිරීම සඳහා ස්තූතියි

IE ගැන සැලකිලිමත් වන්නේ කවුද? මම දන්ෙන නෑ! FF හෝ Chrome හෝ Opera යනාදිය ... සෑම මෙහෙයුම් පද්ධතියකම පාහේ ස්ථාපනය කළ හැකිය. පරිගණක සිල්ලර වෙළෙන්දෝ සාමාන්‍යයෙන් පැරණි IE අනුවාදය උරා බොන බව දන්නා නිසා ඔවුන් බොහෝ විට (හෝ සෑම විටම) පරිගණකයක් විකිණීමට පෙර විකල්ප බ්‍රව්සර් ස්ථාපනය කරති. එබැවින් මගේ සංවර්ධිත යෙදුම නොගැලපෙන බ්‍රව්සර් ගැන කිසිසේත් නොසලකන ලෙස මම තීරණය කර ඇත්තෙමි: බ්‍රව්සර් සංවර්ධකයින්ට ඔවුන්ගේ නිෂ්පාදනයට මගේ යෙදුම භාවිතා කළ හැකි ප්‍රමිතීන්ට ගරු කිරීම ගැන සැලකිලිමත් වන්නේ නම්, එසේ නොවේ නම්, පරිශීලකයින් වෙනත් බ්‍රව්සරයක් භාවිතා කරනු ඇත ... මට එය සමඟ ජීවත් විය හැකිය; -) නමුත් මයික්‍රොසොෆ්ට් සමාගමට වෙළඳපොළෙන් කොටසක් ලිහිල් කළ හැකිද? ඔවුන්ට එසේ කළ නොහැකිය "ඔවුන්" ඔවුන්ගේ දේව දේශපාලනය වෙනස් කරනු ඇත!
විලී වින්කා

20

ජාවාස්ක්‍රිප්ට් හි, මගේ මනාපය වන්නේ නියත අගයන් ලබා දීම සඳහා ශ්‍රිත භාවිතා කිරීමයි.

function MY_CONSTANT() {
   return "some-value";
}


alert(MY_CONSTANT());

6
Ur බර්ක්ස් පිළිතුරෙහි (rin ට්‍රිනිතිස්ගේ ප්‍රකාශය) සඳහන් කර ඇති ගැටලුවටම මෙය වැටෙන බව පෙන්වා දීම වටී. `MY_CONSTANT = ශ්‍රිතය () {ආපසු“ වෙනත් වටිනාකමක් ”; it එය බිඳ දමයි. +1 කෙසේ වෙතත්, යහපත් හා ඉක්මන් විසඳුමක්.
පැට්‍රික් එම්

13
-1. Var SOME_NAME = වටිනාකමට වඩා මෙය කිසිදු ප්‍රතිලාභයක් නොමැත (එය තවමත් විකෘති වී ඇත), වැඩි කේතයක් වන අතර එය පැහැදිලි කිරීම අවශ්‍ය වේ.
mikemaccana

At පැට්‍රික් එම් ඔබට නියතයන් වෙනස් කිරීමට නොහැකි විය හැකි උදා: සී වැනි වෙනත් භාෂාවලින් ඔබට එවැනි ව්‍යාජ නියතයන් වෙනස් කළ හැකි බව සත්‍යයක් වන අතර , ඔබට එය තවමත් උදා: දර්ශකයන් හරහා කළ හැකිය. එබැවින් ඔබ නියත යැයි අවම වශයෙන් යෝජනා කරන යම් ප්‍රවේශයක් භාවිතා කරන තාක් කල් එය කදිමයි.
rev

20

මොසිලස් එම්ඩීඑන් වෙබ් ලියකියවිලි පිළිබඳ හොඳ උදාහරණ සහ පැහැදිලි කිරීම් අඩංගු වේ const. උපුටා ගැනීම:

// define MY_FAV as a constant and give it the value 7
const MY_FAV = 7;

// this will throw an error - Uncaught TypeError: Assignment to constant variable.
MY_FAV = 20;

නමුත් IE9 / 10 තවමත් සහාය නොදැක්වීම කනගාටුවට කරුණකි const. එය විකාරයක් වීමට හේතුව :

ඉතින්, IE9 කොන්ස් සමඟ කරන්නේ කුමක්ද? මෙතෙක් අපගේ තීරණය වී ඇත්තේ එයට සහාය නොදැක්වීමයි. එය කිසි විටෙකත් සම්මුති ලක්‍ෂණයක් නොවේ, මන්ද එය කිසි විටෙක සියලුම බ්‍රව්සර්වල නොතිබුණි.

...

අවසානයේදී, වෙබයට ඇති හොඳම දිගුකාලීන විසඳුම එය අතහැර දමා ප්‍රමිතිකරණ ක්‍රියාවලීන් ඔවුන්ගේ පා ​​run මාලාව ක්‍රියාත්මක කිරීම සඳහා බලා සිටීම බව පෙනේ.

වෙනත් බ්‍රව්සර් එය නිවැරදිව ක්‍රියාත්මක නොකළ නිසා ඔවුන් එය ක්‍රියාත්මක නොකරයිද? එය වඩා හොඳ කිරීමට බියද? ප්‍රමිති නිර්වචන හෝ නැත, නියතය නියතයකි: එක් වරක් සකසන්න, කිසි විටෙකත් වෙනස් නොවේ.

සියලු අදහස් වලට: සෑම ශ්‍රිතයක්ම නැවත ලිවිය හැකිය (XSS ආදිය). එබැවින් varහෝ වෙනසක් නැත function(){return}. constඑකම සැබෑ නියතය වේ.

යාවත්කාලීන කිරීම: IE11 සහාය const :

IE11 කිරීමටද ඇතුළු නැගී එන සම්මතයන් 6 ප්රමිතිය වන හොඳින් අර්ථ හා පොදුවේ භාවිතා කරන අංගයන්, සඳහා පහසුකම ඇතුලත් කර const, Map, Set, හා WeakMapමෙන්ම ලෙස, __proto__වැඩි දියුණු කරන අන්තර්ක්රියාකාරී හැකියා සඳහා.


25
"එය කිසි විටෙක සියලුම බ්‍රව්සර්වල ලබා ගත නොහැක". ඔබ එය IE හි ලබා ගත නොහැකි නම් එය කිසි විටෙකත් සියලුම බ්‍රව්සර්වල නොතිබෙනු ඇත.
km1

රිය පැදවීමේ ප්‍රමිතිකරණය සෑම කෙනෙකුටම නොවේ;) - සමාගම් පැමිණ නැවත යති -
Quicker

මේ පිළිබඳව තවත් එකක්: VBA තවමත් සියලුම බ්‍රව්සර්වල සංක්ෂිප්ත අංගයක් නොවන අතර MS විසින් VBA හි සංයුක්තයට සහය දක්වයි - මෙය සංවර්ධන අයවැය චැනල් කිරීමේ ප්‍රවීණත්වයයි;)
ඉක්මන්

17

කාර්යයන් භාවිතා කිරීමට ඔබට අවශ්‍ය නැතිනම්:

var constant = function(val) {
   return function() {
        return val;
    }
}

මෙම ප්රවේශය ඔබ නිරන්තර විචල්යයන් ක්රියාත්මක ලබා දෙයි, නමුත් එය සහතික * එය සැකසූ විට කිසිවෙකු වටිනාකම වෙනස් හැකි බව.

a = constant(10);

a(); // 10

b = constant(20);

b(); // 20

මම පෞද්ගලිකව මෙය තරමක් ප්‍රසන්න බව පෙනේ, විශේෂයෙන් පිළිමළුන් පිටුදැකීමේ නිරීක්ෂණ වලින් මෙම රටාවට හුරු වූ පසු.

* constantඔබ එය ඇමතීමට පෙර යමෙකු එම ශ්‍රිතය නැවත අර්ථ දැක්වූයේ නැත්නම්


1
underscore.js මෙම කේතයට සමාන නියත ශ්‍රිතයක් ක්‍රියාත්මක කරයි.
වේදිකාව

OP හි ප්‍රශ්නයේ ස්වභාවය සරල, සංක්ෂිප්ත හා පිළිතුරු සපයයි. මේ සඳහා තවත් ඉහළ ඡන්ද ලැබිය යුතුව තිබුණි.
මැක්

3
මෙය කිසි විටෙකත් මට ප්‍රයෝජනවත් නොවීය. වසා දැමීමෙන් එය වෙනස් කළ නොහැකි වුවද, ඔබ එය පවරන ලද var තවමත් නැවත ලිවිය හැකිය. උදා: a = constant(10); a(10); // 10පසුව a = constant(25); a(); //25, කිසිදු දෝෂයක් හෝ අනතුරු ඇඟවීමක් ලබා දී නොමැත, ඔබේ නියතය බිඳී ඇති බවට කිසිදු සාක්ෂියක් නොමැත.
පැට්‍රික් එම්

මම අගය නැවත පැවරුවහොත් aඑය නව අගයකට වෙනස් වේ
සෞරබ් ෂර්මා

17

"නව" වස්තුව api සමඟ ඔබට මේ වගේ දෙයක් කළ හැකිය:

var obj = {};
Object.defineProperty(obj, 'CONSTANT', {
  configurable: false
  enumerable: true,
  writable: false,
  value: "your constant value"
});

වැඩි විස්තර සඳහා මොසිල්ලා එම්ඩීඑන් හි මෙය බලන්න . එය වස්තුවකට අමුණා ඇති බැවින් එය පළමු මට්ටමේ විචල්‍යයක් නොවේ, නමුත් ඔබට විෂය පථයක් තිබේ නම්, ඔබට එය එයට ඇමිණිය හැකිය. thisඑසේම වැඩ කළ යුතුය. උදාහරණයක් ලෙස ගෝලීය විෂය පථය තුළ මෙය කිරීමෙන් කවුළුවේ ව්‍යාජ නියත අගයක් ප්‍රකාශ වනු ඇත (එය ඇත්තෙන්ම නරක අදහසකි, ඔබ නොසැලකිලිමත් ලෙස ගෝලීය විචල්‍යයන් ප්‍රකාශ නොකළ යුතුය)

Object.defineProperty(this, 'constant', {
  enumerable: true, 
  writable: false, 
  value: 7, 
  configurable: false
});

> constant
=> 7
> constant = 5
=> 7

සටහන: පැවරුම මඟින් ඔබට කොන්සෝලය තුළ පවරා ඇති අගය ආපසු ලබා දෙනු ඇත, නමුත් විචල්යයේ අගය වෙනස් නොවේ


සෆාරි වල වැඩ නොකරන අතර මොසිල්ලා හි ඔබ නැවත අර්ථ දැක්වීමේ ප්‍රකාශය ක්‍රියාත්මක කරන්නේ නම් - වෙනත් අගයකින් - එය අගය නැවත ලබා දෙනු ඇත.
අක්ෂේ

2
'සෆාරි හි වැඩ නොකිරීම', සෆාරි සඳහා සහය නොදක්වයි . සමාන නොවේ. ඔබ එය උත්සාහ කළහොත් එය 'නොකැඩූ ආකාරයේ දෝෂයකි: දේපල නැවත අර්ථ දැක්විය නොහැක: <දේපල නම>'. එක්කෝ ඔබ එය වැරදියි, නැතහොත් ඔබේ ff එය වැරදි ලෙස ක්‍රියාත්මක කළේය. මම හිතන්නේ එය දෙකේම මිශ්‍රණයක්.
tenshou

14

හැකි සෑම තැනකම ව්‍යුහයන්ට කණ්ඩායම් නියතයන්:

උදාහරණයක් ලෙස, මගේ වර්තමාන ක්‍රීඩා ව්‍යාපෘතියේදී, මම පහත භාවිතා කර ඇත:

var CONST_WILD_TYPES = {
    REGULAR: 'REGULAR',
    EXPANDING: 'EXPANDING',
    STICKY: 'STICKY',
    SHIFTING: 'SHIFTING'
};

පැවරුම:

var wildType = CONST_WILD_TYPES.REGULAR;

සංසන්දනය:

if (wildType === CONST_WILD_TYPES.REGULAR) {
    // do something here
}

සංසන්දනය සඳහා වඩාත් මෑතකදී මම භාවිතා කරමි:

switch (wildType) {
    case CONST_WILD_TYPES.REGULAR:
        // do something here
        break;
    case CONST_WILD_TYPES.EXPANDING:
        // do something here
        break;
}

IE11 නව ES6 ප්‍රමිතිය සමඟ 'const' ප්‍රකාශනය ඇත.
ඉහත IE8, IE9 සහ IE10 වැනි පෙර බ්‍රව්සර්වල වැඩ කරයි.


12

සැකසිය හැකි නමුත් වෙනස් කළ නොහැකි නියතයන් සඳහා යාන්ත්‍රණයක් මඟින් ඔබේ ස්ක්‍රිප්ටය පහසුවෙන් සන්නද්ධ කළ හැකිය. ඒවා වෙනස් කිරීමට උත්සාහ කිරීම දෝෂයක් ජනනය කරයි.

/* author Keith Evetts 2009 License: LGPL  
anonymous function sets up:  
global function SETCONST (String name, mixed value)  
global function CONST (String name)  
constants once set may not be altered - console error is generated  
they are retrieved as CONST(name)  
the object holding the constants is private and cannot be accessed from the outer script directly, only through the setter and getter provided  
*/

(function(){  
  var constants = {};  
  self.SETCONST = function(name,value) {  
      if (typeof name !== 'string') { throw new Error('constant name is not a string'); }  
      if (!value) { throw new Error(' no value supplied for constant ' + name); }  
      else if ((name in constants) ) { throw new Error('constant ' + name + ' is already defined'); }   
      else {   
          constants[name] = value;   
          return true;  
    }    
  };  
  self.CONST = function(name) {  
      if (typeof name !== 'string') { throw new Error('constant name is not a string'); }  
      if ( name in constants ) { return constants[name]; }    
      else { throw new Error('constant ' + name + ' has not been defined'); }  
  };  
}())  


// -------------  demo ----------------------------  
SETCONST( 'VAT', 0.175 );  
alert( CONST('VAT') );


//try to alter the value of VAT  
try{  
  SETCONST( 'VAT', 0.22 );  
} catch ( exc )  {  
   alert (exc.message);  
}  
//check old value of VAT remains  
alert( CONST('VAT') );  


// try to get at constants object directly  
constants['DODO'] = "dead bird";  // error  

12

IE අමතක කර constයතුරු පදය භාවිතා කරන්න .


9
මට වැඩ කරයි! නමුත් පසුව මම ක්‍රෝම් දිගුවක් ලියමි, එබැවින් මම හොඳ බ්‍රව්සරයක සිටින බව මම දනිමි ...
යෝයෝ

1
දිගු කිරීම සහ ඇඩෝන ලිවීම පිළිබඳ හොඳම කොටස - හරස් බ්‍රව්සර් සහාය නැත!
ඉයන්

1
2019 2019 වෙත සාදරයෙන් පිළිගනිමු, හරස් බ්‍රව්සරයේ නොගැලපීම බොහෝ දුරට අතුරුදහන් වී ඇත :)
Fusseldieb

9

එය කිරීමට නිශ්චිත හරස් බ්‍රව්සරයක් නිශ්චිත ක්‍රමයක් නොමැත, වෙනත් පිළිතුරු වල පෙන්වා ඇති පරිදි විචල්‍යයන්ගේ විෂය පථය පාලනය කිරීමෙන් ඔබට එය සාක්ෂාත් කරගත හැකිය.

නමුත් වෙනත් විචල්‍යයන්ගෙන් වෙන්කර හඳුනා ගැනීම සඳහා නාම අවකාශය භාවිතා කිරීමට මම යෝජනා කරමි. මෙය වෙනත් විචල්‍යයන්ගෙන් ision ට්ටනය වීමේ අවස්ථාව අවම කරයි.

නිසි නම් තැබීම වැනි

var iw_constant={
     name:'sudhanshu',
     age:'23'
     //all varibale come like this
}

එබැවින් එය භාවිතා කරන විට එසේ වනු ඇත iw_constant.name හෝ වේiw_constant.age

Object.freeze ක්‍රමය භාවිතා කර ඔබට නව යතුරක් එක් කිරීම හෝ iw_constant තුළ ඕනෑම යතුරක් වෙනස් කිරීම අවහිර කළ හැකිය. කෙසේ වෙතත් එය පැරණි බ්‍රව්සරයට සහය නොදක්වයි.

උදා:

Object.freeze(iw_constant);

පැරණි බ්‍රව්සරය සඳහා ඔබට කැටි කිරීමේ ක්‍රමය සඳහා පොලිෆිල් භාවිතා කළ හැකිය .


ඇමතුම් ශ්‍රිතය සමඟ ඔබ හොඳින් නම්, නියතය නිර්වචනය කිරීමට හොඳම හරස් බ්‍රව්සර ක්‍රමය පහත දැක්වේ. ස්වයං ක්‍රියාත්මක කිරීමේ ශ්‍රිතයක් තුළ ඔබේ වස්තුව විෂය පථයට ගෙන ඔබේ නියතයන් සඳහා ලබා ගැනීමේ ශ්‍රිතයක් නැවත ලබා දීම උදා:

var iw_constant= (function(){
       var allConstant={
             name:'sudhanshu',
             age:'23'
             //all varibale come like this

       };

       return function(key){
          allConstant[key];
       }
    };

// අගය භාවිතය ලබා ගැනීමට iw_constant('name')හෝiw_constant('age')


** උදාහරණ දෙකෙහිම ඔබ නම පරතරය පිළිබඳව ඉතා සැලකිලිමත් විය යුතු අතර එමඟින් ඔබේ වස්තුව හෝ ශ්‍රිතය වෙනත් පුස්තකාලයක් මගින් ප්‍රතිස්ථාපනය නොකෙරේ. (වස්තුව හෝ ශ්‍රිතය ප්‍රතිස්ථාපනය වුවහොත් ඔබේ නියතය නියත වේ)


7

ටික වේලාවක්, with()ප්‍රකාශයන් වෙත යොමු කරන ලද වස්තු සාහිත්‍යයේ “නියතයන්” (ඒවා තවමත් නියත නොවේ) නියම කළෙමි . මම හිතුවේ ඒක හරිම දක්ෂයි කියලා. මෙන්න උදාහරණයක්:

with ({
    MY_CONST : 'some really important value'
}) {
    alert(MY_CONST);
}

අතීතයේ දී, මම CONSTමගේ නියතයන් සියල්ලම තැබිය හැකි නාම අවකාශයක් ද නිර්මාණය කර ඇත්තෙමි . නැවතත්, ඉහළින්. ෂීෂ්.

දැන්, මම KISSvar MY_CONST = 'whatever'; වෙත කරන්නෙමි .


16
එවාල්ට වඩා නපුරු දෙයක් තිබේ නම්, එය අනිවාර්යයෙන්ම with.
නිකීක්

4
eval ඉතා නපුරු ය! ඒක එක පාරක් මගේ ගෙදර ගිනිබත් කළා!
W3Geek

6

මගේ මතය (වස්තූන් සමඟ පමණක් ක්‍රියා කරයි).

var constants = (function(){
  var a = 9;

  //GLOBAL CONSTANT (through "return")
  window.__defineGetter__("GCONST", function(){
    return a;
  });

  //LOCAL CONSTANT
  return {
    get CONST(){
      return a;
    }
  }
})();

constants.CONST = 8; //9
alert(constants.CONST); //9

උත්සාහ කරන්න! නමුත් තේරුම් ගන්න - මෙය වස්තුවකි, නමුත් සරල විචල්යයක් නොවේ.

මෙයද උත්සාහ කරන්න:

const a = 9;

5

මටත් මේ ගැන ප්‍රශ්නයක් තියෙනවා. ටික වේලාවකට පසු පිළිතුර සෙවීම සහ සියලු දෙනාගේ සියලු ප්‍රතිචාර දෙස බැලීමෙන් පසු, මම මේ සඳහා ශක්‍ය විසඳුමක් ඉදිරිපත් කර ඇතැයි සිතමි.

මට හමු වී ඇති බොහෝ පිළිතුරු නියතයන් රඳවා තබා ගැනීමට ශ්‍රිත භාවිතා කරන බව පෙනේ. බොහෝ සංසදවල භාවිතා කරන්නන් බොහෝ දෙනෙක් පළ කරන පරිදි, කාර්යයන් සේවාදායකයාගේ පැත්තේ පරිශීලකයින්ට පහසුවෙන් ලිවිය හැකිය. නියත වස්තුවට පිටතින් ප්‍රවේශ විය නොහැකි නමුත් ඇතුළත ඇති ක්‍රියාකාරිත්වයන්ගෙන් පමණක් යන කීත් එවෙට්ස්ගේ පිළිතුරෙන් මා කුතුහලයට පත් විය.

එබැවින් මම මෙම විසඳුම ඉදිරිපත් කළෙමි:

සෑම දෙයක්ම නිර්නාමික ශ්‍රිතයක් තුළ තබන්න එවිට සේවාදායකයාගේ පැත්තෙන් විචල්‍යයන්, වස්තු ආදිය වෙනස් කළ නොහැක. අභ්‍යන්තරයෙන් 'තාත්වික' ශ්‍රිත ලෙස හැඳින්වෙන වෙනත් කාර්යයන් කිරීමෙන් 'තාත්වික' ශ්‍රිත සඟවන්න. සේවාදායකයාගේ පැත්තේ පරිශීලකයෙකු විසින් ශ්‍රිතයක් වෙනස් කර ඇත්දැයි පරීක්ෂා කිරීමට ශ්‍රිත භාවිතා කිරීමට ද මම සිතුවෙමි. කාර්යයන් වෙනස් කර ඇත්නම්, ඇතුළත 'ආරක්‍ෂිත' විචල්‍යයන් භාවිතා කර ඒවා වෙනස් කළ නොහැක.

/*Tested in: IE 9.0.8; Firefox 14.0.1; Chrome 20.0.1180.60 m; Not Tested in Safari*/

(function(){
  /*The two functions _define and _access are from Keith Evetts 2009 License: LGPL (SETCONST and CONST).
    They're the same just as he did them, the only things I changed are the variable names and the text
    of the error messages.
  */

  //object literal to hold the constants
  var j = {};

  /*Global function _define(String h, mixed m). I named it define to mimic the way PHP 'defines' constants.
    The argument 'h' is the name of the const and has to be a string, 'm' is the value of the const and has
    to exist. If there is already a property with the same name in the object holder, then we throw an error.
    If not, we add the property and set the value to it. This is a 'hidden' function and the user doesn't
    see any of your coding call this function. You call the _makeDef() in your code and that function calls
    this function.    -    You can change the error messages to whatever you want them to say.
  */
  self._define = function(h,m) {
      if (typeof h !== 'string') { throw new Error('I don\'t know what to do.'); }
      if (!m) { throw new Error('I don\'t know what to do.'); }
      else if ((h in j) ) { throw new Error('We have a problem!'); }
      else {
          j[h] = m;
          return true;
    }
  };

  /*Global function _makeDef(String t, mixed y). I named it makeDef because we 'make the define' with this
    function. The argument 't' is the name of the const and doesn't need to be all caps because I set it
    to upper case within the function, 'y' is the value of the value of the const and has to exist. I
    make different variables to make it harder for a user to figure out whats going on. We then call the
    _define function with the two new variables. You call this function in your code to set the constant.
    You can change the error message to whatever you want it to say.
  */
  self._makeDef = function(t, y) {
      if(!y) { throw new Error('I don\'t know what to do.'); return false; }
      q = t.toUpperCase();
      w = y;
      _define(q, w);
  };

  /*Global function _getDef(String s). I named it getDef because we 'get the define' with this function. The
    argument 's' is the name of the const and doesn't need to be all capse because I set it to upper case
    within the function. I make a different variable to make it harder for a user to figure out whats going
    on. The function returns the _access function call. I pass the new variable and the original string
    along to the _access function. I do this because if a user is trying to get the value of something, if
    there is an error the argument doesn't get displayed with upper case in the error message. You call this
    function in your code to get the constant.
  */
  self._getDef = function(s) {
      z = s.toUpperCase();
      return _access(z, s);
  };

  /*Global function _access(String g, String f). I named it access because we 'access' the constant through
    this function. The argument 'g' is the name of the const and its all upper case, 'f' is also the name
    of the const, but its the original string that was passed to the _getDef() function. If there is an
    error, the original string, 'f', is displayed. This makes it harder for a user to figure out how the
    constants are being stored. If there is a property with the same name in the object holder, we return
    the constant value. If not, we check if the 'f' variable exists, if not, set it to the value of 'g' and
    throw an error. This is a 'hidden' function and the user doesn't see any of your coding call this
    function. You call the _getDef() function in your code and that function calls this function.
    You can change the error messages to whatever you want them to say.
  */
  self._access = function(g, f) {
      if (typeof g !== 'string') { throw new Error('I don\'t know what to do.'); }
      if ( g in j ) { return j[g]; }
      else { if(!f) { f = g; } throw new Error('I don\'t know what to do. I have no idea what \''+f+'\' is.'); }
  };

  /*The four variables below are private and cannot be accessed from the outside script except for the
    functions inside this anonymous function. These variables are strings of the four above functions and
    will be used by the all-dreaded eval() function to set them back to their original if any of them should
    be changed by a user trying to hack your code.
  */
  var _define_func_string = "function(h,m) {"+"      if (typeof h !== 'string') { throw new Error('I don\\'t know what to do.'); }"+"      if (!m) { throw new Error('I don\\'t know what to do.'); }"+"      else if ((h in j) ) { throw new Error('We have a problem!'); }"+"      else {"+"          j[h] = m;"+"          return true;"+"    }"+"  }";
  var _makeDef_func_string = "function(t, y) {"+"      if(!y) { throw new Error('I don\\'t know what to do.'); return false; }"+"      q = t.toUpperCase();"+"      w = y;"+"      _define(q, w);"+"  }";
  var _getDef_func_string = "function(s) {"+"      z = s.toUpperCase();"+"      return _access(z, s);"+"  }";
  var _access_func_string = "function(g, f) {"+"      if (typeof g !== 'string') { throw new Error('I don\\'t know what to do.'); }"+"      if ( g in j ) { return j[g]; }"+"      else { if(!f) { f = g; } throw new Error('I don\\'t know what to do. I have no idea what \\''+f+'\\' is.'); }"+"  }";

  /*Global function _doFunctionCheck(String u). I named it doFunctionCheck because we're 'checking the functions'
    The argument 'u' is the name of any of the four above function names you want to check. This function will
    check if a specific line of code is inside a given function. If it is, then we do nothing, if not, then
    we use the eval() function to set the function back to its original coding using the function string
    variables above. This function will also throw an error depending upon the doError variable being set to true
    This is a 'hidden' function and the user doesn't see any of your coding call this function. You call the
    doCodeCheck() function and that function calls this function.    -    You can change the error messages to
    whatever you want them to say.
  */
  self._doFunctionCheck = function(u) {
      var errMsg = 'We have a BIG problem! You\'ve changed my code.';
      var doError = true;
      d = u;
      switch(d.toLowerCase())
      {
           case "_getdef":
               if(_getDef.toString().indexOf("z = s.toUpperCase();") != -1) { /*do nothing*/ }
               else { eval("_getDef = "+_getDef_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           case "_makedef":
               if(_makeDef.toString().indexOf("q = t.toUpperCase();") != -1) { /*do nothing*/ }
               else { eval("_makeDef = "+_makeDef_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           case "_define":
               if(_define.toString().indexOf("else if((h in j) ) {") != -1) { /*do nothing*/ }
               else { eval("_define = "+_define_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           case "_access":
               if(_access.toString().indexOf("else { if(!f) { f = g; }") != -1) { /*do nothing*/ }
               else { eval("_access = "+_access_func_string); if(doError === true) { throw new Error(errMsg); } }
               break;
           default:
                if(doError === true) { throw new Error('I don\'t know what to do.'); }
      }
  };

  /*Global function _doCodeCheck(String v). I named it doCodeCheck because we're 'doing a code check'. The argument
    'v' is the name of one of the first four functions in this script that you want to check. I make a different
    variable to make it harder for a user to figure out whats going on. You call this function in your code to check
    if any of the functions has been changed by the user.
  */
  self._doCodeCheck = function(v) {
      l = v;
      _doFunctionCheck(l);
  };
}())

ආරක්ෂාව සැබවින්ම ගැටළුවක් වන අතර සේවාදායකයාගේ පැත්තෙන් ඔබ ක්‍රමලේඛනය 'සැඟවීමට' ක්‍රමයක් නොමැත. මට හොඳ අදහසක් නම් ඔබේ කේතය සම්පීඩනය කිරීමයි, එවිට ඔබ ඇතුළු ක්‍රමලේඛකයා ඇතුළු ඕනෑම කෙනෙකුට එය කියවා තේරුම් ගැනීමට අපහසුය. ඔබට යා හැකි වෙබ් අඩවියක් ඇත: http://javascriptcompressor.com/ . (මෙය මගේ වෙබ් අඩවිය නොවේ, කරදර නොවන්න, මම ප්‍රචාරණය නොකෙරේ.) මෙය ඔබට ජාවාස්ක්‍රිප්ට් කේතය නොමිලේ සම්පීඩනය කිරීමට සහ අපැහැදිලි කිරීමට ඉඩ දෙන වෙබ් අඩවියකි.

  1. ඉහත පිටපතෙහි ඇති සියලුම කේත පිටපත් කර javascriptcompressor.com පිටුවේ ඉහළ පෙළට අලවන්න.
  2. Base62 එන්කෝඩ් පිරික්සුම් කොටුව සලකුණු කරන්න, හැකිලීමේ විචල්‍යතා පිරික්සුම් කොටුව සලකුණු කරන්න.
  3. සම්පීඩන බොත්තම ඔබන්න.
  4. ඒ සියල්ල .js ගොනුවක අලවා ඔබගේ පිටුවේ ප්‍රධාන කොටසේ ඔබේ පිටුවට එක් කරන්න.

මෙය ඇතුළත් කිරීම සඳහා පුස්තකාලයක් ලෙස මනාව ඔතා තැබිය හැකි හොඳ විසඳුමකි. නමුත් මෙම කේතයේ ඔබේ විචල්‍ය නම් කිරීම මම අකමැතියි. කීත්ගේ කේතයේ භාවිතා කර ඇති පරිදි "නම" සහ "අගය" වැනි විස්තරාත්මක නම් අතහැර දැමිය යුත්තේ ඇයි? සුළු ප්රශ්නය, නමුත් තවමත්.
කෝඩ්ල්

5

පැහැදිලිවම මෙයින් පෙන්නුම් කරන්නේ ප්‍රමිතිගත හරස් බ්‍රව්සරයේ ප්‍රධාන වචන පදයක අවශ්‍යතාවයයි.

නමුත් දැනට:

var myconst = value;

හෝ

Object['myconst'] = value;

දෙකම ප්‍රමාණවත් යැයි පෙනෙන අතර වෙනත් ඕනෑම දෙයක් බාසුකා සමඟ මැස්සෙකුට වෙඩි තැබීම වැනි ය.


හොඳ පැරණි var myconst = අගය ගන්න; සහ නිදොස්කරණය සඳහා අමතර නිදොස් කිරීමේ කේතය භාවිතා කරන්න ... - සියලුම බ්‍රව්සර් කොන්ස්ටයට සහය නොදක්වන තාක් කල් පිස්සු මෙන් ක්‍රියා කරයි
ඉක්මන්

4

මම මගේ ග්‍රීස්මන්කි ස්ක්‍රිප්ට් constවෙනුවට භාවිතා varකරමි, නමුත් එයට හේතුව ඒවා ක්‍රියාත්මක වන්නේ ෆයර්ෆොක්ස් මත පමණි ...
නාම සම්මුතිය ඇත්ත වශයෙන්ම යා යුතු මාර්ගය විය හැකිය (මම දෙකම කරන්නෙමි!).


4

ජාවාස්ක්‍රිප්ට් හි මගේ පුරුද්ද වී ඇත්තේ මට හැකි තාක් දුරට නියතයන් වළක්වා ඒ වෙනුවට නූල් භාවිතා කිරීමයි. ඔබේ නියතයන් බාහිර ලෝකයට නිරාවරණය කිරීමට අවශ්‍ය විට නියතයන් සමඟ ගැටලු මතු වේ:

උදාහරණයක් ලෙස කෙනෙකුට පහත සඳහන් දිනය API ක්‍රියාත්මක කළ හැකිය:

date.add(5, MyModule.Date.DAY).add(12, MyModule.Date.HOUR)

නමුත් සරලව ලිවීම වඩා කෙටි හා ස්වාභාවික ය:

date.add(5, "days").add(12, "hours")

මේ ආකාරයෙන් "දින" සහ "පැය" සැබවින්ම නියතයන් ලෙස ක්‍රියා කරයි, මන්ද ඔබට "පැය" නිරූපණය කරන්නේ තත්පර ගණන පිටතින් වෙනස් කළ නොහැකි බැවිනි. නමුත් නැවත ලිවීම පහසුයMyModule.Date.HOUR .

මේ ආකාරයේ ප්‍රවේශය නිදොස්කරණය සඳහා ද උපකාරී වේ. ෆයර්බග් ඔබට කිව්වොත් action === 18එහි තේරුම කුමක්දැයි සොයා ගැනීම දුෂ්කර ය, නමුත් ඔබ දුටු action === "save"විට එය වහාම පැහැදිලි වේ.


අවාසනාවට අක්ෂර වින්‍යාසය වැරදීම ඉතා පහසුය - උදා "Hours"වෙනුවට "hours"- නමුත් IDE මඟින් ඔබට එය කලින් දැනුම් දෙනු ඇත Date.Hours.
le_m

4

හරි, මෙය කැතයි, නමුත් එය මට ෆයර්ෆොක්ස් සහ ක්‍රෝමියම් වල නියතයක් ලබා දෙයි, සෆාරි සහ ඔපෙරා හි නොගැලපෙන නියතයක් (ඩබ්ලිව්ටීඑෆ්?) සහ අයිඊ හි විචල්‍යතාවයක් ලබා දෙයි.

ඇත්ත වශයෙන්ම eval () නපුරු ය, නමුත් එය නොමැතිව IE දෝෂයක් විසි කරයි, ස්ක්‍රිප්ට් ධාවනය වීම වළක්වයි.

සෆාරි සහ ඔපෙරා කොන්ස්ට් යතුරු පදයට සහය දක්වයි, නමුත් ඔබට කොන්ස්ගේ අගය වෙනස් කළ හැකිය .

මෙම උදාහරණයේ දී, සර්වර් සයිඩ් කේතය ජාවාස්ක්‍රිප්ට් පිටුවට ලියමින් {0} අගය වෙනුවට ආදේශ කරයි.

try{
    // i can haz const?
    eval("const FOO='{0}';");
    // for reals?
    var original=FOO;
    try{
        FOO='?NO!';
    }catch(err1){
        // no err from Firefox/Chrome - fails silently
        alert('err1 '+err1);
    }
    alert('const '+FOO);
    if(FOO=='?NO!'){
        // changed in Sf/Op - set back to original value
        FOO=original;
    }
}catch(err2){
    // IE fail
    alert('err2 '+err2);
    // set var (no var keyword - Chrome/Firefox complain about redefining const)
    FOO='{0}';
    alert('var '+FOO);
}
alert('FOO '+FOO);

මෙය හොඳ කුමක්ද? එය හරස් බ්‍රව්සරයක් නොවන බැවින් බොහෝ නොවේ. හොඳම දෙය නම්, අවම වශයෙන් සමහරුන්ගේ මනසේ සාමය විය හැකිය බ්‍රව්සර් මඟින් පොත් සලකුණු හෝ තෙවන පාර්ශවීය ස්ක්‍රිප්ට් වල වටිනාකම වෙනස් කිරීමට ඉඩ නොදෙන සිටින්න.

ෆයර්ෆොක්ස් 2, 3, 3.6, 4, යකඩ 8, ක්‍රෝම් 10, 12, ඔපෙරා 11, සෆාරි 5, අයිඊ 6, 9 සමඟ පරීක්ෂා කර ඇත.


1
එම කේතයට ආදරය කරන්න! කැත ලෙස කැතයි, නමුත් නිරන්තර සහාය සඳහා හොඳ පරීක්ෂණයක්. =)
ස්ටයින් ජී. ස්ට්‍රින්ඩ්හග්

1
තරමක් විහිලු, ඇස - කොන්ස් එකක් ප්‍රකාශ කිරීමට ඔබට පේළි කීයක් ටයිප් කළ හැකිද?
ඉක්මන්

4

එය සඳහන් කිරීම වටී නම්, ඔබට කෝණික භාවිතයෙන් නියතයන් අර්ථ දැක්විය හැකිය$provide.constant()

angularApp.constant('YOUR_CONSTANT', 'value');

... ඔබට VBA ... xbrowser? ... up ...;) හි const භාවිතා කළ හැකිය
ඉක්මන්

OP ජාවාස්ක්‍රිප්ට් ගැන විමසයි, පිළිතුර දැඩි ලෙස මතභේදාත්මක JS රාමුව සමඟ ගනුදෙනු කරයි. ප්‍රායෝගිකව මාතෘකාවෙන් බැහැරයි.
rounce

2
@rounce: Off-මාතෘකාව පිළිතුරු එසේ නොවේ, තවමත් පිළිතුරු ධජය ලෙස නොවේ උත්තරයක් නමුත් downvote හා මකා දැමීමට ඡන්දය වෙනුවට. බලන්න “පිළිතුරක් නොවේ” ධජය නිසි ලෙස භාවිතා කරන්නේ කෙසේද?
කෙවින් ගුවාන්

E කෙවින්ගුආන් සටහන්, අනාගතයේදී කරනු ඇත.
rounce

4

ඒ වෙනුවට ඔබට කිරීමට ඉඩ දෙන බර්ක්ගේ පිළිතුරේ වැඩි දියුණු කළ අනුවාදයකි .CONFIG.MY_CONSTCONFIG.get('MY_CONST')

එයට IE9 + හෝ සැබෑ වෙබ් බ්‍රව්සරයක් අවශ්‍ය වේ.

var CONFIG = (function() {
    var constants = {
        'MY_CONST': 1,
        'ANOTHER_CONST': 2
    };

    var result = {};
    for (var n in constants)
        if (constants.hasOwnProperty(n))
            Object.defineProperty(result, n, { value: constants[n] });

    return result;
}());

* ගුණාංග කියවීමට පමණි, ආරම්භක අගයන් වෙනස් කළ නොහැකි නම් පමණි.


4

ජාවාස්ක්‍රිප්ට් ඊඑස් 6 (නැවත) සියලු ප්‍රධාන බ්‍රව්සර්වල සහය දක්වන constයතුරු පදය හඳුන්වා දුන්නේය .

හරහා ප්‍රකාශිත විචල්‍යයන් constනැවත ප්‍රකාශ කිරීමට හෝ නැවත පැවරීමට නොහැකිය.

ඒ හැර, constසමාන ලෙස හැසිරේ let.

එය ප්‍රාථමික දත්ත වර්ග සඳහා අපේක්ෂිත පරිදි ක්‍රියා කරයි (බූලියන්, ශුන්‍ය, නිර්වචනය නොකළ, අංකය, නූල්, සංකේතය):

const x = 1;
x = 2;
console.log(x); // 1 ...as expected, re-assigning fails

අවධානය: වස්තූන් සම්බන්ධ අන්තරායන් ගැන සැලකිලිමත් වන්න:

const o = {x: 1};
o = {x: 2};
console.log(o); // {x: 1} ...as expected, re-assigning fails

o.x = 2;
console.log(o); // {x: 2} !!! const does not make objects immutable!

const a = [];
a = [1];
console.log(a); // 1 ...as expected, re-assigning fails

a.push(1);
console.log(a); // [1] !!! const does not make objects immutable

ඔබට සැබවින්ම වෙනස් කළ නොහැකි හා නියත වස්තුවක් අවශ්‍ය නම්: const ALL_CAPSඔබේ අභිප්‍රාය පැහැදිලි කිරීමට භාවිතා කරන්න. constකෙසේ හෝ සියලු ප්‍රකාශයන් අනුගමනය කිරීම හොඳ සම්මුතියකි , එබැවින් එය මත රඳා සිටින්න .


IE11 සිට පමණි :-(
Mo.

3

තවත් විකල්පයක් වන්නේ:

var constants = {
      MY_CONSTANT : "myconstant",
      SOMETHING_ELSE : 123
    }
  , constantMap = new function ConstantMap() {};

for(var c in constants) {
  !function(cKey) {
    Object.defineProperty(constantMap, cKey, {
      enumerable : true,
      get : function(name) { return constants[cKey]; }
    })
  }(c);
}

ඉන්පසු සරලව: var foo = constantMap.MY_CONSTANT

ඔබ constantMap.MY_CONSTANT = "bar"එය ලබා ගන්නේ නම්, අපි ලබා ගන්නෙකු සමඟ පැවරුම් ක්‍රියාකරුවෙකු භාවිතා කිරීමට උත්සාහ කරන බැවින් එය කිසිදු බලපෑමක් ඇති නොකරනු ඇත, එබැවින් constantMap.MY_CONSTANT === "myconstant"සත්‍ය ලෙස පවතිනු ඇත.


3

ජාවාස්ක්‍රිප්ට් හි දැනටමත් නියතයන් පවතී . ඔබ මේ වගේ නියතයක් අර්ථ දක්වයි:

const name1 = value;

නැවත පැවරීම තුළින් මෙය වෙනස් කළ නොහැක.


පිළිතුරෙහි ඇති සබැඳිය අනුව, මෙය පර්යේෂණාත්මක අංගයක් වන අතර එය ප්‍රවේශමෙන් භාවිතා කළ යුතුය.
ජොනී කාර්

ඇත්ත වශයෙන්ම, මම ඔබ සමඟ එකඟ වෙමි. නමුත් බ්‍රව්සර් වල අවසාන අනුවාද වල එය ක්‍රියාත්මක වේ.
එරික් ලුසියෝ

3

'Const' යන මූල පදය මීට පෙර යෝජනා කරන ලද අතර දැන් එය නිල වශයෙන් ES6 හි ඇතුළත් කර ඇත. Const keyword භාවිතා කිරීමෙන්, ඔබට වෙනස් කළ නොහැකි නූලක් ලෙස ක්‍රියා කරන අගය / නූලක් සම්මත කළ හැකිය.


2

ජාවාස්ක්‍රිප්ට් වෙත නියතයන් හඳුන්වා දීම වඩාත් සුදුසුය.

ජාවාස්ක්‍රිප්ට් හි නිරන්තර හා ගෝලීයව ප්‍රවේශ විය හැකි අගයන් සෑදීමේ හොඳ ක්‍රමයක් වනුයේ මෙවැනි “කියවීමට-පමණක්” ගුණාංග සහිත වස්තුවක් වචනාර්ථයෙන් ප්‍රකාශ කිරීමයි:

            my={get constant1(){return "constant 1"},
                get constant2(){return "constant 2"},
                get constant3(){return "constant 3"},
                get constantN(){return "constant N"}
                }

ඔබේ සියලු නියතයන් එක් “මගේ” උපාංගයක් තුළ කාණ්ඩගත කර ඇති අතර එහිදී ඔබට ගබඩා කළ අගයන් හෝ වෙනත් ඕනෑම දෙයක් සොයා ගත හැකිය. දැන් එය ක්‍රියාත්මක වේදැයි පරීක්ෂා කර බලමු:

           my.constant1; >> "constant 1" 
           my.constant1 = "new constant 1";
           my.constant1; >> "constant 1" 

අපට පෙනෙන පරිදි, "my.constant1" දේපල එහි මුල් වටිනාකම ආරක්ෂා කර ඇත. ඔබ ඔබම හරිත 'හරිත' තාවකාලික නියතයන් කිහිපයක් සාදා ඇත ...

නමුත් ඇත්ත වශයෙන්ම මෙය ඔබව ආරක්ෂා කරනුයේ ලබා දී ඇති උදාහරණයේ දී මෙන් access ජු ප්‍රවේශයකින් ඔබේ දේපල නියත වටිනාකම අහම්බෙන් වෙනස් කිරීම, වෙනස් කිරීම, අවලංගු කිරීම හෝ හිස් කිරීම පමණි.

නැතිනම් මම තවමත් සිතන්නේ නියතයන් ඩම්මි සඳහා බවයි. රැවටිලිකාර සුරක්‍ෂිතතාවයේ කුඩා කොනක් සඳහා ඔබේ විශාල නිදහස හුවමාරු කර ගැනීම කළ හැකි නරකම වෙළඳාම යැයි මම තවමත් සිතමි.


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.