javascript - تعريف - جافا سكريبت




تحقق مما إذا كان المتغير عبارة عن سلسلة في JavaScript (12)

كيف يمكنني تحديد ما إذا كان المتغير عبارة عن سلسلة أو أي شيء آخر في JavaScript؟


ملف أداة كاملة للتحقق من كل نوع من المتغيرات.

هنا هو الحل الكامل الذي لا يمنحك وظيفة الاستخدام الأساسية فقط لمعرفة ما إذا كانت القيمة هي كائن السلسلة أو أي شيء آخر. بالإضافة إلى بعض البعض الآخر جيد للقيام بوظائف.

يستخدم هذا الملف الخام في هذا المشروع رد فعل بسيط رد الفعل على جيثب رد فعل بسيط ردك

var Sys = {
    /** This Returns Object Type */
    getType: function(val){
        return Object.prototype.toString.call(val);
    },
    /** This Checks and Return if Object is Defined */
    isDefined: function(val){
        return val !== void 0 || typeof val !== 'undefined';
    }
    /** Run a Map on an Array **/
    map: function(arr,fn){
        var res = [], i=0;
        for( ; i<arr.length; ++i){
            res.push(fn(arr[i], i));
        }
        arr = null;
        return res;
    },
    /** Checks and Return if the prop is Objects own Property */
    hasOwnProp: function(obj, val){
        return Object.prototype.hasOwnProperty.call(obj, val);
    },
    /** Extend properties from extending Object to initial Object */
    extend: function(newObj, oldObj){
        for(var prop in oldObj){
            if(hasOwnProp(oldObj, prop)){
                newObj[prop] = oldObj[prop];
            }
        }
        return newObj;
    } }

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

سيعمل الكود أعلاه على إنشاء كائن Sys = {} يحتوي هذا الأسلوب على جميع الوظائف مثل getType ، isDefined لاستخدامها ، تحقق ببساطة من استدعاء هذه الطريقة كهذا.

if(Sys.isDefined(myVar)){ console.log('myVar is defined'); }else { console.log('no myVar is not defined.');}
//Similar to this 
var myStr = 'You are awesome.. !!';
if(Sys.isString(myStr)){console.log(myStr);}

أحب استخدام هذا الحل البسيط:

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

إذا كنت تعمل على بيئة node.js ، يمكنك ببساطة استخدام الدالة المضمنة هي سلسلة في utils.

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

تعديل: كما ذكرJehy ، تم إيقاف هذا منذ الإصدار 4.


افضل طريقه:

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');

وقد تم بناء كل واحدة من هذه الوظائف من خلال وظيفتها الطبقية المناسبة ، مثل "كائن جديد (") وما إلى ذلك.

أيضا ، بطة الكتابة: "إذا كان يبدو وكأنه بطة ، يمشي مثل بطة ، ورائحة مثل بطة - يجب أن يكون مصفوفة" معنى ، والتحقق من خصائصه.

أتمنى أن يساعدك هذا.

تصحيح؛ 2016/12/05

تذكر ، يمكنك دائمًا استخدام مزيج من الأساليب أيضًا. في ما يلي مثال على استخدام خريطة مضمنة من الإجراءات باستخدام 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

ستستخدم هذه الوظيفة "custom-casting" [مخصص] - بدلاً من ذلك ، "type - / - value-mapping" - لمعرفة ما إذا كان المتغير موجودًا بالفعل. الآن يمكنك تقسيم هذا الشعر سيئة بين 0 و 0 !

مرات عديدة لا تهتم حتى بنوعها . هناك طريقة أخرى للتحايل على الكتابة وهي دمج مجموعات Duck-Type:

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 يكون أسلوب .toString() method . لقد تأكدت فقط من أن السلسلة المكافئة للرقم كانت هي نفسها ، ثم تأكدت من أنك قمت بتمريرها إلى الدالة http كرقم. وبعبارة أخرى ، لم نهتم حتى بنوعه .

نأمل أن يعطيك المزيد للعمل مع :)


فقط للتوسع في answer DRAX @ ، سأفعل هذا:

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);
}

وستحسب أيضًا الأنواع null وغير undefined ، وستتولى رعاية الأنواع غير المتسلسلة ، مثل 0 .


لست متأكدًا إذا كنت تقصد معرفة ما إذا كانت string بغض النظر عن محتوياتها ، أو ما إذا كانت المحتويات عبارة عن رقم أو سلسلة ، بغض النظر عن نوعها.

لذا ، لمعرفة ما إذا كان نوعه عبارة عن سلسلة ، فهذا قد تم الإجابة عليه بالفعل.
ولكن لمعرفة ما إذا كانت تستند إلى محتوياته إذا كانت سلسلة أو رقمًا ، فسأستخدم هذا:

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

وبالنسبة لبعض الأمثلة:

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

منذ أن قام 580 شخص بالتصويت على إجابة غير صحيحة ، وصوت أكثر من 800 شخص للحصول على إجابة صحيحة ، لكني اعتقدت أنه قد يكون من المفيد إعادة إجابتي بشكل أبسط يمكن للجميع فهمه.

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

أو ، مضمنة (لدي إعداد UltiSnip لهذا):

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

FYI ، إجابة Pablo Santa Cruz خاطئة ، لأن typeof new String("string") هو object

إجابة DRAX دقيقة وعملية ، ويجب أن تكون الإجابة الصحيحة (بما أن بابلو سانتا كروز هو بالتأكيد غير صحيح ، ولن أجادل ضد التصويت الشعبي).

ومع ذلك ، فإن هذه الإجابة صحيحة أيضاً ، وفي الواقع أفضل إجابة (ربما ، على سبيل lodash ، اقتراح استخدام lodash / lodash underscore ). إخلاء المسؤولية: لقد ساهمت في كود الشفرة 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 ، إلخ.

PS. إذا كان بإمكان شخص ما إعادة كتابة ذلك للعمل في سياقات غير المتصفحات (مثل node.js)؟


هذا هو ما يعمل بالنسبة لي:

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

هنا هي وظيفة بسيطة أساسا لطباعة استجابة ajax ، والتي قد تكون سلسلة أو كائن json .

printData ():

function printData (data) {
    if (typeof data === 'string' || data instanceof String) { // plain string,
        console.log("string: %s", data);
    } else if (typeof data === 'object') { // object,
        console.log("object: %s", JSON.stringify(data));
    } else { // other
        var t = typeof data;
        console.log("%s: %o", t, data);
    }
}

استدعاء الوظيفة:

// call function,
printData("hello"); // string
printData({name:"Eric", age:12}); // object
printData(3); // number

ووجدت أيضًا أن هذا الأمر جيد جدًا ، وهو أقصر كثيرًا من الأمثلة الأخرى.

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

من خلال ربطه على علامات الاقتباس الفارغة ، يتم تحويل القيمة إلى سلسلة. إذا كان myVar عبارة عن سلسلة بالفعل ، فسيكون بيان if ناجحًا.


يمكنك استخدام عامل التشغيل typeof :

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

مثال من صفحة الويب هذه . (على سبيل المثال تم تعديل طفيف على الرغم من).

Here's إشارة لمشغل typeof .








javascript