ජාවාස්ක්‍රිප්ට් හි වස්තුවකට නිශ්චිත දේපලක් තිබේදැයි පරීක්ෂා කරන්නේ කෙසේද?


1503

ජාවාස්ක්‍රිප්ට් හි වස්තුවකට නිශ්චිත දේපලක් තිබේදැයි පරීක්ෂා කරන්නේ කෙසේද?

සලකා බලන්න:

x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
    //Do this
}

එය කළ හැකි හොඳම ක්‍රමය එයද?


24
වේගවත්ම දේ දැකීමට සෑම දෙනාගේම පිළිතුරු සමඟ මම jsperf පරීක්ෂණයක් ලිව්වෙමි: jsperf.com/dictionary-contains-key
ස්ටයිෆල්

(වස්තුවෙහි 'propertyName')? 'දේපල තිබේ': 'දේපල නැත'
මොහාන් රාම්

1
jsperf පරීක්ෂණයට ස්තූතියි. inහා hasOwnPropertyපිටතට පැමිණි මාර්ගය (98% මන්දගාමී) මට මන්දගාමී අයට වඩා. hasOwnPropertyමන්දගාමී වීම ගැන මම පුදුම නොවෙමි, නමුත් මම පුදුම වෙමි in.
evanrmurphy

Answers:


1438

ලබා දී ඇති පිළිතුරු වලින් මම ඇත්තටම ව්‍යාකූල වී සිටිමි - ඒවායින් බොහොමයක් සම්පූර්ණයෙන්ම වැරදිය. ඇත්ත වශයෙන්ම ඔබට නිර්වචනය නොකළ, ශුන්‍ය හෝ ව්‍යාජ අගයන් ඇති වස්තු ගුණාංග තිබිය හැකිය. එබැවින් දේපල පරීක්ෂාව අඩු කිරීම typeof this[property]හෝ ඊටත් වඩා නරක යx.key ඔබට සම්පූර්ණයෙන්ම නොමඟ යවන ප්‍රති .ල ලබා දෙනු ඇත.

එය ඔබ සොයන දේ මත රඳා පවතී. යම් වස්තුවක භෞතිකව දේපලක් තිබේදැයි දැන ගැනීමට ඔබට අවශ්‍ය නම් (එය මූලාකෘති දාමයේ කොතැනක හෝ එන්නේ නැත) එවිට object.hasOwnPropertyයා යුතු මාර්ගයයි. සියලුම නවීන බ්‍රව්සර් එයට සහය දක්වයි. (සෆාරි - 2.0.1 සහ ඊට වඩා පැරණි අනුවාද වල එය අස්ථානගත වී ඇත, නමුත් බ්‍රව්සරයේ එම අනුවාදයන් කලාතුරකින් භාවිතා වේ.)

ඔබ සොයන දෙය නම්, යම් වස්තුවක් මත එය නැවත ලබා ගත හැකි දේපලක් තිබේ නම් (ඔබ එම වස්තුවේ ගුණාංග ඉක්මවා යන විට එය දිස්වනු ඇත) එසේ කිරීමෙන්: prop in objectඔබට අපේක්ෂිත ප්‍රති give ල ලබා දෙනු ඇත.

භාවිතා hasOwnPropertyකිරීම බොහෝ විට ඔබට අවශ්‍ය දේ වන අතර, ඔබට ආපසු හැරවීමේ ක්‍රමයක් අවශ්‍ය විය හැකි බැවින්, මම ඔබට පහත විසඳුම ඉදිරිපත් කරමි:

var obj = {
    a: undefined,
    b: null,
    c: false
};

// a, b, c all found
for ( var prop in obj ) {
    document.writeln( "Object1: " + prop );
}

function Class(){
    this.a = undefined;
    this.b = null;
    this.c = false;
}

Class.prototype = {
    a: undefined,
    b: true,
    c: true,
    d: true,
    e: true
};

var obj2 = new Class();

// a, b, c, d, e found
for ( var prop in obj2 ) {
    document.writeln( "Object2: " + prop );
}

function hasOwnProperty(obj, prop) {
    var proto = obj.__proto__ || obj.constructor.prototype;
    return (prop in obj) &&
        (!(prop in proto) || proto[prop] !== obj[prop]);
}

if ( Object.prototype.hasOwnProperty ) {
    var hasOwnProperty = function(obj, prop) {
        return obj.hasOwnProperty(prop);
    }
}

// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
    if ( hasOwnProperty(obj2, prop) ) {
        document.writeln( "Object2 w/ hasOwn: " + prop );
    }
}

ඉහත දැක්වෙන්නේ hasOwnPropertyඑක් අවවාදයක් සමඟ වැඩ කරන, හරස් බ්‍රව්සරයකි, විසඳුමකි : මූලාකෘතියේ හා නිදසුනක් ලෙස සමාන දේපලක් ඇති අවස්ථා අතර වෙනස හඳුනා ගැනීමට එයට නොහැකි ය - එය උපකල්පනය කරන්නේ එය මූලාකෘතියෙන් එන බවයි. ඔබේ තත්වය මත පදනම්ව ඔබට එය වඩාත් සැහැල්ලු හෝ දැඩි ලෙස වෙනස් කළ හැකිය, නමුත් අවම වශයෙන් මෙය වඩාත් ප්‍රයෝජනවත් විය යුතුය.


