විචල්‍යය ජාවාස්ක්‍රිප්ට් හි නූලක් දැයි පරීක්ෂා කරන්න


1769

ජාවාස්ක්‍රිප්ට් හි විචල්‍යයක් නූල් හෝ වෙනත් දෙයක් දැයි මම තීරණය කරන්නේ කෙසේද?

Answers:


1727

ඔබට typeofක්‍රියාකරු භාවිතා කළ හැකිය :

var booleanValue = true; 
var numericalValue = 354;
var stringValue = "This is a String";
var stringObject = new String( "This is a String Object" );
alert(typeof booleanValue) // displays "boolean"
alert(typeof numericalValue) // displays "number"
alert(typeof stringValue) // displays "string"
alert(typeof stringObject) // displays "object"

මෙම වෙබ් පිටුවෙන් උදාහරණය . (උදාහරණය තරමක් වෙනස් කළද).

නිර්මාණය කරන ලද නූල් සම්බන්ධයෙන් මෙය අපේක්ෂා කළ පරිදි ක්‍රියා නොකරනු ඇත new String(), නමුත් මෙය කලාතුරකින් භාවිතා වන අතර [1] [2] ට එරෙහිව නිර්දේශ කරනු ලැබේ . ඔබ කැමති නම් මේවා හැසිරවිය යුතු ආකාරය පිළිබඳ අනෙක් පිළිතුරු බලන්න.


  1. ගූගල් ජාවාස්ක්‍රිප්ට් ස්ටයිල් ගයිඩ් පවසන්නේ කිසි විටෙකත් ප්‍රාථමික වස්තු ආවරණ භාවිතා නොකරන ලෙසයි .
  2. ඩග්ලස් ක්‍රොක්ෆර්ඩ් නිර්දේශ කළේ ප්‍රාථමික වස්තු ආවරණ ඉවත් කළ යුතු බවයි .

45
@ Wolfy87 stringValue ටයිප් කරන සමහර අවස්ථා “string” වෙනුවට “වස්තුව” ආපසු ලබා දිය හැකි බව කරුණාකර අවවාද කරන්න. මගේ පිළිතුර පිළිබඳ අදහස් බලන්න.
ඩ්‍රැක්ස්

170
මම කැමති පිළිතුර. එයට එරෙහි තර්කය නම්, එය වස්තු-ඔතා ඇති නූල් සඳහා 'අසමත්' new String('foo')වීමයි, නමුත් එය වැදගත් නොවේ, මන්ද වස්තු-ඔතා ඇති නූල් ඔබ භාවිතා නොකළ යුතු වැදගැම්මකට නැති ලක්ෂණයකි. ගූගල් විලාසිතාවේ මාර්ගෝපදේශය ඒවා තහනම් කරයි , ඩග්ලස් ක්‍රොක්ෆර්ඩ්ට ඒවා ඉවත් කිරීමට අවශ්‍ය වන අතර කිසිදු පුස්තකාලයක් ඒවා භාවිතා නොකරයි. ඒවා නොපවතින බව පෙන්වමින් typeofබියෙන් තොරව භාවිතා කරන්න .
අමරි


2
An ඩැනියෙල්, ඔහු යම් යම් ගැටළු නිරාකරණය කරන ආදේශකයක් යෝජනා කළ නිසා මිස ඔහු ප්‍රතිපත්තිමය වශයෙන් එයට විරුද්ධ වූ නිසා නොවේ.
Vsevolod Golovanov

4
එය ඔබට හිසරදයක් වේ නම්, 99.99% ක කාලයක් ඔබ ඔබේ කේතය නිවැරදිව සකස් කර නොතිබූ නිසාය. එය පවතින සහ එය කරන දේ කිරීම NaN ගේ වරදක් නොවේ, එය ඔබ ඊළඟ වතාවේ කේතයක් සමඟ වැඩ කරන විට එය සැලකිල්ලට ගත යුතු, ඉගෙන ගත යුතු හා මතක තබා ගත යුතු දෙයකි.
මයික් 'පොමාක්ස්' කමර්මන්ස්

1935

මෙය මට ප්‍රයෝජනවත් වන්නේ:

if (typeof myVar === 'string' || myVar instanceof String)
// it's a string
else
// it's something else

77
"MyVar instanceof String" "typeV myVar == 'string'" ට ඉහළින් සහ ඉන් ඔබ්බට යමක් කරන්නේද?
svth

81
මට මතකයි. ජාවාස්ක්‍රිප්ට් හි ඔබට විචල්ය ආකාරයේ නූල් වර්ගයක් හෝ සංගීත වර්ගයක් තිබිය හැකිය (එකම දෙය - දෙකම නූල් - නමුත් වෙනස් ලෙස අර්ථ දක්වා ඇත) ඒ නිසා දෙවරක් පරීක්ෂා කරන්නේ ඇයි.
ඩ්‍රැක්ස්

38
var somevar = new string ('somestring') console.log (typeof somevar) // object
Danubian Sailor

83
-1 මන්ද ඔබ instanceofමෙහි අසාමාන්‍ය කේතීකරණ පිළිවෙත් අනුගමනය නොකරන්නේ නම් මෙහි ඇති චෙක්පත අර්ථ විරහිත ශබ්දයක් වන අතර, මෙම පිළිතුර එය කරන්නේ කුමක්ද යන්න හෝ ඔබ එය භාවිතා කරන්නේ ඇයිද යන්න පැහැදිලි කිරීමට කිසිවක් නොකරයි. ඔබට එය අවශ්‍ය වන එකම හේතුව වන්නේ ඔබ වස්තූන් ඔතා ඇති නූල් භාවිතා කිරීමයි, නමුත් වස්තූන් ඔතා ඇති නූල් යනු කිසිවෙකු භාවිතා නොකරන වැදගැම්මකට නැති අංගයක් වන අතර ගූගල් සහ ක්‍රොක්ෆර්ඩ් යන දෙදෙනාම නරක පුරුද්දක් ලෙස හෙළා දකී ( google-styleguide.googlecode.com/svn/ trunk /… , crockford.com/javascript/recommend.html ).
මාර්ක් අමරි

83
නුසුදුසු අවස්ථාවන් නිවැරදිව හසුරුවන code න කේතයක් ලිවීම වැළැක්විය යුතු දෙයක් බව මම තරයේ ප්‍රතික්ෂේප කරමි. දෙකම පරීක්ෂා කිරීම typeofසහ instanceofඔබේ කේතය අන් අය විසින් කැඳවනු ලැබුවහොත් හොඳ උපදෙස් ලෙස හැඟේ. @ මාක් අමරිගේ postmessageඅද්දර නඩුව වැදගත් වන්නේ ඔබ "මම postmessageකුමක්ද?" - නමුත් ඔබ බලාපොරොත්තු වන්නේ එය අතුරු මුහුණතේ හැසිරවිය යුතු අතර ප්‍රචාරණය කිරීමට ඉඩ නොදේ. වෙනත් තැනක, සමහර ජේඑස් සෞන්දර්යයන් ඒවා ප්‍රතික්ෂේප කළත්, නොසලකා හරින ලද කේතකරණ ක්‍රම හැසිරවීම නිවැරදි බව පෙනේ. ඔබේ කේතය සත්‍ය ලෙසම සිදු නොවන්නේ නම් එය පිළිගැනීමක් ලෙස කිසි විටෙකත් අදහස් දක්වන්න එපා!
ඩිවි මෝගන්

