هل يمكنني تعيين المتغيرات على غير محددة أو تمرير غير محددة كوسيطة؟

StackOverflow https://stackoverflow.com/questions/2235622

  •  19-09-2019
  •  | 
  •  

سؤال

أنا مرتبك قليلاً بشأن جافا سكريبت undefined و null قيم.

ماذا فعلت if (!testvar) في الواقع تفعل؟هل يتم اختباره ل undefined و null أو فقط undefined?

بمجرد تعريف المتغير، هل يمكنني مسحه مرة أخرى undefined (وبالتالي حذف المتغير)؟

يمكن أمرر undefined كمعلمة؟على سبيل المثال:

function test(var1, var2, var3) {

}

test("value1", undefined, "value2");
هل كانت مفيدة؟

المحلول

أنا في حيرة من أمري بشأن Javascript غير محدد وخالي.

لا تخلط بشأن null.إنه منطقي بشكل عام ويتصرف بشكل مشابه لمفاهيم لغات البرمجة النصية الأخرى للكائنات "null" أو "nil" أو "None" خارج النطاق.

undefined, ، من ناحية أخرى، هو أمر غريب في جافا سكريبت.إنه كائن مفرد يمثل قيمًا خارج النطاق، وهو في الأساس كائن ثانٍ متشابه ولكنه مختلف null.يأتي:

  1. عند استدعاء دالة تحتوي على وسائط أقل من قائمة الوسائط الموجودة في ملف function قوائم البيانات، يتم تعيين الوسيطات التي لم يتم تمريرها إلى undefined.يمكنك اختبار ذلك على سبيل المثال:

    function dosomething(arg1, arg2) {
        if (arg2===undefined)
        arg2= DEFAULT_VALUE_FOR_ARG2;
        ...
    }
    

    مع هذه الطريقة لا يمكنك معرفة الفرق بين dosomething(1) و dosomething(1, undefined); arg2 ستكون نفس القيمة في كليهما.إذا كنت بحاجة إلى معرفة الفرق، يمكنك إلقاء نظرة عليه arguments.length, ، ولكن إجراء وسيطات اختيارية كهذه ليس أمرًا سهل القراءة بشكل عام.

  2. عندما لا تحتوي الوظيفة على return value;, ، يعود undefined.ليست هناك حاجة عمومًا لاستخدام نتيجة الإرجاع هذه.

  3. عندما تعلن عن متغير من خلال وجود var a عبارة في كتلة، ولكن لم يتم تعيين قيمة لها بعد، فهي كذلك undefined.مرة أخرى، لا يجب عليك الاعتماد على ذلك أبدًا.

  4. المخيف typeof يعود المشغل 'undefined' عندما يكون معامله متغيرًا بسيطًا غير موجود، بدلاً من إلقاء خطأ كما يحدث عادةً إذا حاولت الرجوع إليه.(يمكنك أيضًا إعطائه متغيرًا بسيطًا بين قوسين، ولكن لا تعبير كامل يتضمن متغيرًا غير موجود.) لا فائدة كبيرة لذلك أيضًا.

  5. هذا هو المثير للجدل.عند الوصول إلى خاصية كائن غير موجود، لا تحصل على خطأ على الفور كما هو الحال في أي لغة أخرى.بدلا من ذلك تحصل على undefined هدف.(وبعد ذلك عندما تحاول استخدام ذلك undefined كائن لاحقًا في البرنامج النصي، فسوف يحدث خطأ بطريقة غريبة يصعب تعقبها أكثر مما لو كانت JavaScript قد أخطأت للتو.)

    غالبًا ما يستخدم هذا للتحقق من وجود الخصائص:

    if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
       ...do something...
    

    ومع ذلك، لأنه يمكنك تعيين undefined مثل أي قيمة أخرى:

    o.prop= undefined;
    

    هذا لا يكتشف في الواقع ما إذا كانت الخاصية موجودة بشكل موثوق.من الأفضل استخدام in عامل التشغيل، والذي لم يكن موجودًا في إصدار Netscape الأصلي لجافا سكريبت، ولكنه متاح في كل مكان الآن:

    if ('prop' in o)
        ...
    

في ملخص، undefined هي فوضى خاصة بجافا سكريبت، والتي تربك الجميع.بصرف النظر عن وسيطات الوظائف الاختيارية، حيث لا يوجد لدى JS آلية أخرى أكثر أناقة، undefined يجب اجتنابها.لا ينبغي أبدًا أن تكون جزءًا من اللغة؛ null كانت ستعمل بشكل جيد مع (2) و(3)، و(4) هي ميزة غير موجودة فقط لأنه في البداية لم يكن لدى JavaScript أي استثناءات.

ماذا فعلت if (!testvar) في الواقع تفعل؟هل يختبر غير محدد وخالي أم غير محدد فقط؟

مثل هذا الاختبار "للصدق" يتحقق ضده false, undefined, null, 0, NaN والسلاسل الفارغة.ولكن في هذه الحالة، نعم، هو حقا undefined يتعلق الأمر.المنظمة البحرية الدولية، يجب أن تكون أكثر وضوحًا بشأن ذلك وتقول if (testvar!==undefined).

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

يمكنك بالتأكيد تعيين undefined إليها، ولكن هذا لن يحذف المتغير.فقط delete object.property المشغل يزيل الأشياء حقًا.

delete والمقصود حقا للخصائص بدلا من المتغيرات على هذا النحو.سوف تسمح لك المتصفحات بالابتعاد مباشرة delete variable, ، ولكنها ليست فكرة جيدة ولن تعمل في الوضع الصارم لـ ECMAScript Fifth Edition.إذا كنت تريد تحرير مرجع إلى شيء ما حتى يمكن جمع القمامة، فسيكون من المعتاد أن تقول ذلك variable= null.

هل يمكنني تمرير غير محدد كمعلمة؟

نعم.

نصائح أخرى

لا يمكنك (يجب أليس كذلك) تحديد أي شيء غير محدد، حيث أن المتغير لن يكون غير محدد - أنت فقط معرف إلى شيء.

لا يمكنك (يجب أليس كذلك؟) undefined إلى وظيفة. إذا كنت ترغب في اجتياز قيمة فارغة، فاستخدم null في حين أن.

البيان if(!testvar) يتحقق من القيم الحقيقية / الخاطئة BOOLEAN، هذه الاختبارات الخاصة سواء testvar يقيم إلى false. وبعد حسب التعريف، null و undefined لا ينبغي تقييمها لا true أو false, ، ولكن JavaScript يقيم null كما false, ، ويعطي خطأ إذا حاولت تقييم متغير غير محدد.

لاختبار بشكل صحيح ل undefined أو null, ، استخدم هذه:

if(typeof(testvar) === "undefined") { ... }

if(testvar === null) { ... }

الفرق الأساسي هو ذلك undefined و null تمثل مفاهيم مختلفة.

فقط لو null كان متاحا، فلن تكون قادرا على تحديد ما إذا كان null تم تعيينه عن قصد كقيمة أو ما إذا كانت القيمة لم يتم تعيينها حتى الآن إلا إذا استخدمت خطأ مرهقا في اصطياد: على سبيل المثال

var a;

a == null; // This is true
a == undefined; // This is true;
a === undefined; // This is true;

ومع ذلك، إذا قمت بتعمد القيمة ل null, ، المساواة صارمة مع undefined فشل، مما يسمح لك بالتمييز بين null و undefined القيم:

var b = null;
b == null; // This is true
b == undefined; // This is true;
b === undefined; // This is false;

تحقق من المرجع هنا بدلا من الاعتماد على الناس يقولون قول القول غير المرغوب فيه مثل "الموجز، غير محدد هو فوضى محددة جافا سكريبت، التي يربك الجميع". فقط لأنك مرتبك، فإنه لا يعني أنه فوضى.

https:/developer.mozilla.org/en-us/docs/web/javascript/reference/global_objects/undefined.

هذا السلوك غير محدد أيضا لجافا سكريبت ويكمل المفهوم المعمم الذي يمكن أن يكون نتيجة منطقية true, false, ، مجهول (null)، لا قيمة (undefined)، أو حدث خطأ خطأ (error).

http://en.wikipedia.org/wiki/undefined_value.

أفضل طريقة للتحقق من القيم الخالية هي

if ( testVar !== null )
{
    // do action here
}

وللهدوء

if ( testVar !== undefined )
{
    // do action here
}

يمكنك تعيين avariable مع undefined.

testVar = undefined;
//typeof(testVar) will be equal to undefined.

نعم، يمكنك، لأن غير محدد معرف كما undefined.

console.log(
   /*global.*/undefined === window['undefined'] &&
   /*global.*/undefined === (function(){})() &&
   window['undefined']  === (function(){})()
) //true

حالتك:

test("value1", undefined, "value2")

يمكنك أيضا يزيد متغير الخاص بك غير محدد:

Object.defineProperty(this, 'u', {value : undefined});
console.log(u); //undefined

للإجابة على سؤالك الأول، وليس مشغل (!) سوف أكيد كل ما يتم إعطاؤه في قيمة منطقية. وبالتالي null, 0, false, NaN و "" (سلسلة فارغة) سوف تظهر كل شيء خطأ.

جافا سكريبت، كيفية تعيين متغير إلى غير محدد على Commandline:

تعيين متغير إلى غير محدد في js محطة سطر الأوامر JavaScript التي تأتي مع Java على Ubuntu 12.10.

el@defiant ~ $ js

js> typeof boo
"undefined"

js> boo
typein:2: ReferenceError: boo is not defined

js> boo=5
5

js> typeof boo
"number"

js> delete(boo)
true

js> typeof boo
"undefined"

js> boo
typein:7: ReferenceError: boo is not defined

إذا قمت بتعيين متغير إلى غير محدد في جافا سكريبت:

ضع هذا في myjs.html:

<html>
<body>
    <script type="text/JavaScript">
        document.write("aliens: " + aliens);
        document.write("typeof aliens: " + (typeof aliens));
        var aliens = "scramble the nimitz";
        document.write("found some aliens: " + (typeof aliens));
        document.write("not sayings its aliens but... " + aliens);
        aliens = undefined;
        document.write("aliens deleted");
        document.write("typeof aliens: " + (typeof aliens));
        document.write("you sure they are gone? " + aliens);
    </script>
</body>
</html>

يطبع هذا:

aliens: undefined
typeof aliens: undefined
found some aliens: string
not sayings its aliens but... scramble the nimitz
aliens deleted
typeof aliens: undefined
you sure they are gone? undefined

تحذير! عند تعيين المتغير الخاص بك إلى undefined، تقوم بتحديد المتغير الخاص بك إلى متغير آخر. إذا كان بعض الشخص متستر يعمل undefined = 'rm -rf /'; ثم كلما قمت بتعيين المتغير الخاص بك إلى غير محدد، ستتلقى هذه القيمة.

قد تتساءل كيف يمكنني إخراج الأجانب القيمة غير المحددة في البداية ويظل تشغيلها. انها بسبب رفع جافا سكريبت: http://www.adequveygood.com/javascript-scoping-and-hoisting.html.

جرب هذا:

// found on UglifyJS
variable = void 0;

ولل if (something) و if (!something) يستخدم بشكل شائع للتحقق مما إذا كان هناك شيء محدد أو غير محدد. علي سبيل المثال:

if (document.getElementById)

يتم تحويل المعرف إلى قيمة منطقية، لذلك undefined يتم تفسيره على النحو التالي false. وبعد هناك بالطبع قيم أخرى (مثل 0 و ") والتي يتم تفسيرها أيضا false, ، ولكن أي المعرف لا ينبغي أن يكون له قيمة قيمة أو أنك سعيد بمعالجة هذه القيمة كما undefined.

جافا سكريبت لديه أ delete المشغل الذي يمكن استخدامه لحذف عضو في كائن. اعتمادا على نطاق متغير (أي إذا كان عالميا أم لا) يمكنك حذفه لجعله غير محدد.

لا يوجد undefined الكلمة الأساسية التي يمكنك استخدامها كحرف غير محدد. يمكنك حذف المعلمات في مكالمة دالة لجعلها غير محددة، ولكن لا يمكن استخدامها إلا من خلال إرسال أسماء أقل إلى الوظيفة، ولا يمكنك حذف معلمة في الوسط.

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

يعمل هذا عن طريق إنشاء كائن جديد ومحاولة الوصول إلى خاصية عليه مع اسم تم إنشاؤه عشوائيا، والذي ننقله لن يكون لهما وسوف يكون له قيمة غير محددة.

function GenerateRandomString() {
    var text = "";
    var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    for (var i = 0; i < 50; i++)
        text += possible.charAt(Math.floor(Math.random() * possible.length));

    return text;
}

var myVar = {}[GenerateRandomString()];
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top