5
@grantwparks ඔබ සරල ස්ලයිඩර් ප්ලගිනයක් සාදන්නේ නම් සහ විකල්ප අයිතමයක පැවැත්ම පරීක්ෂා කිරීමට අවශ්‍ය නම්, මෙය ඇත්ත වශයෙන්ම අවශ්‍ය ප්‍රමාණයට වඩා වැඩි විය හැකිය. ඔබට එවැනි දෙයක් කළ හැකිය var w = opts.w || 100;. නමුත් ඔබ යම් ආකාරයක පුස්තකාලයකට පිවිසෙන්නේ නම්, ඔබට සමහර කොටස් වලට ටිකක් දුර යා යුතුය.
හැලිල් Özgür

@ kralco626: ඔව්, මේ දිනවල hasOwnProperty () සමඟ යෑම ආරක්ෂිත යැයි මට හැඟේ - නමුත් සැබවින්ම ආරක්ෂිත හරස් බ්‍රව්සර් විසඳුමක් සඳහා ජෝන් සමඟ යන්න.
ජාකොබ්

තාවකාලිකව__proto__ ශුන්‍ය බවට වෙනස් කිරීම ගැන කුමක් කිව හැකිද? සරල impl: function hasOwnProperty(obj, prop) { var temp = obj.__proto__; obj.__proto__ = null; var ret = prop in obj; obj.__proto__ = temp; return ret; }(නඩුව එකතු obj.constructor.prototypeකළ යුතුය).
සාමාන්‍ය ජෝ

2
As කස්තාන් __proto__ප්‍රමිතියකින් තොර වන අතර සමහර පැරණි බ්‍රව්සර් වල ක්‍රියා නොකරයි. Object.getPrototypeOfප්‍රමිතිය මෑතකදී එකතු කිරීමත් සමඟ ඔබට පවතින වස්තුවක මූලාකෘතිය වෙනස් කළ නොහැකි බව පවසයි.
මැට් බ්‍රවුන්

13
for(prop in object)පුඩුවක් ගණ්ය ගුණ පමණක් දයානන්ද්. කෙසේ වෙතත්, දේපල මූලාකෘති දාමයේ කොතැනක හෝ prop in objectතිබේදැයි පරීක්ෂා කරයි, එය ගණන් කළ හැකිද නැද්ද යන්න ස්වාධීනව. objectprop
ඔරියෝල්

288

සමඟ Underscore.jsහෝ ( ඊටත් වඩා හොඳ ) lodash:

_.has(x, 'key');

කුමන ඇමතුම් Object.prototype.hasOwnProperty, නමුත් (අ) ටයිප් කිරීමට කෙටි වන අතර (ආ) “වෙත ආරක්ෂිත යොමු කිරීමක් hasOwnProperty” භාවිතා කරයි (එනම් එය ක්‍රියාත්මක වුවද)hasOwnProperty නැවත ලියනු වේ).

විශේෂයෙන්, ලොඩාෂ් මෙසේ අර්ථ දක්වයි _.has:

   function has(object, key) {
      return object ? hasOwnProperty.call(object, key) : false;
   }
   // hasOwnProperty = Object.prototype.hasOwnProperty

55
සංකීර්ණ DOM හැසිරවීම පිළිබඳ ප්‍රශ්නය සහ "යන්න jQuery භාවිතා කරන්න" යන ප්‍රශ්නය තිබියදීත් "මෙම පුස්තකාලය එක් කරන්න" කලාතුරකින් ජනප්‍රිය විසඳුමක් වන නිසා යැයි මම සිතමි.
වින්ෆීල්ඩ් ට්‍රේල්

11
මම ඔබේ අදහස දකිමි, සුභ පැතුම්, ස්තූතියි. අහඹු ලෙස, යමෙකුට මුළු ලොඩාෂ් පුස්තකාලය ඇතුළත් කිරීමට අකමැති නම් යමෙකුට උප සංරචක සම්පාදනය කළ හැකිය, නැතහොත් අවම npm install lodash.hasකළ hasවිට බයිට් 175 ක් දක්වා සම්පාදනය වන ශ්‍රිතයක් සහිත එන්පීඑම් මොඩියුලයක් නිරාවරණය කරයි . lodash.has/index.jsඉතා ජනප්‍රිය සහ විශ්වාසදායක පුස්තකාලයක් ක්‍රියාත්මක වන්නේ කෙසේදැයි බැලීමට ද එය බුද්ධිමත් ය .
බ්‍රයන් එම් හන්ට්

9
සහ lodashඅනුවාදයන් මේ සමඟ ක්‍රියා කරයි: ආපසු පැමිණෙන .has(undefined, 'someKey') => falseඅතරunderscoreundefined
බ්‍රැඩ් පාර්ක්ස්

13
lodash"තවත්" යැපීමක් ලෙස එකතු කිරීම ගැන කෑගසන සෑම කෙනෙකුටම : එය මේ ආකාරයේ දෙයක් සඳහා තරමක් පොදු (වඩාත්ම පොදු නොවේ) පුස්තකාලයකි. රෝදය ප්‍රතිනිර්මාණය කිරීමෙන් විනෝද වන්න.
ප්‍රිදු නීම්රේ

11
ඔබට රෝදය ප්‍රතිනිර්මාණය කිරීමට අවශ්‍ය වුවද, පවතින රෝද පරීක්ෂා කිරීම නරක අදහසක් නොවේ.
අටර්සෑම්