163

580+ පුද්ගලයින් වැරදි පිළිතුරක් සඳහා ඡන්දය දී ඇති අතර, 800+ ක් වැඩ කරන නමුත් වෙඩි බෙහෙත් විලාසිතාවේ පිළිතුරක් සඳහා ඡන්දය දී ඇති හෙයින්, මගේ පිළිතුර සෑම කෙනෙකුටම තේරුම් ගත හැකි සරල ආකාරයකින් නැවත කිරීම වටී යැයි මම සිතුවෙමි.

function isString(x) {
  return Object.prototype.toString.call(x) === "[object String]"
}

නැතහොත්, පේළියේ (මට මේ සඳහා අල්ටිස්නිප් සැකසුමක් ඇත):

Object.prototype.toString.call(myVar) === "[object String]"

FYI, පැබ්ලෝ සැන්ටා ක ru ස්ගේ පිළිතුර වැරදියි, මන්ද typeof new String("string") කියන්නේobject

ඩ්‍රැක්ස්ගේ පිළිතුර නිවැරදි හා ක්‍රියාකාරී වන අතර එය නිවැරදි පිළිතුර විය යුතුය (පැබ්ලෝ සැන්ටා ක ru ස් නිසැකවම වැරදියි, මම ජනප්‍රිය ඡන්දයට එරෙහිව තර්ක නොකරමි.)

කෙසේ වෙතත්, මෙම පිළිතුර ද නියත වශයෙන්ම නිවැරදි වන අතර ඇත්ත වශයෙන්ම හොඳම පිළිතුර (සමහර විට, ලොඩාෂ් / යටි ඉරි ලකුණු භාවිතා කිරීම හැර ).වියාචනය: මම ලොඩාෂ් 4 කේත පදනමට දායක විය.

මගේ මුල් පිළිතුර (පැහැදිලිවම හිස් ගොඩක් උඩින් පියාසර කර ඇත):

මම මෙය underscore.js වෙතින් සම්ප්‍රේෂණය කළෙමි:

['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'].forEach( 
    function(name) { 
        window['is' + name] = function(obj) {
              return toString.call(obj) == '[object ' + name + ']';
    }; 
});

එය isString, isNumber යනාදිය අර්ථ දක්වනු ඇත.


Node.js හි මෙය මොඩියුලයක් ලෙස ක්‍රියාත්මක කළ හැකිය:

module.exports = [
  'Arguments',
  'Function', 
  'String', 
  'Number', 
  'Date', 
  'RegExp'
].reduce( (obj, name) => {
  obj[ 'is' + name ] = x => toString.call(x) == '[object ' + name + ']';
  return obj;
}, {});

[සංස්කරණය]: Object.prototype.toString.call(x)ශ්‍රිත සහ අසින්ක් ශ්‍රිත අතර විග්‍රහ කිරීමට ක්‍රියා කරයි:

const fn1 = () => new Promise((resolve, reject) => setTimeout(() => resolve({}), 1000))
const fn2 = async () => ({})

console.log('fn1', Object.prototype.toString.call(fn1))
console.log('fn2', Object.prototype.toString.call(fn2))


12
ඔබ නිර්දේශ කරන්නේ underscore.js (කුමන අමුතු හේතුවක් නිසාද?) නමුත් ඔබ එය මෙහි භාවිතා නොකරයි. එපමණක් නොව ඔබ ගෝලීය නාම අවකාශය කාර්යයන් සමඟ දූෂණය කරයි. Node.js හි ඔබ මෙම සියලු කාර්යයන් ඇති මොඩියුලයක් සාදනු ඇත (ඔබට ඒ වෙනුවට භාවිතා කළ හැකි නමුත් එය ඔබට මුලින් නොතිබිය යුතු ගැටලුවක් විසඳීමට නරක ප්‍රවේශයක් වනු ඇත). global || windowwindow
බෙන්ජමින් ග ru න්බෝම්

19
En බෙන්ජමින් ග ru න්බෝම් මම OP හි ප්‍රශ්නයට පිළිතුර සොයමින් ආවා, කිසිම පිළිතුරකට කැමති වුණේ නැහැ. ඒ නිසා මම අවධාරනය කළේ කුමක් දැයි පරීක්ෂා කර බැලුවෙමි, එය ටිකක් උපුටා ගැනීමට හා වෙනස් කිරීමට තරම් ප්‍රමාණවත් යැයි සිතුවෙමි (යටි ඉරි සහිත පුස්තකාලය පටවා නොගැනීම සඳහා). මම මගේ සටහන පැහැදිලි කරන්නම්.
ඕවල්ලොෆිල්

2
R ඕර්වෙලොෆිල් කූල්, මට දැන් එය තේරුණා, ඔබේ මුල් පිළිතුර ඔබ විසින්ම අවධාරනය කරන්නැයි යෝජනා කළාක් මෙන්. පුද්ගලිකව මම myObject+"" === myObjectවස්තුවක් නූලක් දැයි පරීක්ෂා කර බැලීමට (හෝ ඊටත් වඩා හොඳ නම්, මම මුලින් චර්යා රටා මත පදනම් වූ පද්ධතියක් පරීක්ෂා නොකරමි).
බෙන්ජමින් ග ru න්බෝම්

20
R ඕර්වෙලෝෆිල්, මෙය ඩ්‍රැක්ස්ගේ පිළිතුරට වඩා හොඳ වන්නේ කෙසේද?
පැසීරියර්

3
ජේඑස් වඳුරන් පැච් කිරීම සඳහා සහය දක්වයි, එබැවින් එය නැවත අර්ථ දැක්විය toStringහැකිය Object.prototype. ඉතින්, මම තර්ක කරන්නේ toStringවස්තුවක වර්ගය පරීක්ෂා කිරීම මත රඳා සිටීම නරක පුරුද්දක් බවයි.
ඇන්ඩ්‍රේ රොඩ්‍රිගුස්

85

මම සිට බිල්ට් කාර්යයන් භාවිතා කිරීම නිර්දේශ jQuery හෝ lodash / Underscore . ඒවා භාවිතා කිරීමට පහසු සහ කියවීමට පහසුය.

