سؤال

في جافا سكريبت ، هناك نوعان من القيم التي في الأساس نقول 'لا توجد' - undefined و null.

الممتلكات التي مبرمج لم تسند أي شيء سوف يكون undefined, ولكن من أجل الملكية لتصبح null, null يجب أن يكون صراحة المسندة إليها.

فكرت مرة أن هناك حاجة إلى null لأن undefined هو القيمة البدائية ، null كائن.انها ليست حتى لو typeof null سوف تسفر عن 'object':في الواقع كلا بدائية القيم - يعني لا undefined ولا null يمكن إرجاع من منشئ وظيفة على حد سواء سيتم تحويلها إلى كائن فارغ (على المرء أن رمي خطأ أن تعلن فشل في المنشئات).

كما كل تقييم false في سياقات منطقية.الفرق الحقيقي الوحيد الذي يمكنني أن أفكر في أن يقيم المرء إلى NaN, ، 0 في الرقمية السياقات.

لذلك لماذا لا يوجد على حد سواء undefined و null إذا كان هذا فقط يخلط بين المبرمجين الذين هم غير صحيح التحقق null عندما تحاول معرفة ما إذا كانت المنشأة قد تم تعيين أم لا ؟

ما أود أن أعرف إذا كان أي شخص لديه معقولة سبيل المثال حيث انه من الضروري استخدام null التي لا يمكن التعبير عنها باستخدام undefined بدلا من ذلك.

حتى توافق عام في الآراء على ما يبدو أن undefined يعني 'لا توجد هذه المنشأة' حين null يعني 'العقار موجود ، ولكن لا يحمل قيمة'.

يمكنني أن أعيش مع ذلك إذا كان جافا سكريبت تطبيقات في الواقع فرض هذا السلوك - ولكن undefined هي صحيحة تماما بدائية قيمة ، لذلك يمكن بسهولة أن تسند إلى الخصائص الموجودة في كسر هذا العقد.لذلك, إذا كنت ترغب في التأكد إذا كانت الخاصية موجودة لديك لاستخدام in المشغل أو hasOwnProperty() على أي حال.لذلك مرة أخرى:ما هو الاستخدام العملي لفصل القيم undefined و null?

أنا فعلا استخدام undefined عندما كنت ترغب في إلغاء تعيين قيم الخصائص التي لم تعد تستخدم ولكن لا أريد أن delete.يجب استخدام null بدلا من ذلك ؟

هل كانت مفيدة؟

المحلول

السؤال ليس حقا "لماذا هناك قيمة فارغة في JS" - هناك قيمة فارغة من نوع ما في معظم اللغات و يعتبر عموما مفيدة جدا.

السؤال هو "لماذا هناك غير معرف القيمة في JS".الأماكن الرئيسية حيث يتم استخدامه:

  1. عندما تقوم بتعريف 'var x;' ولكن لا تكليف عليه ، x يحمل غير معرفة.
  2. عندما يحصل على وظيفة أقل من الحجج تعلن;
  3. عند الوصول غير موجودة خاصية كائن.

'null' بالتأكيد عملت فقط فضلا عن (1) و (2)*.(3) ينبغي حقا رمي استثناء على الفور ، وحقيقة أنه لا بدلا العودة غريب 'undefined' التي سوف تفشل في وقت لاحق ، هو مصدر كبير من التصحيح الصعوبة.

*:هل يمكن القول أيضا أن (2) يجب رمي استثناء ، ولكن بعد ذلك سيكون لديك لتوفير أفضل وأكثر وضوحا آلية الافتراضية/متغير الحجج.

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

أنا فعلا استخدام غير معرفة عندما كنت ترغب في إلغاء تعيين قيم الخصائص التي لم تعد تستخدم ، ولكن التي لا ترغب في حذفها.يجب استخدام فارغة بدلا من ذلك ؟

نعم.والحفاظ على 'undefined' باعتباره قيمة خاصة الإشارات عندما لغات أخرى قد رمي استثناء بدلا من ذلك.

'null' هو الأفضل عادة إلا على بعض أي دوم واجهات حيث وضع شيء 'null' يمكن أن تعطيك خطأ.غالبا في هذه الحالة إعداد سلسلة فارغة يميل إلى العمل.

نصائح أخرى

هنا ، ولكن باختصار:

وغير معروف هو عدم وجود نوع وقيمة، وباطل هو عدم وجود قيمة.

وعلاوة على ذلك، إذا كنت تفعل المقارنات '==' بسيطة، أنت على حق، وأنها تأتي خارج نفسه. ولكن في محاولة ===، الذي يقارن كل من النوع والقيمة، وستلاحظ الفرق.

وأنا لا أعتقد أن هناك أي سبب لوجود كل من null وundefined، لأن السبب الوحيد واقترح كثير من الناس ( "undefined يعني ليس هناك مثل هذه المتغيرات / الممتلكات") غير صحيح، على الأقل في جافا سكريبت. undefined لا يمكن ان اقول لكم ما اذا كان المتغير / الملكية موجودة أم لا.

console.log(foo);               // "ReferenceError: foo is not defined"
                                // foo does not exist
var foo;
console.log(foo);               // "undefined", a different response
console.log(foo === undefined); // "true", but it does exist

var obj = {};
console.log(obj.hasOwnProperty("foo")); // "false", no such property
obj.foo = undefined;
console.log(obj.hasOwnProperty("foo")); // "true", it exists and has the value "undefined"
console.log(obj.foo === undefined);     // "true", but it does exist

obj.bar = "delete me";
obj.bar = undefined;
console.log(obj.hasOwnProperty("bar")); // "true", not actually deleted
delete obj.bar;
console.log(obj.hasOwnProperty("bar")); // "false", deleted

وكما ترون، والتحقق من foo === undefined لا اقول لكم ما اذا foo موجودا، ووضع obj.bar = undefined لا فعلا حذف bar.

قد يكون نية المؤلف جافا سكريبت الأصلي الذي undefined يجب أن تمثل "العدم". ومع ذلك، فإن تنفيذ لا تتحول بهذه الطريقة.

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

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

وانا ذاهب الى أن نتفق على أن تنفيذ غريب والكثير من الوقت وعدم وضوح التمييز. ومع ذلك أعتقد أنه في جافا سكريبت على التمييز مهم. والتمكن من تعيين undefined أمر ضروري.

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

وغويا أنها تعني أشياء مختلفة. نوع اغية لديها واحد بالضبط قيمة في المجال الخاص به، لاغية وقد يتم تعيين خاصية هذه القيمة المحددة. غير معروف يمثل بعد أن تم تعيين نقص واضح في أي قيمة.

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

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

وباطل يعني أن "لا قيمة لها" تم تعيين صراحة. من الناحية العملية، وأنت تقول لي شيئا عن الملكية، وربما لا يتم استخدامه في هذا السياق، أو الذي لم يتحدد بعد قيمة.

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

جرب هذا المثال:

<html>
<head>
    <script type="text/javascript">
        function ShowObjProperties(obj) {
            var property, propCollection = "";

            for(property in obj) {
                propCollection += (property + ": " + obj[property] + "\n");
            }

            alert(propCollection);
        }

        var obj = {
            userid: 3,
            name: 'me!',
            speak: function() { alert('Hi! My name is ' + this.name + ' and my ID is ' + this.userid + '.'); }
        }

        //Shows all properties
        ShowObjProperties(obj);

        //The Speak function is no longer in the list!
        delete obj.speak;
        alert(typeof obj.speak);
        ShowObjProperties(obj);

        //The UserID is still listed, it just has no value!
        obj.userid = null;
        ShowObjProperties(obj);
    </script>
</head>
<body>

</body>
</html>

وأعتقد أن هناك استخدام حقيقي جدا لمدة 2 أنواع مختلفة هنا.

ما يتعلق الأمر الى انخفاض هو جافا سكريبت الطبيعة الديناميكية.

قد تكون غير معرفة

والأمور بحيث يمكن إضافتها في وقت لاحق. هذا يمكن القول لماذا جافا سكريبت قوية جدا وقابلة للتوسيع.

وانها ميزة لغة مهمة إذا كنت التفاف البرنامج حول النموذج evented جافا سكريبت.

// a key exists as a placeholder for something
if(obj[name] === null) 
// no key exists int eh hashtable that is in this object
if(obj[name] === undefined)

وهذا مفيد جدا إذا كنت تتعامل مع مجموعة من البيانات التي تحتاج الى قيمة لتمثيل 'لا شيء' للإشارة إلى بعض الإجراءات مختلفة من استخدام 'لا شيء' للإشارة إلى الإجراء الافتراضي.

filter_func_pt = {
  date:function(d){ return Math.round(d.getTime()/1000);},
  user: null,
}

function transform(obj){
    var ret = {};
    for( var prop in obj){
       var f = filter_func_pt[prop];
       if(f)
          ret[prop] = f(obj);
       else if(filter_func_pt[prop] === null)
         continue;
       else
         ret[prop] == obj;
    }
  return ret;
}

var a = {
   date: new Date(),
   user: 'sam'
   votes: [23, 41, 55] 
};

var b = transform(a);

/* b = {
 *    date: 1298582417
 *    votes: [23, 41, 55]
 * }
 */

في التعليمات البرمجية أعلاه ل<م> اغية الكلمة و <م> الخادم أغراض واضحة جدا ومختلفة غير محددة. والبحث التي لم يتم العثور في كائن filter_func_pt التي ترجع <م> غير معروف يعني لإضافة خاصية إلى كائن عودة كما هو، في حين أن <م> اغية <م /> يشير إلى أنه ينبغي حجب قيمة قيمة وليس المضافة، ووجود أي قيمة حقيقية في هذه الحالة يمثل وظيفة تستخدم لتحويل قيمة قبل إضافتها إلى <م> المتقاعد الكائن.

باطل هو جميل

وكذلك كل أنواع أخرى من العيش النصي.

نذكر:في جافا سكريبت ، هناك نوعان من القيم التي في الأساس نقول 'لا توجد' - غير فارغة.

لماذا تريد أن تقوله غير صحيح الأشياء؟!

"null" هو "تفريغ الكائن" تماما مثل "0" هو "فارغة وعدد".0 شيء -حتى الآن كان موجودا كنوع من عدد الشيء.null هو بالطبع أيضا فارغة ولكن "هي" و هو تعريف الشيء من نوع الكائن.

من الشائع أن أتكلم عن هذه شيء من "أنواع", عندما لا يكونون.في الحقيقة هم "فئات".ولكن هذا انتهى الآن.

لذلك سوف نتمسك به إلى القول بأن "null" هو نوع من كائن دون نوع.و "null" يقول "أنا كثيرا الوجود[!], ولكن أنا لم يكن لديك محتوى نوعي".

في حين غير معرف تفتقر إلى كل نوع و النوع حيث غير معرف يحدث أيضا أن يكون لها نوع التعريف.غير معروف نوع من نوع يصبح مميزة التصنيف.نوع من [هل "لا" موجودة كيف يمكنك تعريف "لا شيء"؟] السؤال.

نذكر:غير معرف ولا null يمكن أن عاد من منشئ وظيفة ، على حد سواء وسوف يكون محول إلى كائن فارغ

لقد نجحت مرة أخرى أقول غير شيء.بالطبع لا ، "undefined" ليس كائن ، سهل المميز الذي نحن البشر فهم ؛ ولكن على عكس ذلك null وهي تقول لك: هذا النوع هو الصحيح ، ولكن النوع الذي تبحث عنه غير الواردة في ذلك ، أو على الأقل ليس في هذا الوقت.تأتي زيارتنا في وقت لاحق عندما نضع\تعيين بعض وجوه في\إلى ذلك.

نذكر:الفرق الحقيقي الوحيد الذي يمكنني أن أفكر في أن يقيم المرء إلى نان ، 0 في الرقمية السياقات.

الذي يجعل النقطة الأساسية التمييز ، كما ذكر: غير معرف هو عادي رمزية و بما أنها تتكون من نفس 'الوراثية' المواد أقارب:سلاسل ، [ +undefined ] عملية بطة-تحويله إلى نان ، وبالمثل فارغة بالطبع سوف يتحول نفسه إلى النوع الصحيح 0 \رقم بدلا من ذلك ، و بدلا من غير معرف من شأنها أن تتحول إلى سلسلة (!التي ليست فارغة!) وهذا هو بالضبط السبب في أنه ينتج نان بدلا من ذلك.حيث:+غير معروف >> +"غير معرف" >> نان.منذ الرقمية السياق تتوقع قيمة واضحة.

في حين منطقية السياق يتوقع مرجع يجد شيئا لتحويل عائدات 'كاذبة'.

لندخل الآن...

نذكر:لذلك مرة أخرى:ما هو الاستخدام العملي منفصلة القيم غير فارغة?

سأحاول أن أعطيك اثنين فقط التجريبية أمثلة ونأمل أن يكون كافيا

oElement.onclick >> null

//يعني -الخاصية موجودة ؛ المتوقع لها قيمة من نوع: وجوه, وأن oElement يدعم "onclick" الحدث!

oElement.innerText >> ""

//يعني - الخاصية موجودة ؛ المتوقع لها قيمة من نوع: سلسلة, مما يعني أن oElement يدعم "innerText" الملكية.

على كلا الحالات-إذا كنت تتلقى "غير معروف" يعني أن الخاصية لا توجد ؛ غير معتمد أو خطأ (ua بائع) التنفيذ.

البقاء الصقيع والمتعة.

وبعد قراءة مناقشة مذهلة فيما يتعلق غير معروف مقابل لاغية، استغرق البحث قليلا على جوجل لي لتوثيق موزيلا https://developer.mozilla.org/en- الولايات المتحدة / مستندات / الانترنت / جافا سكريبت / المرجع / Global_Objects / لاغية هو مذكور - لاغية في كثير من الأحيان يتم استرداد في مكان يمكن توقع كائن ولكن لا يوجد كائن هو ذات الصلة.

وأليس مماثل غير أن نمط الكائن لاغية https://en.wikipedia.org/wiki/Null_object_pattern

وهكذا اعتقد هذا معنى أن يكون نوع البيانات خالية.

وذكرت الوثائق أيضا لاغية تشير typeof // "وجوه" (وليس "باطلا" لأسباب القديمة)

ولست متأكدا ما هي أسباب الإرث

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top