هل يمكنني تعيين المتغيرات على غير محددة أو تمرير غير محددة كوسيطة؟
-
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
.يأتي:
عند استدعاء دالة تحتوي على وسائط أقل من قائمة الوسائط الموجودة في ملف
function
قوائم البيانات، يتم تعيين الوسيطات التي لم يتم تمريرها إلىundefined
.يمكنك اختبار ذلك على سبيل المثال:function dosomething(arg1, arg2) { if (arg2===undefined) arg2= DEFAULT_VALUE_FOR_ARG2; ... }
مع هذه الطريقة لا يمكنك معرفة الفرق بين
dosomething(1)
وdosomething(1, undefined)
;arg2
ستكون نفس القيمة في كليهما.إذا كنت بحاجة إلى معرفة الفرق، يمكنك إلقاء نظرة عليهarguments.length
, ، ولكن إجراء وسيطات اختيارية كهذه ليس أمرًا سهل القراءة بشكل عام.عندما لا تحتوي الوظيفة على
return value;
, ، يعودundefined
.ليست هناك حاجة عمومًا لاستخدام نتيجة الإرجاع هذه.عندما تعلن عن متغير من خلال وجود
var a
عبارة في كتلة، ولكن لم يتم تعيين قيمة لها بعد، فهي كذلكundefined
.مرة أخرى، لا يجب عليك الاعتماد على ذلك أبدًا.المخيف
typeof
يعود المشغل'undefined'
عندما يكون معامله متغيرًا بسيطًا غير موجود، بدلاً من إلقاء خطأ كما يحدث عادةً إذا حاولت الرجوع إليه.(يمكنك أيضًا إعطائه متغيرًا بسيطًا بين قوسين، ولكن لا تعبير كامل يتضمن متغيرًا غير موجود.) لا فائدة كبيرة لذلك أيضًا.هذا هو المثير للجدل.عند الوصول إلى خاصية كائن غير موجود، لا تحصل على خطأ على الفور كما هو الحال في أي لغة أخرى.بدلا من ذلك تحصل على
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
).
أفضل طريقة للتحقق من القيم الخالية هي
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()];