153

කුමක් ගැනද?

var x = {'key': 1};

if ('key' in x) {
    console.log('has');
}

13
සටහන් කිරීම සඳහා, එය පටු අර්ථයෙන් 'වස්තූන්' සමඟ ක්‍රියා කරයි, එබැවින්} as ලෙස ප්‍රකාශයට පත් කර හෝ ඉදිකිරීම්කරු භාවිතයෙන් නිර්මාණය කර ඇත, එය අරා හෝ ප්‍රාථමිකයන් පිළිගන්නේ නැත. OP ට එය අවශ්‍ය වී ඇති බව නොවේ, නමුත් තවත් සමහර පිළිතුරු වඩාත් පුළුල් ක්‍රමවේදයන් ඉදිරිපත් කරයි (අරා, නූල් ආදිය සමඟ වැඩ කරන්න)
ඩැනුබියන් නැවියන්

Out that එය පෙන්වා දීම ගැන ස්තූතියි (පිළිගත් පිළිතුර යමෙකු inක්‍රියාකරු භාවිතා කළ යුත්තේ ඇයිද යන්න පිළිබඳ විස්තර වෙත නොයනු ඇත . තවද inක්‍රියාකරුට විශිෂ්ට බ්‍රව්සර් ආධාරකයක් ඇති බව IE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+ සලකන්න stackoverflow.com/questions/2920765/…
ඇඩ්‍රියන්

2
ක්‍රියාකරු inද මූලාකෘති ගුණාංග පරීක්ෂා කරන අතර hasOwnPropertyපරිශීලක අර්ථ දක්වන ලද ගුණාංග පමණක් පුනරාවර්තනය කරයි. මූලාශ්ර: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
adi518

2
'key' in x කරන්න පෙලගැස්මක් සමග වැඩ. සාධනය: stackoverflow.com/questions/33592385/…
CosmoMyzrailGorynych

හොඳම හා කෙටිම විකල්පය ලෙස පෙනේ
user365314

134

සටහන : පහත දැක්වෙන දෑ වර්තමානයේ බොහෝ දුරට යල්පැන ඇති අතර දැඩි ක්‍රමයට ස්තුති වේ hasOwnProperty. නිවැරදි විසඳුම වන්නේ දැඩි මාදිලියක් භාවිතා කිරීම සහ භාවිතා කරන දේපලක් තිබේද යන්න පරීක්ෂා කිරීමයි obj.hasOwnProperty. මෙම පිළිතුර මේ කාරණා දෙකටම පෙර , අවම වශයෙන් පුළුල් ලෙස ක්‍රියාත්මක කර ඇත (ඔව්, එය පැරණි ය). පහත දැක්වෙන සටහන a තිහාසික සටහනක් ලෙස ගන්න.


අප මතක තබාගත යුතුයි බව undefined(අවාසනාවකට) වේ නොහැකි ඔබ දැඩි මාතය භාවිතා නැති නම් JavaScript දී රක්ෂිත වචනය. එමනිසා, යමෙකුට (වෙනත් කෙනෙකුට, පැහැදිලිවම) එය නැවත අර්ථ දැක්වීමේ මහා අදහස තිබිය හැකිය, ඔබේ කේතය බිඳ දමන්න.

එබැවින් වඩාත් ශක්තිමත් ක්‍රමයක් පහත දැක්වේ:

if (typeof(x.attribute) !== 'undefined')

අනෙක් පැත්තෙන්, මෙම ක්‍රමය වඩාත් වාචික හා මන්දගාමී වේ. : - / /

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

(function (undefined) {
     your code 
    if (x.attribute !== undefined)
         mode code 
})();

6
void 0කැනොනිකල් නැවත ලබා දීම සඳහා අර්ථ දක්වා ඇති හෙයින් කුතුහලයෙන් යුතුව undefinedකෙනෙකුට කළ x.attribute !== void 0හැකිද?
බ්‍රයන් එම් හන්ට්

1
බ්‍රයන්: මම විශේෂ expert යෙක් නොවේ, නමුත් එය නිවැරදිව ලබා ගැනීමට දක්ෂ ක්‍රමයක් සේ පෙනේ.
ක්‍රිස්ටෝපර් ස්මිත්

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

3
(function (undefined) { // undefined is actually undefined here })();
Def න

1
anevanrmurphy එය භාවිතා නොකරන්න, එය බරපතල ලෙස යල් පැන ගිය එකක් (මගේ පිළිතුර ආරම්භයේ සටහන බලන්න).
කොන්රාඩ් රුඩොල්ෆ්

57
if (x.key !== undefined)

ආමින් රොනාචර් දැනටමත් මට එයට පහර දී ඇති බව පෙනේ , නමුත්:

Object.prototype.hasOwnProperty = function(property) {
    return this[property] !== undefined;
};

x = {'key': 1};

if (x.hasOwnProperty('key')) {
    alert('have key!');
}

if (!x.hasOwnProperty('bar')) {
    alert('no bar!');
}

ඒ ආරක්ෂිත, නමුත් මන්දගාමී විසඳුමක් පෙන්වා දෙන පරිදි විසින් කොන්රාඩ් රුඩොල්ෆ් හා Armin Ronacher වනු ඇත:

Object.prototype.hasOwnProperty = function(property) {
    return typeof this[property] !== 'undefined';
};

2
මම හිතන්නේ නැහැ එය ප්‍රමාණවත් යැයි. x.hasOwnProperty('toString') === true;
ජෝ සිමන්ස්

එකඟ නොවීමට ඉල්ලීම නොව තේරුම් ගැනීමයි. X.hasOwnProperty විසින් බූලියන් සත්‍ය හෝ අසත්‍යය හැර වෙනත් කිසිවක් ආපසු ලබා දිය හැකි ස්ථානයක් තිබේද? එසේ නොවේ නම්, පළ කර ඇති කේතය සෑම විටම ක්‍රියාත්මක විය යුතුය. මම හිතන්නේ සමහර විට මෙම ක්‍රමය ඉක්මවා ගොස් තිබේ නම්, නමුත් ඔබ අභිබවා යන ක්‍රමය නොදන්නේ නම් ප්‍රති result ලය මත විශ්වාසය තැබීම කිසි විටෙකත් විශ්වාසදායක නොවේ.
enobrev

1
මම හිතන්නේ අපිට වැරදි සන්නිවේදනයක් තියෙනවා. මම අදහස් කළේ ඔබේ ක්‍රමය භාවිතා කිරීමෙන් එය කියනුයේ 'toString' යනු තමන්ගේම දේපලක් බවයි, නමුත් එය එසේ නොවේ.
ජෝ සිමන්ස්

3
Object.prototypeදැනටමත් ගොඩනගා ඇති, නිවැරදි ය hasOwnProperty. වැරදි ක්‍රියාවට නැංවීමකින් එය නැවත ලිවීම (1. undefinedදේපලවලට වටිනාකමක් තිබිය හැකිය , 2. මෙය උරුම වූ දේපල සඳහා ව්‍යාජ ධනාත්මක ප්‍රති give ල ලබා දෙනු ඇත) ඉතා නරක අදහසකි. වැරදි පිළිතුරු මකා දැමිය හැකිය. රෙසිග්ගේ පිළිතුර දුටු විට සැප්තැම්බර් 08 දී ඔබට එය කළ හැකිදැයි මම නොදනිමි , එබැවින් දැන් එය කිරීමට යෝජනා කිරීමට අදහස් දක්වන්න .
ටී. ජේ. ක්‍රෝඩර්

37

inවස්තුවක් මත දේපල තිබේදැයි පරීක්ෂා කිරීමට ඔබට ක්‍රියාකරු භාවිතා කළ හැකිය :

x = {'key': 1};
alert("key" in x);

ඔබට ලූපයක් භාවිතා කර වස්තුවේ සියලුම ගුණාංග හරහා ලූපයක් ලබා ගත හැකි for - inඅතර පසුව නිශ්චිත දේපල සඳහා පරීක්ෂා කරන්න:

for (prop in x) {
    if (prop == "key") {
        //Do something
    }
}

මෙම වස්තු දේපල ගණන් කළ හැකි ද නැද්ද යන්න ඔබ සලකා බැලිය යුතුය, මන්ද ගණන් කළ නොහැකි ගුණාංග for-inපුඩුවක් තුළ නොපෙන්වයි . එසේම, ගණන් කළ නොහැකි දේපල මූලාකෘතියේ ගණනය කළ නොහැකි දේපලක් සෙවනැලි කරන්නේ නම්, එය ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් 8 හි නොපෙන්වයි සහ ඊට පෙර .

ගණන් කළ හැකි වුවත් නැතත්, ඔබට සියලු නිදර්ශන දේපල ලැයිස්තුවක් අවශ්‍ය නම්, ඔබට භාවිතා කළ හැකිය

Object.getOwnPropertyNames(x);

මෙය වස්තුවක පවතින සියලුම ගුණාංගවල නම් පෙළක් ලබා දෙනු ඇත.

අවසාන වශයෙන්, වස්තු දේපලවල දත්ත වර්ගය කෙලින්ම පරීක්ෂා කිරීමට ඔබට ටයිප් ඔෆ් ක්‍රියාකරු භාවිතා කළ හැකිය:

if (typeof x.key == "undefined") {
    alert("undefined");
}

දේපල වස්තුව මත නොපවතී නම්, එය නිර්වචනය නොකළ නූල නැවත ලබා දෙනු ඇත. නැතහොත් එය සුදුසු දේපල වර්ගය නැවත ලබා දෙනු ඇත. කෙසේ වෙතත්, මෙය සැමවිටම වස්තුවකට දේපලක් තිබේද නැද්ද යන්න පරීක්ෂා කිරීමේ වලංගු ක්‍රමයක් නොවන බව සලකන්න, මන්ද ඔබට නිශ්චිතව දක්වා ඇති දේපලක් තිබිය හැකි අතර, එවැනි අවස්ථාවකදී භාවිතා කිරීමtypeof x.key කිරීම තවමත් සත්‍ය වනු ඇත (යතුර තවමත් තිබියදීත්) වස්තුව තුළ).

යාවත්කාලීන කිරීම: නිර්වචනය නොකළ ජාවාස්ක්‍රිප්ට් දේපල හා සැසඳීමෙන් ඔබට දේපලක් තිබේදැයි පරීක්ෂා කළ හැකිය

if (x.key === undefined) {
    alert("undefined");
}

undefinedX වස්තුව මත යතුර නිශ්චිතව සකසා නොමැති නම් මෙය ක්‍රියාත්මක විය යුතුය


ඔබගේ යාවත්කාලීන කොටස වැරදිය. කරුණාකර මෙහි බලන්න: jsfiddle.net/sbgg04yg
945

ජාවාස්ක්‍රිප්ට් නිර්වචනය නොකළ දේපල හා සැසඳීම අසාර්ථක විය හැකි අවස්ථා පෙන්වීමට යාවත්කාලීන කරන ලදි
goonerify

31

මෙහි යම් ව්‍යාකූලත්වයක් ඇති කර ගනිමු. පළමුව, hasOwnPropertyදැනටමත් පවතින බව උපකල්පනය කිරීමෙන් සරල කරමු ; භාවිතයේ පවතින වර්තමාන බ්‍රව්සර්වලින් බහුතරයක් සම්බන්ධයෙන් මෙය සත්‍යයකි.

hasOwnPropertyඑයට ලබා දුන් ආරෝපණ නාමය වස්තුවට එකතු කර ඇත්නම් එය සත්‍ය වේ. එය පවරා ඇති සත්‍ය වටිනාකමෙන් එය සම්පූර්ණයෙන්ම ස්වාධීන වේ undefined.

එබැවින්:

var o = {}
o.x = undefined

var a = o.hasOwnProperty('x')  // a is true
var b = o.x === undefined // b is also true

කෙසේවෙතත්:

var o = {}

var a = o.hasOwnProperty('x')  // a is now false
var b = o.x === undefined // b is still true

ගැටළුව වන්නේ මූලාකෘති දාමයේ ඇති වස්තුවකට නිර්වචනය නොකළ අගය සමඟ ලක්ෂණයක් ඇති විට කුමක් සිදුවේද? hasOwnPropertyඒ සඳහා අසත්‍ය වනු ඇත !== undefined. තවම,for..in එය තවමත් ගණන් බැලීමේදී ලැයිස්තුගත කරනු ඇත.

අවසාන කරුණ __prototype__නම්, නිශ්චිත හඳුනාගැනීමක් වස්තුවකට හෝ එහි මූලාකෘති දාමයේ කිසිවක් සම්බන්ධ කර නොමැති බව තීරණය කිරීම සඳහා හරස් බ්‍රව්සර් ක්‍රමයක් නොමැති වීමයි (ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් නිරාවරණය නොවන බැවින් ).


24

ඔබ දේපලක් සොයන්නේ නම් "නැත". ඔබට අවශ්‍යයි:

if ('prop' in obj) { }

පොදුවේ ගත් කල, දේපල මූලාකෘතියෙන් හෝ වස්තුවෙන් ලැබුණත් නැතත් ඔබ සැලකිලිමත් නොවිය යුතුය.

කෙසේ වෙතත්, ඔබ ඔබේ නියැදි කේතයේ 'යතුර' භාවිතා කර ඇති නිසා, ඔබ වස්තුව හැෂ් ලෙස සලකන බවක් පෙනේ, එවිට ඔබේ පිළිතුර අර්ථවත් වනු ඇත. සියලුම හැෂ් යතුරු වස්තුවෙහි ගුණාංග වන අතර, මූලාකෘතිය මඟින් දායක වන අමතර ගුණාංග ඔබ මග හැරේ.

ජෝන් රෙසිග්ගේ පිළිතුර ඉතා පුළුල් ය, නමුත් එය පැහැදිලි නැතැයි මම සිතුවෙමි. විශේෂයෙන් obj හි "මුක්කු" භාවිතා කළ යුත්තේ කවදාද යන්න සමඟ.


1
බව සටහන inක්රියාකරු විශිෂ්ට බ්රවුසරය සහයෝගය IE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+ stackoverflow.com/questions/2920765/...
Adrien විය

inක්‍රියාකරු භාවිතා කිරීම සම්බන්ධයෙන් තවත් අදහස් දැක්වීමක දී පෙන්වා දී ඇති පරිදි : “එය පටු අර්ථයෙන් 'වස්තූන්' සමඟ ක්‍රියා කරයි, එබැවින්} as ලෙස ප්‍රකාශයට පත් කර ඇත, නැතහොත් ඉදිකිරීම්කරු භාවිතයෙන් නිර්මාණය කර ඇත, එය අරා හෝ ප්‍රාථමිකයන් පිළිගන්නේ නැත. OP එයට අවශ්‍ය බව නොව, තවත් සමහර පිළිතුරු වඩාත් පුළුල් ක්‍රමවේදයන් ඉදිරිපත් කරයි (අරා, නූල් ආදිය සමඟ වැඩ කරන්න) ”
ඇඩ්‍රියන් බී

1
අදහස් දැක්වීම හේතුවක් නොමැතිව මා දෙවරක් පහත් කොට ඇත. නමුත් මම තවමත් මගේ පිළිතුරට කැමතියි. සමහර විට එසේ කළ ඕනෑම කෙනෙකුට සියලු වර්ගවල දේපල පරීක්ෂා කිරීම සඳහා සියලු ආකාර සඳහා 'සවිස්තරාත්මක' පිළිතුරක් අවශ්‍ය විය හැකිය .. නමුත් මගේ පිළිතුර සංකල්පීය වන අතර ඒ සඳහා සංක්ෂිප්ත ය. Re: ඇඩ්‍රියන් බී, ගණනය කළ නොහැකි දේපලක් යනු සාමාන්‍ය පරිශීලක විෂය පථයට
නොගැලපෙන දේපලකි

16

සරල වස්තු පරීක්ෂා කිරීම සඳහා: if (obj[x] !== undefined)

එය භාවිතා කරන්නේ කුමන වස්තු වර්ගයදැයි ඔබ නොදන්නේ නම්: if (obj.hasOwnProperty(x))

අනෙක් සියලුම විකල්ප මන්දගාමී වේ ..

විස්තර

මෙහි වෙනත් අය විසින් යෝජනා කරන ලද විකල්ප 5 ට Nodejs යටතේ චක්‍ර 100,000,000 ක කාර්ය සාධනය ඇගයීම:

function hasKey1(k,o) { return (x in obj); }
function hasKey2(k,o) { return (obj[x]); }
function hasKey3(k,o) { return (obj[x] !== undefined); }
function hasKey4(k,o) { return (typeof(obj[x]) !== 'undefined'); }
function hasKey5(k,o) { return (obj.hasOwnProperty(x)); }

ඇගයීම අපට පවසන්නේ අපට නිශ්චිතවම වස්තුවේ මූලාකෘති දාමය මෙන්ම වස්තුවම පරීක්ෂා කිරීමට අවශ්‍ය නම් මිස, අපි පොදු ස්වරූපය භාවිතා නොකළ යුතු බවයි: භාවිත අවස්ථාව අනුව if (X in Obj)... එය 2 සිට 6 ගුණයක් මන්දගාමී වේ

hasKey1 execution time: 4s 510.427785ms
hasKey2 execution time: 0s 904.374806ms
hasKey3 execution time: 0s 760.336193ms
hasKey4 execution time: 0s 935.19901ms
hasKey5 execution time: 2s 148.189608ms

බොටම් ලයින්, ඔබේ Obj අනිවාර්යයෙන්ම සරල වස්තුවක් නොවේ නම් සහ ඔබ වස්තුවේ මූලාකෘති දාමය පරික්ෂා කිරීමෙන් වැළකී x සෘජුවම Obj සතු බව සහතික කිරීමට නම්, 'if (obj.hasOwnProperty (x)) ...' භාවිතා කරන්න.

එසේ නොමැතිනම්, සරල වස්තුවක් භාවිතා කරන විට සහ වස්තුවේ මූලාකෘති දාමය ගැන කරදර නොවී, භාවිතා if (typeof(obj[x]) !== 'undefined')...කිරීම ආරක්ෂිතම හා වේගවත්ම ක්‍රමයයි.

ඔබ සරල වස්තුවක් හැෂ් වගුවක් ලෙස භාවිතා කරන්නේ නම් සහ කිසි විටෙකත් කිංකි කිසිවක් නොකරන්නේ if (obj[x])...නම්, එය වඩාත් කියවිය හැකි යැයි මම සිතන බැවින් මම භාවිතා කරමි.

විනෝද වන්න.


15

ඔව් එය එසේ ය :) දේපළක් තිබේ Object.prototype.hasOwnProperty.call(x, 'key')නම් එය ද කළ හැකි යැයි මම සිතමි :)xhasOwnProperty