එක්කෝ ශ්‍රිතය DRAX හි සඳහන් නඩුව හසුරුවනු ඇත ... එනම්, ඒ දෙකම (A) විචල්‍යය වචනාර්ථයක්ද නැතිනම් (B) එය සංගීත වස්තුවේ උදාහරණයක්ද යන්න පරීක්ෂා කරයි. කෙසේ වෙතත්, මෙම ශ්‍රිතයන් අගය නිවැරදිව හඳුනා ගනී.

lodash / Underscore.js

if(_.isString(myVar))
   //it's a string
else
   //it's something else

jQuery

if($.type(myVar) === "string")
   //it's a string
else
   //it's something else

වැඩි විස්තර සඳහා _.isString () සඳහා ලොඩාෂ් ප්‍රලේඛනය බලන්න .

වැඩි විස්තර සඳහා j .type () සඳහා jQuery ප්‍රලේඛනය බලන්න .


98
ජේ. යමෙකු දැනටමත් මෙම පුස්තකාල වලින් එකක් භාවිතා කරන්නේ නම් එය හොඳ අදහසක් විය හැකිය, නමුත් වර්ගය පරීක්ෂා කිරීම වෙනුවට ඒවා බාගත කිරීම අතිරික්තයකි.
Rafał Wrzeszcz

5
මම රෆල් සමඟ එකඟ වන්නෙමි. මෙම බාහිර පුස්තකාලවලින් එකක් භාවිතා කිරීමට "කියවීමේ හැකියාව" වැඩි දියුණු කරන බව මම සෑම තැනකම දකිමි. ඔබ ජාවාස්ක්‍රිප්ට් දන්නේ නම්, ඔබ භාවිතා නොකළ බාහිර පුස්තකාලයකට වඩා එය කියවීම පහසුය. _.every()මුලදී භාවිතා කිරීම ටිකක් අවුල් සහගත වන _.isBoolean()අතර මගේ සමාගම තුළ devs ව්යාකූල කර ඇති තරම් සරල දෙයක් . දේවාලය වැරදියට සිතුවේ වටිනාකම බූලියන් එකක් නම් සහ එය අසත්‍යයක් නම් එය අසත්‍ය බවයි. මට ජර්මන් භාෂාව නොදන්නා නිසා ඉංග්‍රීසි මට ජර්මානු භාෂාවට වඩා කියවීමට පහසුය. ජාවාස්ක්‍රිප්ට් ඉගෙන ගන්න, ඒ සියල්ල අර්ථවත් වනු ඇත.
ජෝන් හාඩිං

20
@ RafałWrzeszcz මෙම පුස්තකාල තරමක් පුළුල් ලෙස භාවිතා වන අතර බොහෝ ප්‍රයෝජනවත් (සහ පරීක්ෂා කළ) ක්‍රියාකාරිත්වය සපයයි. විශේෂයෙන් ලොඩාෂ්. මෙම එක් විසඳුමක් සඳහා පමණක් පුස්තකාලය බාගත කිරීමට මම නිර්දේශ නොකරමි .... නමුත් සෑම ජාවාස්ක්‍රිප්ට් සංවර්ධකයෙකුම මෙම පුස්තකාලය බාගත කර ඔවුන් අතපසු වී ඇති දේ බලන්නැයි මම නිර්දේශ කරමි. ;)
ClearCloud8

13
ලොඩාෂ් වැනි පුස්තකාලයක ලක්ෂ්‍යය සියල්ලටම මග හැරී ඇත: වේගය නොවේ. "සංවර්ධනයේ පහසුව" නොවේ. ලොඩාෂ් වැනි පුස්තකාලයක් භාවිතා කිරීමට හේතුව ඔබගේ ජේඑස් යෙදුම පුපුරවා හරින ගැටළු වලට එරෙහිව “ආරක්‍ෂාව” සපයයි. ඔබ වස්තුවක් මත (හෝ අනෙක් අතට) නූල් මෙහෙයුම් කිරීමට උත්සාහ කරන විට මාරාන්තික දෝෂ සිදු වන අතර, එම දෝෂයන් වළක්වා ගැනීම සඳහා ලොඩාෂ් විශාල වටිනාකමක් ලබා දෙයි.
random_user_name

1
බොහෝ අය මෙය කරන්නේ නෝඩ් හෝ නෝඩ් වැනි පරිසරයක බව මතක තබා ගන්න, ඉතා සුළු පිරිසක් එහි jQuery භාවිතා කරනු ඇත.
මැට් ෆ්ලෙචර්

35
function isString (obj) {
  return (Object.prototype.toString.call(obj) === '[object String]');
}

මම එය මෙහි දුටුවෙමි:

http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/


4
පිළිතුරෙහි දක්වා ඇති URL හි සඳහන් කර ඇති පරිදි හරස් රාමු / හරස් කවුළු යොමු අවස්ථා හසුරුවන බැවින් මෙම විසඳුම වඩාත් ශක්තිමත් යැයි මම සිතමි.
ewh

1
නියම පිළිතුර, Underscore.js ද මෙම ක්‍රමය භාවිතා කරන බව පෙනේ!
දාන්

1
@ling කුතුහලයෙන් යුතුව, ඔබ වරහන් වටා තබන්නේ Object.prototype.toString.call(obj) === '[object String]'ඇයි?
මුරණ්ඩු ෂෝවාගු

Ar අර්ලී ඔබ අදහස් කළේ (x === y)වඩා හොඳ කියවීමේ හැකියාව ඇති බවයි x === y?
මුරණ්ඩු ෂෝවාගු

මගේ මතය අනුව, ඔව්. එය අනුකූලතාව ගැන ද වේ. වටිනාකමක් ලබා දීමේදී මම පෞද්ගලිකව වරහන් වර්‍ග භාවිතා කරමි.
Aquarelle

28

හොඳම ක්‍රමය:

var s = 'String';
var a = [1,2,3];
var o = {key: 'val'};

(s.constructor === String) && console.log('its a string');
(a.constructor === Array) && console.log('its an array');
(o.constructor === Object) && console.log('its an object');
(o.constructor === Number || s.constructor === Boolean) && console.log('this won\'t run');

මේ සෑම එකක්ම "නව වස්තුව ()" වැනි සුදුසු පන්ති ක්‍රියාකාරිත්වය මගින් ගොඩනගා ඇත.

එසේම, තාරා-ටයිප් කිරීම: "එය තාරාවෙකු මෙන් පෙනේ නම්, තාරාවෙකු මෙන් ඇවිදින අතර, තාරාවෙකු මෙන් සුවඳයි - එය අරාව විය යුතුය" අර්ථය, එහි ගුණාංග පරීක්ෂා කරන්න.

මෙය උපකාරී වේ යැයි සිතමි.

සංස්කරණය කරන්න; 12/05/2016

