উদাহরণস্বরূপ কিছু আক্ষরিকের জন্য মিথ্যা ফিরিয়ে দেয় কেন?


284
"foo" instanceof String //=> false
"foo" instanceof Object //=> false
true instanceof Boolean //=> false
true instanceof Object //=> false
false instanceof Boolean //=> false
false instanceof Object //=> false

// the tests against Object really don't make sense

অ্যারে লিটারালস এবং অবজেক্ট লিটারালগুলি মিলছে ...

[0,1] instanceof Array //=> true
{0:1} instanceof Object //=> true

কেন সব না? বা, তারা সবাই কেন না ?
এবং, তারা কি উদাহরণস্বরূপ, তারপর?

এটি এফএফ 3, আই 7, অপেরা এবং Chrome এ একই the সুতরাং, কমপক্ষে এটি সামঞ্জস্যপূর্ণ।


মিস করেছেন কয়েকজন।

12.21 instanceof Number //=> false
/foo/ instanceof RegExp //=> true

উত্তর:


424

জাভাস্ক্রিপ্টের মধ্যে থেকে তৈরি করা বস্তুর চেয়ে প্রিমিটাইভগুলি ভিন্ন ধরণের। থেকে মজিলা এপিআই ডক্স :

var color1 = new String("green");
color1 instanceof String; // returns true
var color2 = "coral";
color2 instanceof String; // returns false (color2 is not a String object)

কোড সহ আদিম ধরণের নির্মাণের কোনও উপায় আমি খুঁজে পাচ্ছি না, সম্ভবত এটি সম্ভব নয়। এটি সম্ভবত কেন মানুষ ব্যবহার typeof "foo" === "string"পরিবর্তে instanceof

এর মতো জিনিস মনে রাখার একটি সহজ উপায় নিজেকে জিজ্ঞাসা করছে "আমি কী ভাবছি এবং শিখতে সহজ হবে"? উত্তর যাই হোক না কেন, জাভাস্ক্রিপ্ট অন্য জিনিসটি করে।


5
জাভাস্ক্রিপ্টকে ঘৃণা করার নতুন কারণ সহ প্রতিটি দিনই একটি ভাল দিন। আমি জানি যে এটি দীর্ঘতর ছাড়িয়ে গেছে তবে আমি এই পোস্টের জন্য আপনাকে ধন্যবাদ জানাই।
টনিডজুইডজ

57
আপনার পরিভাষাটি ভুল। "আক্ষরিক" শব্দটি কোনও কনস্ট্রাক্টর ব্যবহার না করে ডেটা তৈরির জন্য একটি বাক্য গঠনকে বোঝায়। এটি ফলাফলের ডেটা উল্লেখ করে না। আক্ষরিক সিনট্যাক্স দুটি অবজেক্ট এবং অ-অবজেক্ট তৈরি করতে ব্যবহার করা যেতে পারে। সঠিক শব্দটি হ'ল "আদিম", যা অ-অবজেক্ট ডেটার উল্লেখ করে। কিছু ডেটা উভয়ই আদিম এবং বস্তুর উপস্থাপনা করে। স্ট্রিং এই ধরণের ডেটাগুলির মধ্যে একটি।
ধূসর রাজ্য

14
এফওয়াইআই, আপনি আক্ষরিক বাক্য গঠন ছাড়াই আদিম তৈরি করতে পারেন। (new String()).valueOf();
ধূসর অবস্থা

11
নোট যে typeof foo === 'string'যথেষ্ট নয়: axkibe এর উত্তর দেখুন।
ব্রায়ান লারসন

1
অতিরিক্ত সালে typeof new String('')আয়"object"
transang

105

আমি ব্যবহার করি:

function isString(s) {
    return typeof(s) === 'string' || s instanceof String;
}

কারণ জাভাস্ক্রিপ্টে স্ট্রিংগুলি আক্ষরিক বা বস্তু হতে পারে।


28
আমি শর্ট বিটিডব্লু কিছু পেয়েছি। function isString(s) { return s.constructor === String; }
আক্ষরিক

7
জাভাস্ক্রিপ্ট পছন্দ।
ডেরেক 朕 會 功夫

2
আমি যখন সম্ভব হবে তখন jQuery.type (গুলি) === 'স্ট্রিং' ( api.jquery.com/jquery.type ), jQuery.isArray (), jQuery.isFunction (), jQuery.isNumeric () ব্যবহার করি।
ইভান স্যামিগিন

1
@axkibe যখন আপনি সঠিক হন তাহলে, এটা না প্রায় performant যেমন যেমন typeof
কিউস - মনিকা

আপনি টাইপফ ব্যবহার করতে পারেন "?" == স্ট্রিং.নেম.টোলওয়ারকেস () [তবে কেন [] উদাহরণস্বরূপে অ্যারে?]
কোয়ান্টিনউকে

62

জাভাস্ক্রিপ্টে আদিম (বুলিয়ান, নাল, সংখ্যা, স্ট্রিং এবং মান undefined(এবং ES6-তে প্রতীক)) ব্যতীত সমস্ত কিছুই একটি বস্তু (বা কমপক্ষে একটি বস্তু হিসাবে বিবেচিত হতে পারে ):