නමුත් එය තමන්ගේම දේපල සඳහා පරීක්ෂා කරයි. ඔබට එය භාවිතා කළ හැකි දේපලක් තිබේදැයි පරීක්ෂා කිරීමට අවශ්‍ය නම් typeof x.foo != 'undefined'.


14
if (typeof x.key != "undefined") {

}

නිසා

if (x.key)

නම් අසමත් x.keyකිරීමට ෙයෝජනා false(උදාහරණයක් ලෙස, x.key = "").


නිවැරදි නොවනු ඇත. පහත සඳහන් වස්තුව උත්සාහ const x = {key: undefined};මෙම විසඳුම සමග බොරු ආපසු වනු ඇත, වන අතර x.hasOwnProperty('key')); // trueහා Reflect.has(x, 'key')); // true. දේපල ඇත්ත වශයෙන්ම පවතී, නමුත් වටිනාකම වේ undefined.
විල්ට්


12

මෙය නොකරන්න object.hasOwnProperty(key)), එය ඇත්තෙන්ම නරක නිසා මෙම ක්‍රම සැක සහිත වස්තුවෙහි ගුණාංග මගින් සෙවනැලි විය හැකිය - සලකා බලන්න { hasOwnProperty: false }- හෝ, වස්තුව ශුන්‍ය වස්තුවක් විය හැකිය (Object.create(null)).

