ในบทนี้จะชี้ให้เห็นความผิดพลาดของ JavaScript บางทั่วไป
ตั้งใจใช้ตัวดำเนินการกำหนด
โปรแกรม JavaScript อาจสร้างผลที่ไม่คาดคิดถ้าเป็นโปรแกรมเมอร์ตั้งใจใช้ผู้ประกอบการที่ได้รับมอบหมาย (=) แทนการดำเนินการเปรียบเทียบ (==) ในถ้างบ
นี้ if คำสั่งส่งกลับ false (ตามคาด) เพราะ x ไม่เท่ากับ 10:
var x = 0;
if (x == 10)
ลองตัวเอง» นี้ if งบผลตอบแทน true (อาจจะไม่เป็นไปตามคาด) เพราะ 10 เป็นจริง:
var x = 0;
if (x = 10)
ลองตัวเอง» นี้ if คำสั่งส่งกลับ false (อาจจะไม่เป็นไปตามคาด) เพราะเป็นเท็จ 0:
var x = 0;
if (x = 0)
ลองตัวเอง» งานเสมอกลับค่าของที่ได้รับมอบหมาย
คาดหวังว่าการเปรียบเทียบหลวม
ในการเปรียบเทียบปกติชนิดข้อมูลที่ไม่สำคัญ ถ้ามีคำสั่งนี้จะส่งกลับ true :
var x = 10;
var y = "10";
if (x == y)
ลองตัวเอง» ในการเปรียบเทียบเข้มงวดชนิดข้อมูลไม่ก็ตาม ถ้ามีคำสั่งนี้จะส่งกลับ false :
var x = 10;
var y = "10";
if (x === y)
ลองตัวเอง» มันเป็นความผิดพลาดที่จะลืมว่างบสวิทช์ใช้การเปรียบเทียบที่เข้มงวด:
สวิทช์กรณีนี้จะแสดงการแจ้งเตือน:
var x = 10;
switch(x) {
case 10: alert("Hello");
}
ลองตัวเอง» สวิทช์กรณีนี้จะไม่แสดงการแจ้งเตือน:
var x = 10;
switch(x) {
case "10": alert("Hello");
}
ลองตัวเอง» ทำให้เกิดความสับสนและเพิ่ม Concatenation
นอกจากนี้เป็นเรื่องเกี่ยวกับการเพิ่มตัวเลข
เรียงต่อกันเป็นเรื่องเกี่ยวกับการเพิ่มสตริง
ใน JavaScript การดำเนินงานทั้งใช้ประกอบ + เดียวกัน
ด้วยเหตุนี้การเพิ่มจำนวนเป็นตัวเลขจะผลิตได้ผลที่แตกต่างกันจากการเพิ่มจำนวนเป็นสตริง:
var x = 10 + 5; //
the result in x is 15
var x = 10 + "5";
// the result in x is "105"
ลองตัวเอง» เมื่อมีการเพิ่มตัวแปรทั้งสองก็อาจเป็นเรื่องยากที่จะคาดการณ์ผลลัพธ์:
var x = 10;
var y = 5;
var z = x + y;
// the result in z is 15
var x = 10;
var y = "5";
var z =
x + y;
// the result in z is "105"
ลองตัวเอง» ความเข้าใจผิดที่ลอยตัว
ตัวเลขทั้งหมดใน JavaScript จะถูกเก็บเป็น 64 บิตตัวเลขทศนิยม (ลอย)
ทุกภาษาการเขียนโปรแกรมรวมทั้ง JavaScript, มีปัญหากับค่าที่แม่นยำลอยจุด:
var x = 0.1;
var y = 0.2;
var z = x + y
// the result in z will not be 0.3
if (z == 0.3)
// this if test will fail
ลองตัวเอง» เพื่อแก้ปัญหาดังกล่าวข้างต้นจะช่วยให้คูณและหาร:
ทำลายสตริง JavaScript
JavaScript จะช่วยให้คุณที่จะทำลายคำสั่งเป็นสองสาย:
แต่หมดงบในช่วงกลางของสตริงจะไม่ทำงาน:
คุณต้องใช้ "ทับขวา" ถ้าคุณต้องทำลายคำสั่งในสตริง:
วางผิดอัฒภาค
เพราะถูกใส่ผิดอัฒภาคบล็อกรหัสนี้จะดำเนินการโดยไม่คำนึงถึงความคุ้มค่าของ x:
if (x == 19);
{
// code block
}
ลองตัวเอง» หมดงบกลับ
มันเป็นพฤติกรรม JavaScript เริ่มต้นที่จะปิดคำสั่งโดยอัตโนมัติเมื่อสิ้นสุดของบรรทัด
ด้วยเหตุนี้ทั้งสองจะกลับมาตัวอย่างผลเดียวกัน:
JavaScript นอกจากนี้ยังจะช่วยให้คุณสามารถที่จะทำลายคำสั่งเป็นสองสาย
ด้วยเหตุนี้ตัวอย่างที่ 3 ยังจะกลับผลเดียวกัน:
แต่สิ่งที่จะเกิดขึ้นถ้าคุณทำลายคำสั่งกลับในสองบรรทัดเช่นนี้
ฟังก์ชั่นจะกลับมาไม่ได้กำหนด!
ทำไม? เพราะคิดว่า JavaScript คุณหมายถึง:
คำอธิบาย
ถ้ามีคำสั่งเป็นเหมือนสมบูรณ์:
var
JavaScript จะพยายามที่จะดำเนินการคำสั่งโดยการอ่านบรรทัดถัดไป:
power = 10;
แต่เนื่องจากคำสั่งนี้เป็นที่สมบูรณ์แบบ:
return
JavaScript จะปิดโดยอัตโนมัติเช่นนี้
return;
นี้เกิดขึ้นเพราะปิด (สิ้นสุด) งบอัฒภาคเป็นตัวเลือกใน JavaScript
JavaScript จะปิดคำสั่งกลับในตอนท้ายของสายเพราะมันเป็นคำสั่งที่สมบูรณ์
ไม่เคยทำลายคำสั่งกลับ
การเข้าถึงอาร์เรย์กับดัชนีชื่อ
การเขียนโปรแกรมภาษาหลายอาร์เรย์สนับสนุนกับดัชนีชื่อ
อาร์เรย์กับดัชนีชื่อจะเรียกว่าเชื่อมโยงอาร์เรย์ (หรือแฮช)
JavaScript ไม่สนับสนุนอาร์เรย์กับดัชนีชื่อ
ใน JavaScript อาร์เรย์ใช้ดัชนีหมายเลข:
ตัวอย่าง
var person = [];
person[0] = "John";
person[1] = "Doe";
person[2] = 46;
var x = person.length;
// person.length will return 3
var y = person[0];
// person[0] will return "John"
ลองตัวเอง» ใน JavaScript ใช้วัตถุชื่อดัชนี
ถ้าคุณใช้ดัชนีชื่อเมื่อมีการเข้าถึงอาร์เรย์ JavaScript จะ redefine อาร์เรย์ไปยังวัตถุมาตรฐาน
หลังจากที่นิยามใหม่อัตโนมัติวิธีการที่หลากหลายและคุณสมบัติที่จะให้ผลลัพธ์ที่ไม่ได้กำหนดหรือไม่ถูกต้อง:
ตัวอย่าง:
var person = [];
person["firstName"] = "John";
person["lastName"] = "Doe";
person["age"] = 46;
var x = person.length; // person.length will
return 0
var y = person[0];
// person[0] will return undefined
ลองตัวเอง» สิ้นสุดวันที่นิยามอาร์เรย์ด้วยเครื่องหมายจุลภาค
ไม่ถูกต้อง:
points = [40, 100, 1, 5, 25, 10,];
บาง JSON และ JavaScript เครื่องยนต์จะล้มเหลวหรือประพฤติตนไม่คาดคิด
แก้ไข:
points = [40, 100, 1, 5, 25, 10];
สิ้นสุดวันที่นิยามวัตถุที่มีเครื่องหมายจุลภาค
ไม่ถูกต้อง:
person = {firstName:"John", lastName:"Doe", age:46,}
บาง JSON และ JavaScript เครื่องยนต์จะล้มเหลวหรือประพฤติตนไม่คาดคิด
แก้ไข:
person = {firstName:"John", lastName:"Doe", age:46}
ไม่ได้กำหนดเป็นไม่เป็นโมฆะ
ด้วย JavaScript, null สำหรับวัตถุที่ไม่ได้กำหนดเป็นตัวแปรคุณสมบัติและวิธีการ
จะเป็นโมฆะวัตถุจะต้องมีการกำหนดมิฉะนั้นจะไม่ได้กำหนด
หากคุณต้องการที่จะทดสอบว่าวัตถุที่มีอยู่นี้จะโยนความผิดพลาดถ้าวัตถุไม่ได้กำหนด:
ไม่ถูกต้อง:
if (myObj !== null && typeof myObj !== "undefined")
ด้วยเหตุนี้คุณต้องทดสอบ typeof () ครั้งแรก:
แก้ไข:
if (typeof myObj !== "undefined" && myObj !== null)
คาดหวังว่าบล็อกขอบเขตระดับ
JavaScript ไม่สร้างขอบเขตใหม่สำหรับรหัสแต่ละบล็อก
มันเป็นความจริงในการเขียนโปรแกรมภาษาจำนวนมาก แต่ไม่เป็นความจริงใน JavaScript
มันเป็นความผิดพลาดที่พบบ่อยในหมู่นักพัฒนา JavaScript ใหม่ที่จะเชื่อว่ารหัสนี้ส่งกลับไม่ได้กำหนด: