يجب أن يكون النمط الذي تختاره لمشروعك هو أعلى معيار. ضعه كوصفًا في مشروعك وقم بربطه بهذا المستند كضمان لتناسق نمط الكود وقابليته للقراءة والقدرة على الصيانة.
1. فارغ
1.
2. ابدأ مشروعًا ، حدد المسافة البادئة (مساحة) أو علامة تبويب (كطريقة المسافة البادئة) قبل كتابة الرمز واستخدمه كأعلى معيار.
أ). لقدرة على القراءة ، أوصي دائمًا بتصميم المسافة البادئة عرض أحرف في تعديلاتك - وهذا يعادل مساحتين أو مساحتين بدلاً من علامة التبويب.
3. إذا كان المحرر الخاص بك يدعمها ، فقم دائمًا بتشغيل إعداد "عرض الشخصيات غير المرئية". الفوائد هي:
أ). ضمان الاتساق
ب). قم بإزالة المساحات في نهاية الخط
ج). إزالة المساحات الفارغة
د). التقديم والمقارنة أكثر قابلية للقراءة
2. تجميل القواعد
أ. الأقواس والأقواس وكفاح الخط
نسخة الكود كما يلي:
// if/else/for/then/try عادة
// هذا يساعد القراءة
// 2.A.1.1
// مثال على بناء الجملة الصعب
إذا (الشرط) dosomething () ؛
بينما (حالة) تكرار ++ ؛
لـ (var i = 0 ؛ i <100 ؛ i ++) someiterativefn () ؛
// 2.A.1.1
// استخدم المساحات لتحسين قابلية القراءة
إذا (الشرط) {
// إفادة
}
بينما (حالة) {
// إفادة
}
لـ (var i = 0 ؛ i <100 ؛ i ++) {
// إفادة
}
// ممارسة أفضل:
var i ،
الطول = 100 ؛
لـ (i = 0 ؛ i <length ؛ i ++) {
// إفادة
}
// أو...
var i = 0 ،
الطول = 100 ؛
لـ (؛ i <length ؛ i ++) {
// إفادة
}
var prop ؛
لـ (Prop in Object) {
// إفادة
}
إذا (صحيح) {
// إفادة
} آخر {
// إفادة
}
ب. تعيين ، إعلان ، وظيفة (وظائف مسماة ، تعبيرات الوظائف ، وظائف المنشئ)
نسخة الكود كما يلي:
// 2.B.1.1
// عامل
var foo = "bar" ،
num = 1 ،
undef
// الهوية الحرفية:
صفيف var = [] ،
Object = {} ؛
// 2.B.1.2
// باستخدام واحد فقط `var` ضمن نطاق (وظيفة) يساعد على تحسين قابلية القراءة
// وجعل قائمة البيانات الخاصة بك منظمة (يوفر لك أيضًا بعض كتابة لوحة المفاتيح)
// ليس جيدا
var foo = "" ؛
var bar = "" ؛
var Qux ؛
// جيد
var foo = "" ،
BAR = "" ،
quux
// أو..
تعليقات var // على هذه المتغيرات
foo = "" ،
BAR = "" ،
quux
// 2.B.1.3
// يجب أن يكون عبارة "var` دائمًا في الجزء العلوي من كل نطاق (وظيفة)
// أيضًا مناسبة للثوابت من ECMASCRIPT 6
// ليس جيدا
وظيفة foo () {
// هناك بيان قبل المتغير
var bar = "" ،
كوكس
}
// جيد
وظيفة foo () {
var bar = "" ،
كوكس
// جميع العبارات بعد المتغير
}
// 2.B.2.1
// إعلان الوظيفة المسماة
وظيفة foo (arg1 ، argn) {
}
// كيفية الاستخدام
Foo (Arg1 ، Argn) ؛
// 2.B.2.2
// إعلان الوظيفة المسماة
وظيفة مربع (رقم) {
رقم الإرجاع * ؛
}
// كيفية الاستخدام
مربع (10) ؛
// نمط تمرير استمرار غير طبيعي للغاية
وظيفة مربع (رقم ، رد الاتصال) {
رد الاتصال (رقم *) ؛
}
مربع (10 ، وظيفة (مربع) {
// محتوى رد الاتصال
}) ؛
// 2.B.2.3
// تعبير الوظيفة
var square = function (number) {
// إرجاع المحتوى ذي القيمة وذات الصلة
رقم الإرجاع * ؛
} ؛
// تعبير الوظيفة مع المعرف
// يحتوي هذا النموذج المفضل على وظائف إضافية تسمح له بالاتصال بنفسها
// وهناك معرف في المكدس
var factorial = function factorial (number) {
إذا (الرقم <2) {
العودة 1 ؛
}
رقم الإرجاع * Factorial (Number-1) ؛
} ؛
// 2.B.2.4
// إعلان مُنشئ
وظيفة foobar (خيارات) {
this.options = الخيارات ؛
}
// كيفية الاستخدام
var foobar = new foobar ({a: "alpha"}) ؛
foobar.options ؛
// {a: "alpha"}
استثناء ، التفاصيل
نسخة الكود كما يلي:
// 2.C.1.1
// وظائف مع عمليات الاسترجاعات
foo (function () {
// ملاحظة: لا توجد مسافات في الأقواس و "وظيفة" لدعوة الوظيفة الأولى
}) ؛
// تقبل الوظيفة "صفيف" كوسيطة ، بدون مسافات
foo (["alpha" ، "beta"]) ؛
// 2.C.1.2
// تقبل الوظيفة "كائن" كوسيطة ، بدون مسافات
فو ({{
ج: "ألفا" ،
ب: "بيتا"
}) ؛
// تقبل الوظيفة الحرفي "السلسلة" كوسيطة ، بدون مسافات
فو ("بار") ؛
// لا توجد مسافات داخل الأقواس المستخدمة للتجميع
if (! ("foo" في OBJ)) {
}
D. الاتساق دائما يفوز
في الأقسام 2.A-2.C ، يُقترح مساحة فارغة كطريقة توصية ، بناءً على غرض بسيط وأعلى: التوحيد. تجدر الإشارة إلى أن تفضيلات التنسيق ، مثل "المساحة الفارغة الداخلية" يجب أن تكون اختيارية ، ولكن يجب أن يكون هناك نوع واحد فقط من التعليمات البرمجية المصدر للمشروع بأكمله.
نسخة الكود كما يلي:
// 2.d.1.1
إذا (الشرط) {
// إفادة
}
بينما (حالة) {
// إفادة
}
لـ (var i = 0 ؛ i <100 ؛ i ++) {
// إفادة
}
إذا (صحيح) {
// إفادة
} آخر {
// إفادة
}
علامات الاقتباس
لا يهم ما إذا كنت تختار عروض أسعار واحدة أو مزدوجة ، فهي لا تحدث فرقًا في التحليل في JavaScript. ما يحتاجه على الإطلاق هو الاتساق. لا تخلط أبداً اقتباسين في نفس المشروع ، واختر واحدة ، واحتفظ به ثابتًا.
F. نهاية الخط والخط الفارغ
ترك فارغ سيؤدي إلى كسر الفرق واستخدام التغييرات غير قابلة للقراءة. ضع في اعتبارك تضمين الخطاف المسبق مسبقًا يحذف المساحات تلقائيًا في نهاية الخط والخطوط الفارغة.
3. اكتشاف النوع (من إرشادات نمط jQuery الأساسية)
A. النوع المباشر (النوع الفعلي ، النوع الفعلي)
خيط:
نسخة الكود كما يلي:
متغير typeof === "سلسلة"
رقم:
نسخة الكود كما يلي:
نوع typeof المتغير === "الرقم"
منطقية:
نسخة الكود كما يلي:
متغير typeof === "منطقي"
هدف:
نسخة الكود كما يلي:
TypeOF متغير === "كائن"
صفيف:
نسخة الكود كما يلي:
Array.Isarray (ArraylikeObject)
(إذا كان ذلك ممكنا)
العقدة:
نسخة الكود كما يلي:
elem.nodeType === 1
باطل:
نسخة الكود كما يلي:
متغير === فارغ
فارغ أو غير محدد:
نسخة الكود كما يلي:
متغير == فارغ
غير محدد:
المتغيرات العالمية:
نسخة الكود كما يلي:
متغير typeof === "غير محدد"
المتغيرات المحلية:
نسخة الكود كما يلي:
متغير === غير محدد
ملكية:
نسخة الكود كما يلي:
Object.prop === undefined
Object.hasownproperty (Prop)
"الدعامة" في الكائن
نوع التحويل (النوع الإكراه ، الأنواع الإكراهية)
النظر في معنى ما يلي ...
معطى HTML:
نسخة الكود كما يلي:
<type type = "text" id = "foo-input" value = "1">
// 3.B.1.1
// تم تعيين قيمة "0" ، اكتب "رقم"
var foo = 0 ؛
// typeof foo ؛
// "رقم"
...
// في التعليمات البرمجية اللاحقة ، تحتاج إلى تحديث `foo` وتعيين قيمة جديدة تم الحصول عليها في عنصر الإدخال
foo = document.getElementById ("foo-input"). القيمة ؛
// إذا قمت باختبار `typeof foo` الآن ، فستكون النتيجة" سلسلة "
// هذا يعني أن لديك منطقًا مشابهًا لهذا عند اكتشاف "foo` في عبارة IF:
if (foo === 1) {
TargetTask () ؛
}
// `thatstask ()` لن يتم تنفيذها أبدًا ، حتى لو كانت "foo" لها قيمة "1"
// 3.B.1.2
// يمكنك استخدام مشغل +/- Unary بذكاء لإلقاء النوع لحل المشكلة:
foo = +document.getElementById ("foo-input"). القيمة ؛
// ^ + يقوم المشغل Unary بتحويل كائن التشغيل إلى يمينه إلى "الرقم"
// typeof foo ؛
// "رقم"
if (foo === 1) {
TargetTask () ؛
}
// `markettask ()` سوف يتم استدعاؤه
فيما يلي بعض الأمثلة على الصب:
نسخة الكود كما يلي:
// 3.B.2.1
رقم var = 1 ،
String = "1" ،
Bool = false ؛
رقم؛
// 1
رقم + "" ؛
// "1"
خيط؛
// "1"
+سلسلة ؛
// 1
+string ++ ؛
// 1
خيط؛
// 2
منطقي
// خطأ شنيع
+بول ؛
// 0
Bool + "" ؛
// "خطأ شنيع"
// 3.B.2.2
رقم var = 1 ،
String = "1" ،
Bool = صحيح ؛
سلسلة === رقم ؛
// خطأ شنيع
سلسلة === رقم + "" ؛
// حقيقي
+string === number ؛
// حقيقي
Bool === number ؛
// خطأ شنيع
+bool === number ؛
// حقيقي
Bool === String ؛
// خطأ شنيع
Bool === !! String ؛
// حقيقي
// 3.B.2.3
var array = ["A" ، "B" ، "C"] ؛
!! ~ array.indexof ("a") ؛
// حقيقي
!! ~ array.indexof ("B") ؛
// حقيقي
!! ~ array.indexof ("C") ؛
// حقيقي
!! ~ array.indexof ("D") ؛
// خطأ شنيع
// تجدر الإشارة إلى أن ما سبق كلهم "ذكي غير ضروري"
// استخدم مخططًا واضحًا لمقارنة القيم التي تم إرجاعها
// على سبيل المثال indexof:
if (array.indexof ("A")> = 0) {
// ...
}
// 3.B.2.3
var num = 2.5 ؛
Parseint (num ، 10) ؛
// ما يعادل ...
~~ num ؛
num >> 0 ؛
num >>> 0 ؛
// النتائج كلها 2
// ضع في اعتبارك دائمًا ، سيتم التعامل مع القيم السلبية بشكل مختلف ...
var neg = -2.5 ؛
Parseint (neg ، 10) ؛
// ما يعادل ...
~~ neg ؛
neg >> 0 ؛
// النتائج كلها -2
// لكن...
neg >>> 0 ؛
// النتيجة هي 4294967294
4. العمليات المقارنة
نسخة الكود كما يلي:
// 4.1.1
// عند الحكم على ما إذا كان الصفيف لديه طول ، نسبة إلى استخدام هذا:
if (array.length> 0) ...
// ... لتحديد الأصالة ، يرجى استخدام هذا:
إذا (array.length) ...
// 4.1.2
// عند الحكم على ما إذا كان الصفيف فارغًا ، نسبة إلى استخدام هذا:
if (array.length === 0) ...
// ... لتحديد الأصالة ، يرجى استخدام هذا:
إذا (! Array.Length) ...
// 4.1.3
// عند الحكم على ما إذا كانت السلسلة فارغة ، نسبة إلى استخدام هذا:
إذا (سلسلة! == "") ...
// ... لتحديد الأصالة ، يرجى استخدام هذا:
إذا (سلسلة) ...
// 4.1.4
// عند الحكم على أن السلسلة فارغة ، نسبة إلى استخدام هذا:
إذا (سلسلة === "") ...
// ... لتحديد الأصالة ، يرجى استخدام هذا:
إذا (! سلسلة) ...
// 4.1.5
// عند الحكم على أن الإشارة صحيحة ، بالنسبة إلى استخدام هذا:
إذا (foo === صحيح) ...
// ... القاضي تمامًا كما تعتقد ، استمتع بفوائد الميزات المدمجة:
إذا (فو) ...
// 4.1.6
// عندما تكون مجرد الحكم على أن الإشارة خاطئة ، نسبة إلى استخدام هذا:
if (foo === false) ...
// ... قم بتحويله إلى True باستخدام علامة التعجب
إذا (! فو) ...
// ... تجدر الإشارة إلى أن هذا سوف يتطابق مع 0 ، "" ، فارغ ، غير محدد ، نان
// إذا كنت _MUST_ نوع منطقي خطأ ، يرجى استخدام هذا:
if (foo === false) ...
// 4.1.7
// إذا كنت ترغب في حساب مرجع ، فقد يكون فارغًا أو غير محدد ، لكنه ليس خطأ "،" أو 0 ،
// بالنسبة لاستخدام هذا:
if (foo === null || foo === undefined) ...
// ... استمتع بفوائد == اكتب صب ، مثل هذا:
إذا (foo == null) ...
// تذكر أن استخدام == سيجعل "Null" تطابق "Null" و "غير محدد"
// ولكن ليس "خطأ" ، "" أو 0
فارغ == غير محدد
احكم دائمًا على أفضل القيم وأبرزها ، ما سبق هو دليل وليس عقيدة.
نسخة الكود كما يلي:
// 4.2.1
// تعليمات لتحويل النوع والمقارنة
// لأول مرة `===` ، `==` يتبع (ما لم تكن هناك حاجة إلى مقارنة نوع فضفاض)
// `===` لا يقوم دائمًا بتحويل النوع ، مما يعني:
"1" === 1 ؛
// خطأ شنيع
// `==` يحول النوع ، وهو ما يعني:
"1" == 1 ؛
// حقيقي
// 4.2.2
// منطقية ، حقيقية ومزيفة
// boolean:
صحيح ، خطأ
// حقيقي:
"فو" ، 1
// pseudo:
"" ، 0 ، NULL ، غير محدد ، نان ، باطل 0
5. النمط العملي
نسخة الكود كما يلي:
// 5.1.1
// وحدة عملية
(وظيفة (عالمية) {
وحدة var = (function () {
var data = "secret" ؛
يعود {
// هذه قيمة منطقية
Bool: صحيح ،
// سلسلة
السلسلة: "سلسلة" ،
// صفيف
صفيف: [1 ، 2 ، 3 ، 4] ،
// كائن
هدف: {
لانج: "en-us"
} ،
getData: function () {
// احصل على قيمة "البيانات"
إرجاع البيانات ؛
} ،
setData: function (value) {
// إرجاع القيمة المخصصة لـ "البيانات"
إرجاع (البيانات = القيمة) ؛
}
} ؛
}) () ؛
// سيظهر البعض الآخر هنا
// تحويل الوحدة النمطية إلى كائن عالمي
global.module = الوحدة النمطية ؛
})( هذا )؛
// 5.2.1
// وظيفة بناء عملية
(وظيفة (عالمية) {
وظيفة ctor (foo) {
this.foo = foo ؛
إرجاع هذا ؛
}
ctor.prototype.getfoo = function () {
إرجاع هذا.
} ؛
ctor.prototype.setfoo = function (val) {
العودة (this.foo = val) ؛
} ؛
// لا تستخدم "جديد" للاتصال بوظيفة البناء ، يمكنك القيام بذلك:
var ctor = function (foo) {
إرجاع CTOR الجديد (FOO) ؛
} ؛
// تحويل وظيفة الإنشاء الخاصة بنا إلى كائن عالمي
Global.ctor = ctor ؛
})( هذا )؛
6. تسمية
أ. أنت لست مترجمًا/ضاغطًا بشريًا ، لذا حاول أن تتحول إلى واحد.
الكود التالي هو مثال على تسمية سيئة للغاية:
نسخة الكود كما يلي:
// 6.A.1.1
// رمز مثال التسمية السيئ
وظيفة Q (s) {
return document.queryselectarall (s) ؛
}
var i ، a = [] ، els = q ("#foo") ؛
لـ (i = 0 ؛ i <els.length ؛ i ++) {a.push (els [i]) ؛}
ليس هناك شك في أنك كتبت مثل هذا الرمز - آمل ألا يظهر مرة أخرى من اليوم.
فيما يلي رمز له نفس المنطق ، ولكن مع تسمية أكثر قوة ، و apt (وهيكل قابل للقراءة):
نسخة الكود كما يلي:
// 6.A.2.1
// تحسين رمز المثال المسماة
استفسار الوظيفة (المحدد) {
Return document.queryselectorall (Selector) ؛
}
var idx = 0 ،
عناصر = [] ،
Matches = Query ("#Foo") ،
الطول = Matches.Length ؛
لـ (؛ idx <length ؛ idx ++) {
elements.push (Matches [idx]) ؛
}
بعض نصائح التسمية الإضافية:
نسخة الكود كما يلي:
// 6.A.3.1
// المسماة سلسلة
"الكلب" هي سلسلة
// 6.A.3.2
// اسم صفائف
"[الكلاب"] "صفيف يحتوي على" سلسلة الكلاب
// 6.A.3.3
// وظائف الاسم ، الكائنات ، الحالات ، إلخ.
كامليال وظائف وإعلانات var
// 6.A.3.4
// اسم المنشئ ، النموذج الأولي ، إلخ.
Pascalcase ؛ بناء وظيفة
// 6.A.3.5
// اسم التعبيرات العادية
rdesc = // ؛
// 6.A.3.6
// من دليل نمط مكتبة جوجل إغلاق
FunctionNamesLikethis ؛
variablenameslikethis ؛
ConstructOrnamesLikethis ؛
enumnameslikethis ؛
MethodNamesLikethis ؛
Symboric_constants_like_this ؛
ب. مواجهة هذا
بالإضافة إلى استخدام المكالمة المعروفة والتطبيق ، يفضل دائمًا. قم بإنشاء إعلان محدد للمكالمات اللاحقة ، باستخدام الاسم المستعار عندما لا يكون هناك خيار أفضل.
نسخة الكود كما يلي:
// 6.B.1
جهاز الوظيفة (OPTS) {
this.value = null ؛
// إنشاء دفق جديد غير متزامن ، سيتم استدعاء هذا بشكل مستمر
Dream.Read (opts.path ، وظيفة (البيانات) {
// استخدم الدفق لإرجاع أحدث قيمة للبيانات وتحديث قيمة المثيل
this.value = البيانات ؛
} .bind (هذا)) ؛
// التحكم في تواتر الحدث الذي يثير
setInterval (function () {
// نشر حدث خاضع للرقابة
this.emit ("الحدث") ؛
} .bind (this) ، opts.freq || 100) ؛
}
// لنفترض أننا ورثنا Eventemitter ؛)
عندما لا يمكن تشغيله ، يتوفر ما يعادل .bind في معظم مكتبات JavaScript الحديثة.
نسخة الكود كما يلي:
// 6.B.2
// مثال: lodash/underscore ، _.bind ()
جهاز الوظيفة (OPTS) {
this.value = null ؛
Dream.Read (opts.path ، _.bind (function (data) {
this.value = البيانات ؛
}، هذا) )؛
setInterval (_. bind (function () {
this.emit ("الحدث") ؛
} ، هذا) ، opts.freq || 100) ؛
}
// مثال: jquery.proxy
جهاز الوظيفة (OPTS) {
this.value = null ؛
Dream.Read (opts.path ، jquery.proxy (وظيفة (البيانات) {
this.value = البيانات ؛
}، هذا) )؛
setInterval (jQuery.proxy (function () {
this.emit ("الحدث") ؛
} ، هذا) ، opts.freq || 100) ؛
}
// مثال: dojo.hitch
جهاز الوظيفة (OPTS) {
this.value = null ؛
Dream.Read (opts.path ، dojo.hitch (هذا ، الوظيفة (البيانات) {
this.value = البيانات ؛
})) ؛
setInterval (dojo.hitch (this ، function () {
this.emit ("الحدث") ؛
}) ، opts.freq || 100) ؛
}
توفير مرشح لإنشاء الاسم المستعار لهذا ، مع الذات كمعرف. من المحتمل جدًا أن يكون لهذا الأخطاء ويجب تجنبها قدر الإمكان.
نسخة الكود كما يلي:
// 6.B.3
جهاز الوظيفة (OPTS) {
var self = this ؛
this.value = null ؛
Dream.Read (opts.path ، وظيفة (البيانات) {
self.value = البيانات ؛
}) ؛
setInterval (function () {
self.emit ("الحدث") ؛
} ، opts.freq || 100) ؛
}
C. استخدم thisarg
العديد من أساليب النموذج الأولي في ES 5.1 لديها علامة thisarg خاصة ، استخدمها قدر الإمكان
نسخة الكود كما يلي:
// 6.c.1
var obj ؛
obj = {f: "foo" ، b: "bar" ، Q: "Qux"} ؛
Object.Keys (obj). for (وظيفة (مفتاح) {
// | هذا | إنه الآن "obj"
console.log (هذا [المفتاح]) ؛
} ، obj) ؛ // <- المعلمة الأخيرة هي `thisarg`
// اطبع...
// "فو"
// "حاجِز"
// "Qux"
يمكن استخدام Thisarg في Array.Protype.every ، Array.Protype.foreach ، Array.Protype.some ، Array.Protype.map ، و Array.Prototype.filter.
7
الأفكار والأفكار التي يفسرها هذا الجزء ليست عقائدية. بدلاً من ذلك ، يتم تشجيعه أكثر على الفضول بشأن الممارسات الحالية لمحاولة توفير حل أفضل لإكمال مهام برمجة JavaScript العامة.
أ. تجنب استخدام التبديل. سوف تتبع الطريقة الحديثة وظائف القائمة السوداء مع تعبيرات التبديل.
يبدو أن كلا من Firefox و Chrome قاما بتحسينات كبيرة لتبديل البيانات. http://jsperf.com/switch-vs-object-literal-vs-module
تجدر الإشارة إلى أنه يمكن رؤية التحسن هنا: https://github.com/rwldrn/idiomatic.js/issues/13
نسخة الكود كما يلي:
// 7.A.1.1
// مثال بيان التبديل
التبديل (فو) {
حالة "ألفا":
ألفا()؛
استراحة؛
حالة "بيتا":
بيتا () ؛
استراحة؛
تقصير:
// الفرع الافتراضي
استراحة؛
}
// 7.A.1.2
// طريقة يمكنها دعم الجمع وإعادة الاستخدام هي استخدام كائن لتخزين "الحالات".
// استخدم وظيفة للقيام بالتفويض:
VAR CASES ، PELEGATOR ؛
// قيمة الإرجاع للشرح فقط
الحالات = {
ألفا: وظيفة () {
// إفادة
// قيمة الإرجاع
إرجاع ["ألفا" ، الحجج. الطول] ؛
} ،
بيتا: وظيفة () {
// إفادة
// قيمة الإرجاع
إرجاع ["بيتا" ، الحجج. الطول] ؛
} ،
_default: function () {
// إفادة
// قيمة الإرجاع
إرجاع ["الافتراضي" ، الحجج. الطول] ؛
}
} ؛
Pearegator = function () {
var args ، مفتاح ، مندوب ؛
// تحويل "وسيطة" إلى صفيف
args = [] .slice.call (الحجج) ؛
// استخراج القيمة الأخيرة من "الوسيطة"
المفتاح = args.shift () ؛
// اتصل بالفرع الافتراضي
تفويض = case._default ؛
// تفويض الطريقة من الكائن
if (case.hasownproperty (key)) {
مندوب = الحالات [مفتاح] ؛
}
// يمكن ضبط نطاق ARG على قيمة محددة ،
// في هذه الحالة ، | null | بخير
Return DevEpate.Apply (NULL ، args) ؛
} ؛
// 7.A.1.3
// استخدم API في 7.A.1.2:
موفد ("ألفا" ، 1 ، 2 ، 3 ، 4 ، 5) ؛
// ["ألفا" ، 5]
// بالطبع ، يمكن تغيير قيمة مفتاح "الحالة" بسهولة إلى أي قيمة
var casekey ، SomeUserInput ؛
// هل هناك أي مدخلات محتملة لبعض الشكل؟
SomeUserInput = 9 ؛
if (SomeUserInput> 10) {
casekey = "alpha" ؛
} آخر {
casekey = "بيتا" ؛
}
// أو...
CaseKey = SomeUserInput> 10؟ "ألفا": "بيتا" ؛
// ثم...
موفد (CaseKey ، SomeUserInput) ؛
// ["بيتا" ، 1]
// بالطبع ، يمكن القيام بذلك ...
موفد () ؛
// ["افتراضي" ، 0]
ب. قيم الإرجاع مقدمًا لتحسين قابلية قراءة الكود دون فرق كبير في الأداء
نسخة الكود كما يلي:
// 7.b.1.1
// ليس جيدا:
وظيفة returnlate (foo) {
var ret ؛
if (foo) {
ret = "foo" ؛
} آخر {
ret = "quux" ؛
}
العودة
}
// جيد:
وظيفة returnearly (foo) {
if (foo) {
إرجاع "فو" ؛
}
إرجاع "Quux" ؛
}
8. الكائنات الأصلية والمضيفة (ملاحظة: لقد اعتقدت دائمًا أنه لا ينبغي ترجمة الكائنات المضيفة ، لذلك سأترجمها وفقًا لطريقة الكتابة العامة)
المبدأ الأساسي هو:
لا تفعل أي شيء غبي ، الأمور ستحسن دائمًا.
لتعزيز هذا المفهوم ، يرجى مشاهدة هذا العرض التوضيحي:
"كل شيء مسموح به: التمديد الأصلي" بقلم أندرو دوبونت (JSConf2011 ، بورتلاند ، أوريغون)
http://blip.tv/jsconf/jsconf2011-drew-dupont-everything-is-permted-extending-built-ins-5211542
9. التعليقات
يتم وضع تعليقات سطر واحد فوق الكود باعتباره الخيار الأول
خطوط متعددة على ما يرام
يجب تجنب التعليقات في نهاية الخط!
طريقة JSDOC جيدة أيضًا ، لكنها تستغرق المزيد من الوقت
10. استخدم لغة واحدة وحدها
بغض النظر عن اللغة التي ينص عليها مشرفي البرنامج (أو الفريق) من استخدام البرنامج ، يجب كتابة البرنامج بنفس اللغة فقط.
زائدة
فاصلة أولا
جميع المشاريع التي تستخدم هذا المستند كدليل نمط أساسي لا تسمح بتنسيقات رمز ما قبل Comma ما لم يتم تحديدها بشكل صريح أو المطلوب من قبل المؤلف.