හොඳම ක්‍රමය වන්නේ Object.prototype.hasOwnProperty.call(object, key)හෝ:

const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
/* or */
import has from 'has'; // https://www.npmjs.com/package/has
// ...
console.log(has.call(object, key));

4
මම මෙම ක්‍රමයට එකඟ වන අතර එය කාර්ය සාධනය පවත්වා ගෙන යන අතර එය ආරක්ෂිතම ක්‍රමය බැවින් එය පිළිගත් පිළිතුර විය යුතුය! eslint.org/docs/rules/no-prototype-builtins පවසන්නේ “උදාහරණයක් ලෙස, වෙබ් සේවාදායකයකු විසින් සේවාදායකයෙකුගෙන් JSON ආදානය විග්‍රහ කිරීම හා එහි ප්‍රති object ලයක් වන වස්තුව මත කෙලින්ම hasOwnProperty අමතන්න, මන්ද අනිෂ්ට සේවාදායකයෙකුට JSON අගයක් යැවිය හැකි බැවිනි. has "hasOwnProperty": 1 like වැනි සේවාදායකය බිඳ වැටීමට හේතු වේ. "
අර්මාන්

10

හරි, ඔබට උරුම වූ දේපල අවශ්‍ය නැතිනම් මට නිවැරදි පිළිතුර ඇති බව පෙනේ:

