سؤال

كما يمكن رؤيته في Mozilla changlog لـ JavaScript 1.7 فقد أضافوا مهمة التدمير.للأسف لست معجبًا جدًا ببناء الجملة (لماذا أكتب a وb مرتين؟):

var a, b;  
[a, b] = f();

شيء من هذا القبيل كان سيكون أفضل بكثير:

var [a, b] = f();

سيظل ذلك متوافقًا مع الإصدارات السابقة.لن تكون عملية التدمير المشابهة لبيثون متوافقة مع الإصدارات السابقة.

على أي حال، فإن أفضل حل لـ JavaScript 1.5 الذي تمكنت من التوصل إليه هو:

function assign(array, map) {
    var o = Object();
    var i = 0;
    $.each(map, function(e, _) {
        o[e] = array[i++];
    });
    return o;
}

الذي يعمل مثل:

var array = [1,2];
var _ = assign[array, { var1: null, var2: null });
_.var1; // prints 1
_.var2; // prints 2

لكن هذا سيء حقًا لأنه ليس له أي معنى.إنها مجرد غلاف فارغ لتخزين الأسماء.ولكن للأسف هناك حاجة إليها لأن JavaScript لا تحتوي على مؤشرات.على الجانب الإيجابي، يمكنك تعيين القيم الافتراضية في حالة عدم تطابق القيم.لاحظ أيضًا أن هذا الحل لا يحاول تقسيم المصفوفة.لذلك لا يمكنك أن تفعل شيئا مثل {first: 0, rest: 0}.ولكن يمكن القيام بذلك بسهولة، إذا أراد المرء هذا السلوك.

ما هو الحل الأفضل؟

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

المحلول

أولا، var [a, b] = f() يعمل على ما يرام في جافا سكريبت 1.7 - حاول

!

والثانية، يمكنك تذليل بناء الجملة الاستخدام <م> قليلا باستخدام with():

var array = [1,2];
with (assign(array, { var1: null, var2: null }))
{
   var1; // == 1
   var2; // == 2
}

وبطبيعة الحال، وهذا لن تسمح لك لتعديل قيم المتغيرات الحالية، لذلك IMHO انها مجموعة كبيرة أقل فائدة من 1.7 ميزة جافا سكريبت. في التعليمات البرمجية أنا أكتب <م> الآن ، أنا فقط العودة الأجسام مباشرة والرجوع أعضائها - انا انتظر الميزات 1.7 لتصبح أكثر المتاحة على نطاق واسع

نصائح أخرى

لا تحتاج إلى المتغير الوهمي "_".يمكنك إنشاء متغيرات "عامة" مباشرةً باستخدام نطاق كائن النافذة:

window["foo"] = "bar";
alert(foo); // Gives "bar"

فيما يلي بعض النقاط الإضافية:

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

وهنا ما توصلت إليه:

function destructure(dest, src) {  
    dest = dest.split(",");  

    for (var i = 0; i < src.length; i++) {  
        window[dest[i]] = src[i];  
    }  
}  

var arr = [42, 66];  

destructure("var1,var2", arr); 

alert(var1); // Gives 42
alert(var2); // Gives 66

إليك ما فعلته في PHPstorm 10:

ملف -> إعدادات -> لغات وأطر -> ...

... تحديد إصدار لغة جافا سكريبت لمثل جافا سكريبت 1.8.5 ...

-> انقر فوق تطبيق

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

function divMod1(a, b) {
    return [ Math.floor(a / b), a % b ];
}

var _ = divMod1(11, 3);
var div = _[0];
var mod = _[1];
alert("(1) div=" + div + ", mod=" + mod );

ولكن أعتقد أن نمط التالي هو أكثر idomatic:

function divMod2(a, b, callback) {
    callback(Math.floor(a / b), a % b);
}

divMod2(11, 3, function(div, mod) {
    alert("(2) div=" + div + ", mod=" + mod );
});

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

و(انظر الرمز الذي يعمل على http://jsfiddle.net/vVQE3/ )

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