console.log(typeof true);           // boolean
console.log(typeof 0);              // number
console.log(typeof "");             // string
console.log(typeof undefined);      // undefined
console.log(typeof null);           // object
console.log(typeof []);             // object
console.log(typeof {});             // object
console.log(typeof function () {}); // function

আপনি যেমন অবজেক্ট দেখতে পাচ্ছেন, অ্যারে এবং মানটি nullসমস্ত বিবেচিত বস্তু হিসাবে বিবেচিত ( nullএটি কোনও অবজেক্টের রেফারেন্স যা বিদ্যমান না)। ক্রিয়াকলাপগুলি আলাদা করা হয় কারণ তারা একটি বিশেষ ধরণের কলযোগ্য বস্তু। তবে তারা এখনও অবজেক্ট।

অন্যদিকে লিটারেল true, 0, ""এবং undefinedনা বস্তু। এগুলি জাভাস্ক্রিপ্টে আদিম মান। তবে Booleans, সংখ্যা এবং স্ট্রিং এছাড়াও কনস্ট্রাকটর আছে Boolean, Numberএবং Stringযথাক্রমে যা তাদের নিজ নিজ প্রিমিটিভের মোড়ানো যোগ কার্যকারিতা প্রদান:

console.log(typeof new Boolean(true)); // object
console.log(typeof new Number(0));     // object
console.log(typeof new String(""));    // object

যখন আপনি আদিম মান মধ্যে আবৃত দেখতে পারেন Boolean, Numberএবং Stringকন্সট্রাকটর যথাক্রমে তারা বস্তু হয়ে যায়। instanceofঅপারেটর শুধুমাত্র অবজেক্টের জন্য কাজ করে (যার কারণে এটি ফেরৎ falseআদিম মানের জন্য):

console.log(true instanceof Boolean);              // false
console.log(0 instanceof Number);                  // false
console.log("" instanceof String);                 // false
console.log(new Boolean(true) instanceof Boolean); // true
console.log(new Number(0) instanceof Number);      // true
console.log(new String("") instanceof String);     // true

যেহেতু আপনি উভয়ই দেখতে পাচ্ছেন typeofএবং instanceofমানটি বুলিয়ান, সংখ্যা বা একটি স্ট্রিং কিনা তা পরীক্ষা করার জন্য অপর্যাপ্ত - typeofকেবল আদিম বুলেটিয়ান, সংখ্যা এবং স্ট্রিংয়ের জন্য কাজ করে; এবং instanceofআদিম বুলেট, সংখ্যা এবং স্ট্রিংয়ের জন্য কাজ করে না।

ভাগ্যক্রমে এই সমস্যার একটি সহজ সমাধান রয়েছে। এর ডিফল্ট বাস্তবায়ন toString(যেমন এটি স্থানীয়ভাবে সংজ্ঞায়িত Object.prototype.toString) [[Class]]আদিম মান এবং বস্তু উভয়ের অভ্যন্তরীণ সম্পত্তি প্রদান করে:

function classOf(value) {
    return Object.prototype.toString.call(value);
}

console.log(classOf(true));              // [object Boolean]
console.log(classOf(0));                 // [object Number]
console.log(classOf(""));                // [object String]
console.log(classOf(new Boolean(true))); // [object Boolean]
console.log(classOf(new Number(0)));     // [object Number]
console.log(classOf(new String("")));    // [object String]

[[Class]]একটি মানের অভ্যন্তরীণ সম্পত্তি মানটির চেয়ে অনেক বেশি কার্যকর typeof। আমরা Object.prototype.toStringনীচে typeofঅপারেটরের নিজস্ব (আরও দরকারী) সংস্করণ তৈরি করতে ব্যবহার করতে পারি :

function typeOf(value) {
    return Object.prototype.toString.call(value).slice(8, -1);
}

console.log(typeOf(true));              // Boolean
console.log(typeOf(0));                 // Number
console.log(typeOf(""));                // String
console.log(typeOf(new Boolean(true))); // Boolean
console.log(typeOf(new Number(0)));     // Number
console.log(typeOf(new String("")));    // String

আশা করি এই নিবন্ধটি সাহায্য করেছে। আদিম এবং মোড়ানো বস্তুর মধ্যে পার্থক্য সম্পর্কে আরও জানতে নিম্নলিখিত ব্লগ পোস্টটি পড়ুন: জাভাস্ক্রিপ্ট প্রিমিটিভসের গোপনীয় জীবন


6
+1, ওয়েলফ nullএকটি আদিম মান পাশাপাশি (কেবলমাত্র typeofঅপারেটর বিভ্রান্ত করছে)
বার্গি

33

আপনি নির্মাণকারী সম্পত্তি ব্যবহার করতে পারেন:

'foo'.constructor == String // returns true
true.constructor == Boolean // returns true

