জাভাস্ক্রিপ্টে কোনও ভার স্ট্রিং কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


178

জাভাস্ক্রিপ্টে কোনও ভার স্ট্রিং কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?

আমি এটি চেষ্টা করেছি এবং এটি কাজ করে না ...

var a_string = "Hello, I'm a string.";

if (a_string typeof 'string') {
    // this is a string
}

উত্তর:


379

আপনি বন্ধ ছিল:

if (typeof a_string === 'string') {
    // this is a string
}

সম্পর্কিত নোটে: উপরের চেকটি new String('hello')সেই ধরণের Objectপরিবর্তে টাইপযুক্ত স্ট্রিং তৈরি করা হলে কাজ করবে না । এটি ঘিরে কাজ করার জন্য জটিল সমাধান রয়েছে, তবে কখনও সেভাবে স্ট্রিং তৈরি করা এড়ানো ভাল।


1
বন্ধুরা, আমি আপনাকে উভয়কেই একটি গ্রহণযোগ্য উত্তর দিতে চাই, তবে আমি করতে পারি না, আমার নির্দিষ্ট সমস্যার কাছে কে বেশি নিকটবর্তী, এই বিষয়ে গ্রহণযোগ্য উত্তর দেওয়ার চেয়ে আমি উভয়কেই +1 করতে পারি that সম্পূর্ণ ব্যাখ্যা।
ভিটো

এটি আমার জন্য কাজ করেছেif(typeof(str) === typeof(String()))
স্কট মারফি

78

typeofঅপারেটর একটি পোতা (তাই আপনার উদাহরণস্বরূপ LHS অর্থে দেখা যায় না) নয়।

আপনার এটির মতো ব্যবহার করা দরকার ...

if (typeof a_string == 'string') {
    // This is a string.
}

মনে রাখবেন, typeofএকটি অপারেটর, কোনও ফাংশন নয়। typeof(var)তবুও , আপনি বন্যটিতে প্রচুর ব্যবহৃত হতে দেখবেন । এটি যতটা বোঝায় var a = 4 + (1)

এছাড়াও, আপনি পাশাপাশি ==(সমতা তুলনা অপারেটর) ব্যবহার করতে পারেন যেহেতু উভয় অপারেশন Stringগুলি ( typeof সর্বদা একটি প্রদান করে String), জাভাস্ক্রিপ্টটি আমি ব্যবহার করা একই পদক্ষেপগুলি সম্পাদন করতে সংজ্ঞায়িত করা হয়েছে ===(কঠোর তুলনা অপারেটর)।

Box9 উল্লেখ হিসাবে , এটি তাত্ক্ষণিকভাবে কোনও বস্তু সনাক্ত করবে নাString

আপনি এটির সাথে এটি সনাক্ত করতে পারেন ....

var isString = str instanceof String;

jsFizz

... অথবা ...

var isString = str.constructor == String;

jsFizz

তবে এটি একাধিক windowপরিবেশে (ভাবেন না) কাজ করবে না iframe

আপনি এর সাথে এটি পেতে পারেন ...

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

jsFizz

তবে আবার, ( বক্স 9 হিসাবে উল্লেখ করা হয়েছে ), আপনি কেবল আক্ষরিক Stringবিন্যাস ব্যবহার করে আরও ভাল var str = 'I am a string';

আরও পড়া


1
@ বক্স 9 কোনও উদ্বেগ নেই, আমি যাইহোক রেপ ক্যাপড করছি: পি
অ্যালেক্স

@ অ্যালেক্স আমি এখন আছি: ও (আরও 10 মিনিট!)
ডেভিড টাং

3
আপনি যখন 24 ঘন্টা সময়কালের জন্য সর্বাধিক খ্যাতি অর্জন করেন তখন @ রবজি রেপটি ক্যাপড হয়। এর পরে, আপভোটগুলি আপনার খ্যাতির দিকে গুনে না।
অ্যালেক্স

কেবল মাত্র স্ট্রিং রয়েছে এমন সদস্যের উপস্থিতি পরীক্ষা করে কোনও ভেরিয়েবল একটি স্ট্রিং কিনা তা পরীক্ষা করা সম্ভব নয়? উদাহরণস্বরূপ: if(myVar.toUpperCase) alert('I am a string');? দেখুন: jsfiddle.net/tb3t4nsx
ingredient_15939

1
@ উপাদান_595939 এটি সত্যিই ভাল উপায় নয় ... কারণ{ toUpperCase: '' }
অ্যালেক্স

14

পূর্ববর্তী উত্তরগুলির সমন্বয় এই সমাধানগুলি সরবরাহ করে:

if (typeof str == 'string' || str instanceof String)

অথবা

Object.prototype.toString.call(str) == '[object String]'

4

নিম্নলিখিত এক্সপ্রেশন সত্য ফিরে :

'qwe'.constructor === String

নিম্নলিখিত এক্সপ্রেশন সত্য ফিরে :

typeof 'qwe' === 'string'

নিম্নলিখিত প্রকাশটি মিথ্যা (sic!) ফেরায়:

typeof new String('qwe') === 'string'

নিম্নলিখিত এক্সপ্রেশন সত্য ফিরে :

typeof new String('qwe').valueOf() === 'string'

সেরা এবং সঠিক উপায় ( imho ):

if (someVariable.constructor === String) {
   ...
}

1