මතක තබා ගන්න, ඔබට සැමවිටම ප්‍රවේශයන්ගේ සංයෝජන භාවිතා කළ හැකිය. Typeof සමඟ ක්‍රියා වල පේළිගත සිතියමක් භාවිතා කිරීම පිළිබඳ උදාහරණයක් මෙන්න :

var type = { 'number': Math.sqrt.bind(Math), ... }[ typeof datum ];

පේළිගත කිරීමේ සිතියම් භාවිතා කිරීම පිළිබඳ වඩාත් 'සැබෑ ලෝකය' උදාහරණයක් මෙන්න:

function is(datum) {
    var isnt = !{ null: true, undefined: true, '': true, false: false, 0: false }[ datum ];
    return !isnt;
}
console.log( is(0), is(false), is(undefined), ... );  // >> true true false

විචල්‍යයක් ඇත්ත වශයෙන්ම "පවතී" දැයි සොයා ගැනීමට මෙම ශ්‍රිතය [අභිරුචි] "ටයිප්-කාස්ටිං" - ඒ වෙනුවට "ටයිප් - / - අගය-සිතියම්කරණය" භාවිතා කරයි. දැන් ඔබට එම නපුරු කොණ්ඩය null& 0!

බොහෝ විට ඔබ එහි වර්ගය ගැන තැකීමක් නොකරයි . ටයිප් කිරීම වළක්වා ගත හැකි තවත් ක්‍රමයක් නම් තාරා වර්ගයේ කට්ටල ඒකාබද්ධ කිරීමයි:

this.id = "998";  // use a number or a string-equivalent
function get(id) {
    if (!id || !id.toString) return;
    if (id.toString() === this.id.toString()) http( id || +this.id );
    // if (+id === +this.id) ...;
}

දෙකම Number.prototype සහ String.prototype a .toString() method. අංකයට සමාන නූල් සමාන බව ඔබ සහතික කර ගත් අතර, ඔබ එය httpa ලෙස ශ්‍රිතයට ඇතුළත් කිරීමට වග බලා ගත්තේය Number. වෙනත් වචනවලින් කියනවා නම්, අපි පවා නැත සැලකිල්ලක් එහි වර්ගය කුමක්ද.

ඔබ සමඟ වැඩ කිරීමට වැඩි යමක් ලබා දෙන බලාපොරොත්තුව :)


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

oratorazaburo දැන් Chrome කොන්සෝලය තුළ මට හොඳින් වැඩ කළා. එය ක්‍රියා නොකරනු ඇතැයි ඔබ සිතන්නේ කුමක් ද?
අමරි

2
oratorazaburo ඔබට ප්‍රකාශ ( (o.constructor === Number || s.constructor === Boolean)) සමඟ සෙල්ලම් කිරීමට අවශ්‍ය විය හැකිය . මුලින්ම, parseIntහා NaNබිඳෙන සුළු නමුත් ප්රබල මෙවලම් වේ. මතක තබා ගන්න, අංකයක් නොවන අංකයක් නොවන අතර නිර්වචනය කළ නොහැකි ලෙස අර්ථ දැක්විය හැකිය.
කෝඩි

1
a.constructor === අරාව වැරදියි, සමහර විට අසමත් විය හැකිය, Array.isArray බලන්න web.mit.edu/jwalden/www/isArray.html
axkibe

1
එකඟයි, මෙය අසාර්ථක-ආරක්ෂිත නොවේ. වඩා හොඳ ක්‍රමයක් වන්නේ දේපල චෙක්පත් භාවිතා කිරීමයි - මේ මොහොතේ ඇති එකම අසාර්ථක-ආරක්ෂිත ක්‍රමය එයයි. උදාහරණය: if(thing.call) { 'its a function'; }හෝ if(thing.defineProperties) { 'its an object'; }. ආදානයට ස්තූතියි, ඇක්ස්කිබේ!
කෝඩි

19

typeofමෙම නඩුවේදී යමෙකු සරලව භාවිතා නොකරන්නේ මන්දැයි මට අවංකවම දැකිය නොහැක :

if (typeof str === 'string') {
  return 42;
}

ඔව්, එය වස්තූන් ඔතා ඇති නූල් වලට එරෙහිව අසමත් වනු ඇත (උදා new String('foo')) නමුත් මේවා නරක පුරුද්දක් ලෙස පුළුල් ලෙස සලකනු ලබන අතර බොහෝ නවීන සංවර්ධන මෙවලම් ඒවායේ භාවිතය අධෛර්යමත් කිරීමට ඉඩ ඇත. (ඔබ එකක් දුටුවහොත් එය නිවැරදි කරන්න!)

මෙම Object.prototype.toStringඋපක්රමය තම වෘත්තීමය ජීවිතය තුළ එක් දින කරන්නේ වරදකරු සියළු ඉදිරි අවසන් සංවර්ධකයින් ඇති දෙයක් වන නමුත් එය දක්ෂ එහි ඔප විසින් ඔබ මෝඩයෙක් ඉඩ දෙන්න එපා: එය, වඳුරු-ලප ඉක්මනින් ලෙස වස්තූන් මූලාකෘති කඩා බිඳ දමනු ඇත:

const isString = thing => Object.prototype.toString.call(thing) === '[object String]';

console.log(isString('foo'));

Object.prototype.toString = () => 42;

console.log(isString('foo'));


15

මෙම සරල විසඳුම භාවිතා කිරීමට මම කැමතියි:

var myString = "test";
if(myString.constructor === String)
{
     //It's a string
}

3
අවුරුදු 4 කට පසු කෝඩිගේ පිළිතුරට වඩා එය වෙනස් වන්නේ කෙසේද?
ජොනතන් එච්

3
She ෂෙල්ජොන් කෝඩිගේ පිළිතුර විශිෂ්ටයි. මගේ පිළිතුර (සම්පූර්ණ පා text ය) කෙටි වන අතර එය කෙළින්ම වේ. ඔබ ඇසුවා ... :)
ScotttyG

ශ්‍රිතයක් ලෙස, මෙය සමඟ ගනුදෙනු කිරීමේ ක්‍රමයක් අවශ්‍ය වන undefinedඅතර null, හිස් නූල් සඳහා නිවැරදි පිළිතුර ලබා ගැනීම (දෙකම ''සහ new String('')).
මයික් බීටන්

IkeMikeBeaton ගැටළුවක් නැත : (mystring || false) && mystring.constructor === String. බූලියන් ආපසු ලබා දිය යුතු ශ්‍රිතයක එය භාවිතා කර ඇත්නම් මම අසත්‍යය භාවිතා කළෙමි.
ඇලන්ස්

13

කාර්ය සාධනය වැදගත් වන්නේ මන්ද යන්නට මෙය හොඳ උදාහරණයකි:

නිවැරදිව සිදු නොකළ හොත් නූලක් සඳහා පරීක්ෂණයක් තරම් සරල දෙයක් කිරීම මිල අධික විය හැකිය.