18
নোট করুন যে ভেরিয়েবল পরীক্ষা করার সময় এই প্রযুক্তিটি নির্দিষ্ট পরিস্থিতিতে ব্যর্থ হতে পারে। বর্তমান উইন্ডোটির সামনে Stringএবং Booleanউপরের উদাহরণে একটি অন্তর্নিহিত রেফারেন্স রয়েছে , সুতরাং আপনি যদি constructorঅন্য উইন্ডোতে তৈরি একটি স্ট্রিং ভেরিয়েবলের সম্পত্তি পরীক্ষা করছেন (পপআপ বা ফ্রেমের মতো) তবে এটি কেবল সমান হবে নাString , এটি হবে সমান হতে thatOtherWindowsName.String
মাইকেল ম্যাথিউজ

এবং উদাহরণস্বরূপ এটি মোকাবেলা করে না এবং উপযুক্ত বুলিয়ান ফলাফলটি ফেরত দেয় না?
ক্রিস নয়ে

5
যদি আপনি স্ট্রিংয়ের বংশধর হন তবে এটি ব্যর্থ হয়।
ব্রায়ান লারসন

1
Object.prototype.toString.call('foo') === '[object String]'
@ মিশেলম্যাথিউস

@ ব্রায়ানলারসেন এবং @ মিশেলম্যাথিউজ ব্যবহারে কোনও সমস্যা আছে কি d.constructor == String? যেমন একটি আলগা সমতা অপারেটর সহ।
dotnetCarpenter

7
 typeof(text) === 'string' || text instanceof String; 

আপনি এটি ব্যবহার করতে পারেন, এটি উভয় ক্ষেত্রেই কাজ করবে

  1. var text="foo"; // typof কাজ করবে

  2. String text= new String("foo"); // উদাহরণ কাজ করবে


3

এটি ECMAScript স্পেসিফিকেশন বিভাগ 7.3.19 ধাপ 3 এ সংজ্ঞায়িত করা হয়েছে :If Type(O) is not Object, return false.

অন্যান্য শব্দ, যদি ObjObj instanceof Callableএকটি বস্তু নয়, instanceofস্বল্প-সার্কিট হবে falseসরাসরি।


1

আমি বিশ্বাস করি যে আমি একটি কার্যকর সমাধান নিয়ে এসেছি:

Object.getPrototypeOf('test') === String.prototype    //true
Object.getPrototypeOf(1) === String.prototype         //false

-1

https://www.npmjs.com/package/typeof

instanceof(কনস্ট্রাক্টরের নাম) এর একটি স্ট্রিং-উপস্থাপনা প্রদান করে

function instanceOf(object) {
  var type = typeof object

  if (type === 'undefined') {
    return 'undefined'
  }

  if (object) {
    type = object.constructor.name
  } else if (type === 'object') {
    type = Object.prototype.toString.call(object).slice(8, -1)
  }

  return type.toLowerCase()
}

instanceOf(false)                  // "boolean"
instanceOf(new Promise(() => {}))  // "promise"
instanceOf(null)                   // "null"
instanceOf(undefined)              // "undefined"
instanceOf(1)                      // "number"
instanceOf(() => {})               // "function"
instanceOf([])                     // "array"

-2

আমার জন্য বিভ্রান্তি

"str".__proto__ // #1
=> String

সুতরাং "str" istanceof Stringফিরে আসা উচিত trueকারণ আইসট্যান্সফ নীচে হিসাবে কীভাবে কাজ করে:

"str".__proto__ == String.prototype // #2
=> true

# 1 এবং # 2 প্রকাশের ফলাফলগুলি একে অপরের বিরোধিতা করে, তাই তাদের মধ্যে একটিরও ভুল হওয়া উচিত।

# 1 টি ভুল

আমি বুঝতে পারি যে এটি __proto__অ-মানসম্পন্ন সম্পত্তি, তাই মানকটি ব্যবহার করুন:Object.getPrototypeOf

Object.getPrototypeOf("str") // #3
=> TypeError: Object.getPrototypeOf called on non-object

এখন # 2 এবং # 3 প্রকাশের মধ্যে কোনও বিভ্রান্তি নেই


2
# 1 সঠিক, কিন্তু এটা কারণে এর সম্পত্তি অ্যাকসেসর , যা বক্স তার নিজ নিজ বস্তুর ধরন, অনুরূপ আদিম মান Object("str").__proto__বা Object("str") instanceof String
জোনাথন লোনভস্কি

এই বিষয়টি দেখানোর জন্য @ জোনাথনলোনস্কি ধন্যবাদ। আমি এটি জানতাম না
এমকো

-8

অথবা আপনি ঠিক এর মতো আপনার নিজস্ব ফাংশনটি তৈরি করতে পারেন:

function isInstanceOf(obj, clazz){
  return (obj instanceof eval("("+clazz+")")) || (typeof obj == clazz.toLowerCase());
};

ব্যবহার:

isInstanceOf('','String');
isInstanceOf(new String(), 'String');

এই উভয় সত্য ফিরে উচিত।


14
আমি দেখতে পাই মন্দ।
আরিয়া কার্টার-ওয়েয়ার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.