এখনকার দিনগুলিতে আমি বিশ্বাস করি যে টাইপ অফ () এর কোনও ফাংশন ফর্ম ব্যবহার করা বেশি পছন্দ ...

if(filename === undefined || typeof(filename) !== "string" || filename === "") {
   console.log("no filename aborted.");
   return;
}

এর কোনও ফাংশন ফর্ম নেই typeof, আপনি কেবলমাত্র সেই প্রথম বন্ধনীগুলি দিয়ে ক্রিয়াকলাপ পরিচালনা করছেন। কিছু লোক এটি নির্দিষ্ট পরিস্থিতিতে আরও পাঠযোগ্য বলে মনে করতে পারে।
জন z

@ জোনজ "ক্রিয়াকলাপ নিয়ন্ত্রণের আদেশ" বলতে কী বোঝায়? ধন্যবাদ।
20

আমি মনে করি পরে আমি বুঝতে পেরেছি আপনি নির্ধারককে পরীক্ষা করতে পারেন এবং এটি তাত্ত্বিকভাবে পছন্দ করতে পারেন যেমনটি আমি ধারণা করেছি যে দ্রুত হবে তবে এটি তত দ্রুত নয়? উদাহরণ নম্বর 4 এখানে প্রথম বন্ধনী ব্যবহারের বিকাশকারীকে দেখায় momozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স /… এটি সংকলক বিবেচনা করার জন্য অবশ্যই আরও পাঠযোগ্য এবং কম। 'অর্ডার' সম্পর্কে আমার অনুমান সম্ভবত একটি গতির সমস্যা বা সংকলক কীভাবে আর্গুমেন্ট স্ট্যাকটি লোড করে তার সাথে সম্পর্কিত, আমি নিশ্চিত নই।
মাস্টার জেমস 13

1
@ a20 অপারেশনের ক্রমটি ক্রমটির বর্ণনা দেয় যাতে একাধিক অপারেশন থাকা বিবৃতিগুলির জন্য অপারেশনগুলি কার্যকর করা হয়। দেখুন ডেভেলপার.মোজিলা.আর.ইন- ইউএস / ডকস / ওয়েব / জাভা স্ক্রিপ্ট / রেফারেন্স / - - প্রথম বন্ধনী (অপারেটিং গ্রুপিং) এর অপারেটর অগ্রাধিকার রয়েছে এবং তাই প্রথমে মূল্যায়ন করা হয়। এই ক্ষেত্রে, প্রথম বন্ধনীগুলি filenameকেবল একটি বিবৃতিকে গোষ্ঠীবদ্ধ করে এবং তাই অকেজো এবং বহিরাগত। এই উত্তরের 0 টি স্কোর থাকা ভাল জিনিস কারণ এটি ভুল, বিভ্রান্তিমূলক এবং অসহায়; এটির নেতিবাচক স্কোর থাকলে এটি আরও ভাল।
জন z

লিঙ্কের জন্য খুব তথ্যপূর্ণ ধন্যবাদ। সুতরাং প্রথম বন্ধনী চেক করা হয় এবং প্রথমে চালানো হয়? সুতরাং যে বন্ধনী ছাড়াই ওরফে কল করার অন্যান্য উপায়গুলির জন্য পরীক্ষা না করেই সরাসরি চলে যেতে হবে, যা পরে ধাপে ধীর হতে পারে? না? আমি সেখানে রানটাইম সংকলক সম্পর্কে কী বুঝতে পারি না।
মাস্টার জেমস

0

a_string সমস্ত ক্ষেত্রে নাল বা অপরিজ্ঞাত জন্য পরীক্ষা করুন

if (a_string && typeof a_string === 'string') {
    // this is a string and it is not null or undefined.
}

typeof nullএবং typeof undefinedকখনই ফিরে আসবে না 'string', তাই typeof a_stringযথেষ্ট। নেক্রোপোস্টিংয়ের জন্য দুঃখিত
ইভান ফ্রোলভ

-3

আমার ব্যক্তিগত দৃষ্টিভঙ্গি, যা সমস্ত ক্ষেত্রে কাজ করে বলে মনে হচ্ছে, সদস্যদের উপস্থিতির জন্য যাচাই করা হচ্ছে যা কেবলমাত্র স্ট্রিংয়ের জন্য উপস্থিত থাকবে।

function isString(x) {
    return (typeof x == 'string' || typeof x == 'object' && x.toUpperCase && x.substr && x.charAt && x.trim && x.replace ? true : false);
}

দেখুন: http://jsfiddle.net/x75uy0o6/

আমি জানতে চাই যে এই পদ্ধতির ত্রুটি রয়েছে কিনা তবে এটি বছরের পর বছর ধরে আমাকে ভালভাবে চালিয়েছে।


2
এটি সহজেই কোনও পুরানো অবজেক্ট দ্বারা বোকা হয়ে যায় যার মধ্যে এই পদ্ধতিগুলি রয়েছে।
অ্যালেক্স

8
একে ডাক-টাইপিং বলা হয় - যেমন এটি যদি স্ট্রিংয়ের মতো চলে এবং এটি স্ট্রিংয়ের মতো কথা বলে তবে এটি স্ট্রিংও হতে পারে। আপনি যদি কিছুটা ক্রেজি হন তবে আপনি যদি মনে করেন যে স্ট্রিংটি পরীক্ষা করার এটি সেরা উপায় তবে জাভাস্ক্রিপ্ট একটি থান্ডারডোম, আপনি এটি করেন।
জন z
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.