if (x.hasOwnProperty('key'))

උරුම වූ දේපල ඇතුළත් කිරීමට තවත් විකල්ප කිහිපයක් මෙන්න:

if (x.key) // Quick and dirty, but it does the same thing as below.

if (x.key !== undefined)

4
Caveat x.hasOwnProperty ('key') සත්‍ය විය හැකි අතර x.key! == නිර්වචනය නොකළ සත්‍ය නොවේ.
ඇන්තනි ඩබ්ලිව් ජෝන්ස්

4
සඳහා var x = { key: false };වන x.keyක්රමය වැරදි වනු ඇත.
මාර්ක් කේ කෝවන්

2
(x.key) x = {යතුර: 0 as ලෙස නිවැරදි නොවේ නම්, එය පරීක්ෂා කිරීම සමත් නොවේ.
someUser

7

සාපේක්ෂව තවත් සරල ක්‍රමයක් වන්නේ භාවිතා Object.keysකිරීමයි. මෙයින් arrayඅදහස් කරන්නේ ඔබ අරාවෙහි සියලුම අංග ලබා ගන්නා බවයි.

var noInfo = {};
var info = {something: 'data'};

Object.keys(noInfo).length //returns 0 or false
Object.keys(info).length //returns 1 or true

අප සිටින්නේ විශාල බ්‍රව්සර් සහාය ඇති ලෝකයක වුවද. මෙම ප්‍රශ්නය ඉතා පැරණි බැවින් මම මෙය එකතු කිරීමට සිතුවෙමි: මෙය JS v1.8.5 හි භාවිතා කිරීමට ආරක්ෂිතයි


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

2
එවිට ඔබ එසේ කරනු ඇතObject.keys(info).indexOf('someotherthing') !== -1
හිපිට්‍රයිල්

7

hasOwnProperty "වස්තුවකට නිශ්චිත දේපලක් එම වස්තුවේ property ජු දේපලක් ලෙස තිබේද යන්න තීරණය කිරීමට භාවිතා කළ හැකිය; ක්‍රියාකරු මෙන් නොව , මෙම ක්‍රමය මඟින් වස්තුවේ මූලාකෘති දාමය පරීක්ෂා නොකරයි."

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

ඔබට ප්‍රධාන වශයෙන් භාවිතා කිරීමට අවශ්‍ය මූලාකෘති දාමයේ දේපල තිබේද යන්න තීරණය කිරීමට ඔබට අවශ්‍ය නම්,

if( prop in object ){ // do something }

මම හිතනවා මේක උදව් වෙයි කියලා.


MyObject හි 'prop' සෙවීම සඳහා මට "ක්‍රියාකරු තුළ" භාවිතා කළ නොහැක "
වික්ටෝරියෝ බෙරා

3

දැවැන්ත පහත වැටීමේ අවදානමක් සහිතව, විශේෂිත අවස්ථාවක් සඳහා තවත් විකල්පයක් මෙන්න. :)

ඔබට වස්තුවක් මත සාමාජිකයෙකු සඳහා පරීක්ෂා කිරීමට අවශ්‍ය නම් සහ එය වෙනත් දෙයකට සකසා ඇත්දැයි දැන ගැනීමට අවශ්‍ය නම්:

  • ''
  • බොරු
  • ශුන්‍යයි
  • නිර්වචනය නොකළ
  • 0 ...

එවිට ඔබට භාවිතා කළ හැකිය:

var foo = {};
foo.bar = "Yes, this is a proper value!";
if (!!foo.bar) {
        // member is set, do something
}

සංයුක්ත හා පහසු
ෆ්‍රෙඩ්රික් විට්

ලින්ටරයක් ​​මෙයට කැමති නැත: eslint.org/docs/rules/no-extra-boolean-cast
Wilt

3

ඔබට පහත ප්‍රවේශයන් භාවිතා කළ හැකිය-

var obj = {a:1}
console.log('a' in obj)               //1
console.log(obj.hasOwnProperty('a'))  //2
console.log(Boolean(obj.a))         //3

පහත දැක්වෙන ප්‍රවේශයන් අතර වෙනස පහත පරිදි වේ-

  1. 1 වන සහ 3 වන ප්‍රවේශයේදී අපි හුදෙක් වස්තුවක් සෙවීම පමණක් නොව එහි මූලාකෘති දාමය ද වේ. වස්තුවට දේපළ නොමැති නම්, නමුත් දේපල එහි මූලාකෘති දාමයේ තිබේ නම් එය සත්‍යයක් වනු ඇත.

 var obj = {
      a:2,
      __proto__ :{b:2}
    }

    console.log('b' in obj)
    console.log(Boolean(obj.b))

  1. 2 වන ප්රවේශය එහි දේපල සඳහා පමණක් පරීක්ෂා කරනු ඇත. උදා -

var obj = {
      a:2,
      __proto__ :{b:2}
    }

    console.log(obj.hasOwnProperty('b'))

  1. 1 වන සහ තෙවන අතර වෙනස වන්නේ නිශ්චිතව දක්වා නැති වටිනාකමක් ඇති දේපලක් තිබේ නම් 3 වන ප්‍රවේශය අසත්‍යයක් වන අතර පළමුව සත්‍යය ලබා දෙනු ඇත.

var obj = {
      b : undefined
    }
    console.log(Boolean(obj.b))
    console.log('b' in obj);


2

ECMA ස්ක්‍රිප්ට් 6 විසඳුම පරාවර්තනය සමඟ. වැනි එතීම සාදන්න:

/**
Gets an argument from array or object.
The possible outcome:
- If the key exists the value is returned.
- If no key exists the default value is returned.
- If no default value is specified an empty string is returned.
@param obj    The object or array to be searched.
@param key    The name of the property or key.
@param defVal Optional default version of the command-line parameter [default ""]
@return The default value in case of an error else the found parameter.
*/
function getSafeReflectArg( obj, key, defVal) {
   "use strict";
   var retVal = (typeof defVal === 'undefined' ? "" : defVal);
   if ( Reflect.has( obj, key) ) {
       return Reflect.get( obj, key);
   }
   return retVal;
}  // getSafeReflectArg

ඔබ ඉලක්ක කරන විට එය කිරීමට හොඳම ක්‍රමය මෙයද> = ES6?
hippietrail

1
ඉමෝ එය කෙටිම හා සරලම පිළිතුර විය හැකි නමුත් ක්‍රියාත්මක කිරීමේ කේතයේ වේගවත්ම නොවේ. නමුත් වේගය ප්‍රශ්නයක් නොවේ (තවදුරටත්).
හානි

2

වස්තුව මත "hasOwnProperty" ක්‍රමයක් පවතින නමුත් මෙම ක්‍රමය කෙලින්ම ඇමතීමට නිර්දේශ නොකරයි, මන්ද සමහර විට වස්තුව ශුන්‍ය විය හැකිය. { hasOwnProperty: false }

එබැවින් වඩා හොඳ ක්‍රමය වනුයේ:

// good
var obj = {"bar": "here bar desc"}
console.log(Object.prototype.hasOwnProperty.call(obj, "bar"));

// best
const has = Object.prototype.hasOwnProperty; // cache the lookup once, in module scope.
console.log(has.call(obj, "bar"));


1

ඔබ ක්රමය භාවිතා කළ object.hasOwnProperty(property)යුතුය. වස්තුවට දේපළ තිබේ නම් එය සත්‍ය වේ.


-1

ඔබ පරික්ෂා කරන යතුර විචල්‍යයක ගබඩා කර ඇත්නම් , ඔබට එය මේ ආකාරයෙන් පරීක්ෂා කළ හැකිය:

x = {'key': 1};
y = 'key';
x[y];

සංකල්පමය වශයෙන් මෙය වෙනස් වන්නේ කෙසේද? එවිට x ['key'] පරීක්ෂා කිරීම පමණි. එය x.key ට වඩා වෙනස් වන්නේ කෙසේද?
course මාලාවකට

-1

ඔබට කළ හැකි විට දේවල් ඕනෑවට වඩා සංකීර්ණ කරන්නේ ඇයි:

var isProperty =  (objectname.keyname || "") ? true : false;

බොහෝ අවස්ථාවන් සඳහා සරල හා පැහැදිලි ...


වඩාත්ම සරලම දෙය වන්නේ var isProperty = !! objectname.keyname;
ජෝන්

වස්තුව පහත පරිදි වේ නම්, const objectName = { keyname: false };සිට එය, සැබෑ යළි උදා කළ යුතුයි keynameක දේපළක් objectname. නමුත් වටිනාකම අසත්‍ය බැවින් එය මෙම තර්කනය සමඟ අසත්‍ය වනු ඇත.
විල්ට්

-1

ජාවාස්ක්‍රිප්ට් දැන් විකාශනය වෙමින් පවතින අතර එය දැන් පරීක්ෂා කිරීමට හොඳ සහ හොඳම කාර්යක්ෂම ක්‍රමයක් ඇත වස්තුවට නිශ්චිත දේපලක් තිබේදැයි පරීක්ෂා කිරීමට පහසු ක්‍රම කිහිපයක්

  1. භාවිතා කිරීම hasOwnProperty()
const hero = {
  name: 'Batman'
};

hero.hasOwnProperty('name');     // => true
hero.hasOwnProperty('realName'); // => false
  1. යතුරුපදය / ක්‍රියාකරු භාවිතා කිරීම in
const hero = {
  name: 'Batman'
};

'name' in hero;     // => true
'realName' in hero; // => false
  1. undefinedමූල පදය සමඟ සංසන්දනය කිරීම
const hero = {
  name: 'Batman'
};

hero.name;     // => 'Batman'
hero.realName; // => undefined

//so consider this
hero.realName == undefined // => true (which means property does not exists in object)
hero.name == undefined // => false (which means that property exists in object)

ඔබ වැඩි තොරතුරු පරීක්ෂා කිරීම සඳහා තව දේ තේරුම් බලාපොරොත්තු මෙතන

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.