උදාහරණයක් ලෙස, යමක් නූලක් දැයි පරීක්ෂා කිරීම සඳහා ශ්‍රිතයක් ලිවීමට මට අවශ්‍ය නම්, මට එය ක්‍රම දෙකෙන් එකකින් කළ හැකිය:

1) const isString = str => (Object.prototype.toString.call(str) === '[object String]');

2) const isString = str => ((typeof str === 'string') || (str instanceof String));

මේ දෙකම කෙළින්ම ඉදිරියට ය, එබැවින් කාර්ය සාධනය කෙරෙහි බලපෑම් ඇති කළ හැක්කේ කුමක් ද? පොදුවේ ගත් කල, ක්‍රියාකාරී ඇමතුම් මිල අධික විය හැකිය, විශේෂයෙන් ඇතුළත සිදුවන්නේ කුමක්දැයි ඔබ නොදන්නේ නම්. පළමු උදාහරණයේ දී, Object's toString ක්‍රමයට ක්‍රියාකාරී ඇමතුමක් ඇත. දෙවන උදාහරණයේ දී, ක්‍රියාකාරී ඇමතුම් නොමැත, යතුරු ලියනය සහ නිදර්ශන ක්‍රියාකරුවන් බැවින්. ක්‍රියාකරුවන් ඇමතුම් වලට වඩා සැලකිය යුතු වේගයකින් ක්‍රියා කරයි.

කාර්ය සාධනය පරීක්ෂා කළ විට, උදාහරණ 1 උදාහරණ 2 ට වඩා 79% මන්දගාමී වේ!

පරීක්ෂණ බලන්න: https://jsperf.com/isstringtype


පරීක්ෂණ සබැඳිය මිය ගොස් ඇත, නමුත් මම ඔබව විශ්වාස කරමි. මේ ආකාරයේ තොරතුරු ඉතා වැදගත් ය. IMHO මෙය විය යුත්තේ, වඩාත්ම උද්දීපනය කළ පිළිතුර නොවේ නම්, අවම වශයෙන් වර්තමාන ප්‍රමුඛ පිළිතුර පිළිබඳ වඩාත්ම උඩු යටිකුරු කළ ප්‍රකාශය විය යුතුය.
කෝඩරර්

typeof str === 'string' || str instanceof String( if (..)අවස්ථා වලදී මා කැමති වරහන් වර්‍ගය අතහැර දැමිය හැකිය ); නොසලකා, # 2 හි ප්‍රාථමික හා වස්තු වර්ග දෙකම පරීක්ෂා කිරීම පැහැදිලි සහ ප්‍රමාණවත් වේ. කෙසේ වෙතත් මෙම චෙක්පත් 'දුර්ලභ' විය යුතුය.
user2864740

13
if (s && typeof s.valueOf() === "string") {
  // s is a string
}

නූල් වචනාර්ථ let s = 'blah'සඳහා සහ වස්තු නූල් සඳහා ක්‍රියා කරයිlet s = new String('blah')


3
අවධානය! හිස් නූල් මත මෙය අසාර්ථක වනු ඇත.
පිලිප් සුමි

8

ලොඩාෂ් වලින් ගත්:

function isString(val) {
   return typeof val === 'string' || ((!!val && typeof val === 'object') && Object.prototype.toString.call(val) === '[object String]');
}

console.log(isString('hello world!')); // true
console.log(isString(new String('hello world'))); // true

යමෙකුට මූලාශ්‍රය දැන ගැනීමට අවශ්‍ය නම් එය github.com/lodash/lodash/blob/master/isString.js
රිකාඩෝ කැනලස්

5

මෙයද හොඳින් ක්‍රියාත්මක වන බවත් අනෙක් උදාහරණවලට වඩා එය ඉතා කෙටි බවත් මම සොයා ගතිමි.

if (myVar === myVar + '') {
   //its string
} else {
   //its something else
}

හිස් මිල ගණන් සමඟ සංක්ෂිප්ත කිරීමෙන් එය අගය නූලක් බවට පත් කරයි. නම් myVarමේ වන විටත් වැලක් පසුව නම් ප්රකාශය සාර්ථක වේ.


3
එකම ගැටළුව නම්, ඔබ එහි වර්ගය පරීක්ෂා කිරීමට අවශ්‍ය විට විචල්‍යයක් බල කිරීම ය. සසඳන විට එය මට ටිකක් මිල අධික බව පෙනේ typeof.
ඔලිකල්

1
ඉතින් ඔව්, ඔබ හරි. jsperf පැවසුවේ එය 20% ට වඩා මන්දගාමී typeofනමුත් තවමත් තරමක් වේගවත් බවයි toString. කොහොම වුනත්, මම හිතන්නේ මම බලහත්කාරය සඳහා වාක්‍ය ඛණ්ඩයට කැමතියි.
ක්‍රිස් ඩොල්ෆින්

4
මෙය සංගීත වර්ගය සමඟ ක්‍රියා නොකරයි; var s = new String('abc'); > s === s + '' > false
user5672998

1
new Stringවර්ගයක් නිර්මාණය කරන cus සමඟ ක්‍රියා නොකරයි object. w3schools.com/js/tryit.asp?filename=tryjs_string_object2
ක්‍රිස් ඩොල්ෆින්

හොඳ සිතුවිල්ලක්, නමුත් වස්තු ඔතා ඇති නූල් වල අද්දර නඩුව අතහැර දමයි.
ඇන්තනි රට්ලෙජ්

5

ඔබගේ නඩු වලින් 90% ක් සඳහා @customcommander විසඳුම ප්‍රමාණවත් යැයි මම සිතමි:

typeof str === 'string'

ඔබට නිවැරදිව සේවය කළ යුතුය (සාමාන්‍යයෙන් new String('something')ඔබේ කේතයේ කිසිදු හේතුවක් නොමැති බැවින් ).

ඔබ Stringවස්තුව හැසිරවීමට උනන්දුවක් දක්වන්නේ නම් (නිදසුනක් ලෙස ඔබ තෙවන පාර්ශවයකින් යම් ප්‍රභේදයක් බලාපොරොත්තු වේ) එවිට lodash @ ClearCloud8 ලෙස භාවිතා කිරීම පැහැදිලි, සරල හා අලංකාර විසඳුමක් සේ පෙනේ.

කෙසේ වෙතත්, ලොඩාෂ් වැනි පුස්තකාලවල ප්‍රමාණය නිසා ප්‍රවේශම් වන්නැයි මම යෝජනා කරමි. කරනවා වෙනුවට

import _ from 'lodash'
...
_.isString(myVar)

එමඟින් විශාල ලොඩාෂ් වස්තුව ගෙන එනු ඇත, මම මෙවැනි දෙයක් යෝජනා කරමි:

import { isString as _isString } from 'lodash'
...
_isString(myVar)

සරල බැඳීමකින් ඔබ හොඳින් විය යුතුය (මම මෙහි යොමු කරන්නේ සේවාදායක කේතය වෙත).


ඇයි === විට == ප්‍රමාණවත්
zavr

4

ඔබ node.js පරිසරය මත වැඩ කරන්නේ නම්, ඔබට හුදෙක් බිල්ට් ශ්‍රිතය භාවිතා කළ හැකිය isString in utils.

const util = require('util');
if (util.isString(myVar)) {}

සංස්කරණය කරන්න: @ ජේහි සඳහන් කළ පරිදි, මෙය v4 සිට ඉවත් කරනු ලැබේ.


ආදේශකයක් තිබේද?
ඇන්තනි කොං

3
" typeof value === 'string'ඒ වෙනුවට භාවිතා කරන්න" යනුවෙන් ලේඛන පවසයි .
රොජර්ස් මහතා

x = new String('x'); x.isString(x);වැරදි ලෙස ආපසු එයි . නැත util.types.isStringObject()නමුත් ප්රතිලාභ බොරු බව x = 'x'වර්ගය string. කිසිදු උපයෝගීතාවයක් ලබා නොදෙන උපයෝගිතා කාර්යයන් දෙකක් ...
ස්පින්කස්

4

පහත දැක්වෙන ක්‍රමය මඟින් කිසියම් විචල්‍යයක් නූලක් දැයි පරීක්ෂා කරනු ඇත ( නොපවතින විචල්‍යයන් ද ඇතුළුව ).

const is_string = value => {
  try {
    return typeof value() === 'string';
  } catch (error) {
    return false;
  }
};

let example = 'Hello, world!';

console.log(is_string(() => example)); // true
console.log(is_string(() => variable_doesnt_exist)); // false

3
var a = new String('')
var b = ''
var c = []

function isString(x) {
  return x !== null && x !== undefined && x.constructor === String
}

console.log(isString(a))
console.log(isString(b))
console.log(isString(c))

X.constructor === නූල් ද ශුන්‍ය හෝ නිර්වචනය නොකළ වැරදි සඳහා ආපසු එන්නේ නම් ඔබ ශුන්‍ය හෝ නිර්වචනය නොකළදැයි පරීක්ෂා කළ යුත්තේ ඇයි?
ජූල්ස් මෑන්සන්

1
Ules ජූල්ස්මන්සන්: එය දෝෂයක් ඇති කරයි, නිෂ්පාදනය නොකරයි false.
රයි-

3

String සඳහා ටයිප් කිරීම සඳහා මෙම සරල තාක්ෂණය ප්‍රයෝජනවත් බව මට පෙනේ -

String(x) === x // true, if x is a string
                // false in every other case

const test = x =>
  console.assert
    ( String(x) === x
    , `not a string: ${x}`
    )

test("some string")
test(123)           // assertion failed
test(0)             // assertion failed
test(/some regex/)  // assertion failed
test([ 5, 6 ])      // assertion failed
test({ a: 1 })      // assertion failed
test(x => x + 1)    // assertion failed

එම තාක්ෂණය සඳහා වැඩ අංකය ද -

Number(x) === x // true, if x is a number
                // false in every other case

const test = x =>
  console.assert
    ( Number(x) === x
    , `not a number: ${x}`
    )

test("some string") // assertion failed
test(123)           
test(0)             
test(/some regex/)  // assertion failed
test([ 5, 6 ])      // assertion failed
test({ a: 1 })      // assertion failed
test(x => x + 1)    // assertion failed

සහ RegExp සඳහා -

RegExp(x) === x // true, if x is a regexp
                // false in every other case

const test = x =>
  console.assert
    ( RegExp(x) === x
    , `not a regexp: ${x}`
    )

test("some string") // assertion failed
test(123)           // assertion failed
test(0)             // assertion failed
test(/some regex/)  
test([ 5, 6 ])      // assertion failed
test({ a: 1 })      // assertion failed
test(x => x + 1)    // assertion failed

වස්තුව සඳහා සමාන -

Object(x) === x // true, if x is an object
                // false in every other case

සැ.යු, රීජෙක්ස්, අරා සහ ශ්‍රිත ද වස්තු ලෙස සැලකේ.

const test = x =>
  console.assert
    ( Object(x) === x
    , `not an object: ${x}`
    )

test("some string") // assertion failed
test(123)           // assertion failed
test(0)             // assertion failed
test(/some regex/)  
test([ 5, 6 ])      
test({ a: 1 })      
test(x => x + 1)    

එහෙත්, අරාව පරීක්ෂා කිරීම ටිකක් වෙනස් ය -

Array.isArray(x) === x // true, if x is an array
                       // false in every other case

const test = x =>
  console.assert
    ( Array.isArray(x)
    , `not an array: ${x}`
    )

test("some string") // assertion failed
test(123)           // assertion failed
test(0)             // assertion failed
test(/some regex/)  // assertion failed
test([ 5, 6 ])      
test({ a: 1 })      // assertion failed
test(x => x + 1)    // assertion failed

මෙම තාක්ෂණය වන්නේ නැහැ වැඩ කාර්යයන් කෙසේ වෙතත් -

Function(x) === x // always false

var x = new String(x); String(x)===xවැරදි ලෙස ආපසු එයි. කෙසේ වෙතත් ({}).toString.call(x).search(/String/)>0සෑම විටම දැඩි දේ සඳහා නැවත පැමිණේ
සමමුහුර්ත නොකළ

1
function isClass(x,re){return ({}).toString.call(x).search(re)>0;}; isClass("hello",/String/) හෝ isClass(3,/Number/)හෝisClass(null,/Null/)
සමමුහුර්ත නොකළ

2

සරල විසඳුමක් වනුයේ:

var x = "hello"

if(x === x.toString()){
// it's a string 
}else{
// it isn't
}

1
මෙය නූලක් දැයි පරීක්ෂා නොකරයි . එය නූලක් බවට පත් කරයි, බොහෝ දේ toString()ක්‍රියාත්මක වේ
මුහම්මද් උමර්

7
U මුහම්මද්උමර් ඔව්, එය නූලක් බවට පරිවර්තනය කරන නමුත් මුල් අගයට සාපේක්ෂව අනන්‍යතාවය පරික්ෂා කරයි, එය සත්‍ය වනුයේ මුල් අගය ද නූලක් නම් පමණි.
මිස්ටර් වයිට්

4
මෙය වැරදියි: ඔබට .toStringකිසිදු අගයක් අන්ධ ලෙස ඇමතිය නොහැක ; පරීක්ෂා කළ යුතු x ශුන්‍ය හෝ නිර්වචනය කර නොමැති නම් උත්සාහ කරන්න, ඔබේ කේත විසි කිරීමේ ව්‍යතිරේකය
user5672998

1
අදහස තවමත් භාවිතා කළ හැකිය. x === නූල් (x) ආරක්ෂිත වන අතර ක්‍රියා කරයි.
Monrton Sári

ඇත්තටම? මෙම විසඳුම මට එතරම් අමුතු දෙයක් ලෙස පෙනේ, මන්ද toString()ක්‍රමවේදය ඉක්මවා ගොස් ව්‍යතිරේකයක් විසි කළ හැකිය (යම් නිශ්චිත ක්‍රියාත්මක කිරීමක් හේතුවෙන්), ඔබේ චෙක්පත නිසැකවම ක්‍රියාත්මක නොවනු ඇත. ප්‍රධාන අදහස නම් ඔබට ලබා ගැනීමට අවශ්‍ය දේ හා සම්බන්ධ නොවන ක්‍රම ඔබ ඇමතිය යුතු නැති බවයි. මම toStringක්‍රමයට සම්බන්ධ අනවශ්‍ය පොදු කාර්ය ගැන කතා නොකරමි . පහත් කිරීම.
රුස්ටම් සින්නාටුලින්

2

යතුරු ලියන පරීක්‍ෂක සහායකයෙක්:

function isFromType(variable, type){
  if (typeof type == 'string') res = (typeof variable == type.toLowerCase())
  else res = (variable.constructor == type)
  return res
}

භාවිතය:

isFromType('cs', 'string') //true
isFromType('cs', String) //true
isFromType(['cs'], Array) //true
isFromType(['cs'], 'object') //false

එසේම එය පුනරාවර්තන වීමට ඔබට අවශ්‍ය නම් (අරාව වස්තුවක් වැනි), ඔබට භාවිතා කළ හැකිය instanceof .

( ['cs'] instanceof Object //true)


2

මම මෙහි ඉතිරි කොටස වෙත වෙනත් මාර්ගයකට යන්නෙමි, එය විචල්‍යයක් නිශ්චිතද, නැතහොත් නිශ්චිත කට්ටලයක සාමාජිකද යන්න පැවසීමට උත්සාහ කරයි.
ජේඑස් ගොඩනඟා ඇත්තේ තාරාවන් මත ය; යම් දෙයක් නූල් වැනි දෙයක් නම්, අපට එය නූල් මෙන් භාවිතා කළ හැකිය.

වන 7වැලක්? එහෙනම් ඇයි /\d/.test(7)වැඩ කරන්නේ ?
වන {toString:()=>('hello there')}වැලක්? එහෙනම් ඇයි ({toString:()=>('hello there')}) + '\ngeneral kenobi!'වැඩ කරන්නේ ?
මේවා කළ යුතු දේ පිළිබඳ ප්‍රශ්න නොවේ ඉහත සඳහන් .

ඒ නිසා මම පහත දැක්වෙන duckyString()ශ්‍රිතයක්
කළෙමි. වෙනත් පිළිතුරු මගින් සපයා නොමැති බොහෝ අවස්ථා මම පරීක්ෂා කරමි. එක් එක් කේතය සඳහා:

  • නූල් වැනි විචල්‍යයක් සකසයි
  • එය මත සමාන නූල් මෙහෙයුමක් සහ ප්‍රතිදානයන් සංසන්දනය කිරීම සඳහා සැබෑ නූලක් ක්‍රියාත්මක කරයි (ඒවා නූල් මෙන් සැලකිය හැකි බව ඔප්පු කිරීම)
  • duckyString()සැබෑ නූල් අපේක්ෂා කරන කේතය සඳහා යෙදවුම් සාමාන්‍යකරණය කිරීමට ඔබට පෙන්වීමට නූල්-සමාන සැබෑ නූලක් බවට පරිවර්තනය කරයි
text = 'hello there';
out(text.replace(/e/g, 'E') + ' ' + 'hello there'.replace(/e/g, 'E'));
out('Is string? ' + duckyString(text) + '\t"' + duckyString(text, true) + '"\n');

text = new String('oh my');
out(text.toUpperCase() + ' ' + 'oh my'.toUpperCase());
out('Is string? ' + duckyString(text) + '\t"' + duckyString(text, true) + '"\n');

text = 368;
out((text + ' is a big number') + ' ' + ('368' + ' is a big number'));
out('Is string? ' + duckyString(text) + '\t"' + duckyString(text, true) + '"\n');

text = ['\uD83D', '\uDE07'];
out(text[1].charCodeAt(0) + ' ' + '😇'[1].charCodeAt(0));
out('Is string? ' + duckyString(text) + '\t"' + duckyString(text, true) + '"\n');

function Text() { this.math = 7; }; Text.prototype = {toString:function() { return this.math + 3 + ''; }}
text = new Text();
out(String.prototype.match.call(text, '0') + ' ' + text.toString().match('0'));
out('Is string? ' + duckyString(text) + '\t"' + duckyString(text, true) + '"\n');

මේ වැනි සමාන ස්වරෑපයේ වේ !!xවිරුද්ධ ලෙස x===trueයමක් array- නම් සහ පරීක්ෂා වගේ සත්ය මාලාවක් සැලසුම් කර වෙනුවට.
jQuery වස්තු; ඒවා අරා ද? ඔවුන් හොඳද? ඔව්, ඔබට ඒවා හොඳින් ක්‍රියාත්මක කළ හැකිය Array.prototype.
මෙම නම්‍යතාවය JS හට එහි බලය ලබා දෙන අතර, නූල් පරීක්ෂා කිරීම මඟින් ඔබේ කේතය අඩු අන්තර්ක්‍රියාකාරී වේ.

ඉහත ප්‍රතිදානය:

hEllo thErE hEllo thErE
Is string? true "hello there"

OH MY OH MY
Is string? true "oh my"

368 is a big number 368 is a big number
Is string? true "368"

56839 56839
Is string? true "😇"

0 0
Is string? true "10"

ඉතින්, ඒ සියල්ල ඔබට යමක් දැන ගැනීමට අවශ්‍ය වන්නේ ඇයිද යන්න ගැන ය .
මා වැනි, ඔබ ගූගල් වෙතින් මෙහි පැමිණ යමක් නූල් වැනි දැයි බැලීමට අවශ්‍ය නම් , මෙන්න පිළිතුරක්.
ඔබ දිගු හෝ ගැඹුරින් කැදැලි කරල් අරා සමඟ වැඩ කරන්නේ නම් මිස එය මිල අධික නොවේ.
මෙයට හේතුව ප්‍රකාශ සියල්ලම නම්, කිසිදු ශ්‍රිතයක් කැඳවන්නේ නැත .toString().
හැරෙන්නට ඔබ උත්සාහ කරන්නේ නම්, වර්‍ග toString()හෝ බහු-බයිට් අක්ෂර පමණක් ඇති වස්තූන් සහිත වර්‍ග අරාවක් තිබේ නම්, එම අවස්ථාවේ දී නූල සෑදීම හැරෙන්නට වෙනත් ක්‍රමයක් පරික්ෂා කර බැලිය නොහැක.

function duckyString(string, normalise, unacceptable) {
    var type = null;
    if (!unacceptable)
        unacceptable = {};
    if (string && !unacceptable.chars && unacceptable.to == null)
        unacceptable.to = string.toString == Array.prototype.toString;

    if (string == null)
        ;

    //tests if `string` just is a string
    else if (
        !unacceptable.is &&
        (typeof string == 'string' || string instanceof String)
    )
        type = 'is';

    //tests if `string + ''` or `/./.test(string)` is valid
    else if (
        !unacceptable.to &&
        string.toString && typeof string.toString == 'function' && string.toString != Object.prototype.toString
    )
        type = 'to';

    //tests if `[...string]` is valid
    else if (
        !unacceptable.chars &&
        (string.length > 0 || string.length == 0)
    ) {
        type = 'chars';
        //for each char
        for (var index = 0; type && index < string.length; ++index) {
            var char = string[index];

            //efficiently get its length
            var length = ((duckyString(char, false, {to:true})) ?
                char :
                duckyString(char, true) || {}
            ).length;

            if (length == 1)
                continue;

            //unicode surrogate-pair support
            char = duckyString(char, true);
            length = String.prototype[Symbol && Symbol.iterator];
            if (!(length = length && length.call(char)) || length.next().done || !length.next().done)
                type = null;
        }
    }

    //return true or false if they dont want to auto-convert to real string
    if (!(type && normalise))
        //return truthy or falsy with <type>/null if they want why it's true
        return (normalise == null) ? type != null : type;

    //perform conversion
    switch (type) {
    case 'is':
        return string;
    case 'to':
        return string.toString();
    case 'chars':
        return Array.from(string).join('');
    }
}

සඳහා විකල්ප ඇතුළත් වේ

  • එය string-y ලෙස සලකන්නේ කුමන ක්‍රමයදැයි විමසන්න
  • නූල් හඳුනාගැනීමේ ක්‍රම බැහැර කරන්න (උදා: ඔබ අකමැති නම් .toString())

මම සම්පුර්ණ කරන්නෙකු බැවින් මෙන්න තවත් පරීක්ෂණ:

out('Edge-case testing')
function test(text, options) {
    var result = duckyString(text, false, options);
    text = duckyString(text, true, options);
    out(result + ' ' + ((result) ? '"' + text + '"' : text));
}
test('');
test(null);
test(undefined);
test(0);
test({length:0});
test({'0':'!', length:'1'});
test({});
test(window);
test(false);
test(['hi']);
test(['\uD83D\uDE07']);
test([['1'], 2, new String(3)]);
test([['1'], 2, new String(3)], {chars:true});
  • සියලුම negative ණාත්මක සිද්ධීන් සඳහා වගකිව යුතු බව පෙනේ
  • මෙය බ්‍රව්සර් මත ක්‍රියාත්මක විය යුතුය> = IE8
  • සංගීත අනුකාරක ආධාරයෙන් බ්‍රව්සර් සඳහා සහය දක්වන බයිට් කිහිපයක් සහිත චාර් අරා

ප්‍රතිදානය:

Edge-case testing
is ""
null null
null null
to "0"
chars ""
chars "!"
null null
chars ""
to "false"
null null
chars "😇"
chars "123"
to "1,2,3"

1

@ ඩ්‍රැක්ස්ගේ පිළිතුර පුළුල් කිරීම සඳහා , මම මෙය කරන්නෙමි:

function isWhitespaceEmptyString(str)
{
    //RETURN:
    //      = 'true' if 'str' is empty string, null, undefined, or consists of white-spaces only
    return str ? !(/\S/.test(str)) : (str === "" || str === null || str === undefined);
}

එය nulls සහ undefinedවර්ග සඳහා ද ගණන් ගනු ඇති අතර , එය වැනි නූල් නොවන වර්ග ගැන සැලකිලිමත් වනු ඇත 0.


1

මෙය මට ප්‍රමාණවත්.

අවවාදයයි: මෙය පරිපූර්ණ විසඳුමක් නොවේ. මගේ ලිපියේ පහළ බලන්න.

Object.prototype.isString = function() { return false; };
String.prototype.isString = function() { return true; };

var isString = function(a) {
  return (a !== null) && (a !== undefined) && a.isString();
};

ඔබට පහත පරිදි මෙය භාවිතා කළ හැකිය.

//return false
isString(null);
isString(void 0);
isString(-123);
isString(0);
isString(true);
isString(false);
isString([]);
isString({});
isString(function() {});
isString(0/0);

//return true
isString("");
isString(new String("ABC"));

අවවාදයයි: මෙය නඩුවේ වැරදි ලෙස ක්‍රියා කරයි:

//this is not a string
var obj = {
    //but returns true lol
    isString: function(){ return true; }
}

isString(obj) //should be false, but true

-1

ඕනෑම දෙයක් තීරණය කිරීම සඳහා ඔබට මෙම ශ්‍රිතය භාවිතා කළ හැකිය:

var type = function(obj) {
    return Object.prototype.toString.apply(obj).replace(/\[object (.+)\]/i, '$1').toLowerCase();
};

විචල්යයක් නූලක් දැයි පරීක්ෂා කිරීමට:

type('my string') === 'string' //true
type(new String('my string')) === 'string' //true
type(`my string`) === 'string' //true
type(12345) === 'string' //false
type({}) === 'string' // false

https://codepen.io/patodiblasi/pen/NQXPwY?editors=0012

වෙනත් වර්ග පරීක්ෂා කිරීම සඳහා:

type(null) //null
type(undefined) //undefined
type([]) //array
type({}) //object
type(function() {}) //function
type(123) //number
type(new Number(123)) //number
type(/some_regex/) //regexp
type(Symbol("foo")) //symbol

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

-2

stringඑහි අන්තර්ගතය නොසලකා එය වර්ගයක්ද, නැතහොත් එහි අන්තර්ගතය අංකයක් හෝ නූලක්ද යන්න දැන ගැනීම අදහස් කරන්නේ දැයි මට විශ්වාස නැත .

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

function isNumber(item) {
    return (parseInt(item) + '') === item;
}

සහ සමහර උදාහරණ සඳහා:

isNumber(123);   //true
isNumber('123'); //true
isNumber('123a');//false
isNumber('');    //false

මම හිතන්නේ මම මුලින් ඇසුවේ වර්ගය පරීක්ෂා කරන්නේ කෙසේද යන්නයි. (සහ /^\d+$/.test('123')විග්‍රහ කළ හැකි ගැටළු වල සංකීර්ණතාවයන් වළක්වා ගැනීම සඳහා මම මෙය කරන්නෙමි )
ඔලිකල්
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.