โปรดทราบว่าฉันกำลังอ้างอิงข้อโต้แย้งทั้งหมดของฉันในกรณีการใช้งานจริง ข้อโต้แย้งที่ไม่สามารถสำรองด้วยตัวอย่างการใช้งานในแอปพลิเคชันจริงที่สมบูรณ์น่าสนใจและมีประโยชน์นั้นไม่ถูกต้อง ฉันเคยเห็น "การสาธิตภาษา" เล็ก ๆ น้อย ๆ ที่ทุกคนมีฉันเห็นบล็อกโพสต์รายละเอียดว่าต้นแบบและการพิมพ์แบบไดนามิกทำให้ตัวอย่างเล็ก ๆ น้อย ๆ เล็กน้อยสักสองสามบรรทัดที่สั้นกว่าใน C # แต่สิ่งเหล่านั้นไม่เกี่ยวข้องกัน สำหรับปัญหาที่คุณพบในการเขียน
โค้ดจริงไม่ใช่การสาธิตขนาดเล็กและของเล่น ดังนั้นนี่คือกริปของฉันกับ JS:
a) Magic 'this' นี่คือสิ่งนี้ยกเว้นเมื่อเป็นเช่นนี้ JavaScript ผลักดันให้คุณใช้ฟังก์ชั่นที่ไม่ระบุชื่อทั่วทุกแห่งยกเว้นพวกเขามักจะสูญเสียบริบทที่เหมาะสมสำหรับตัวแปร 'this' ดังนั้นคุณจะต้องจบด้วยรหัสที่โง่เช่น "var _this = นี่" ทั่วทุกที่แล้วใช้มัน ภายใน callbacks หรือฟังก์ชั่นอื่น ๆ ของคุณ บางวันฉันสาบานว่าจำนวนหน้าที่ฉันจัดการเพื่อเขียนที่ไม่ใช้การเปลี่ยนชื่อ 'นี้' จริง ๆ แล้วมีขนาดเล็กกว่าจำนวนที่ทำ
b) 1 + "1" - 1 = 10 นอกจากนี้ "1" + 0 = "10" ใช่สิ่งนี้ทำให้เกิดข้อผิดพลาดสำหรับแอปพลิเคชันของเราซึ่งข้อมูลที่คาดว่าจะเป็นตัวเลขถูกโหลดจากไฟล์ JSON เป็นสตริงเนื่องจากข้อผิดพลาดในแอปพลิเคชันอื่นและผลลัพธ์ไม่ดี รหัสการโหลดทั้งหมดของเราต้องได้รับการอัปเดตเพื่อเพิ่มการแปลงประเภทจำนวนมากทั่วทุกที่ เมื่อฉันต้องการบางสิ่งบางอย่างที่จะเป็นตัวเลขฉันอยากให้มันเป็นตัวเลขไม่ใช่สตริงหรือวัตถุหรือเป็นโมฆะหรืออย่างอื่น Lua ซึ่งคล้ายกับจาวาสคริปต์ในทุก ๆ ด้านแก้ไขปัญหานี้โดยการไม่ปัญญาอ่อนพอที่จะใช้ตัวดำเนินการเดียวกันสำหรับการบวกและการต่อสตริง
c) Global โดยตัวแปรเริ่มต้น ดังนั้นแม้ว่าคุณจะโต้แย้งว่าการพิมพ์แบบไดนามิกเป็นเพียง "ง่ายขึ้น" เพราะคุณไม่ต้องคิดเกี่ยวกับการประกาศตัวแปร JavaScript จะโยนอาร์กิวเมนต์นั้นออกไปนอกหน้าต่างโดยทำให้คุณใส่ 'var' ต่อหน้าตัวระบุใหม่ทั่วทุกที่ . ถ้าอย่างนั้นคุณก็ลืมมันไป
d) ต้นแบบแทนคลาส มีแอปพลิเคชั่น JavaScript ขนาดใหญ่ในโลกจริงจำนวนน้อยมากที่ไม่ได้เชื่อมต่อระบบคลาสของตัวเองเพื่อหลีกเลี่ยงการใช้ต้นแบบที่ไร้ประโยชน์ในสถาปัตยกรรมแอปพลิเคชันขนาดใหญ่ แอพเดียวกันนั้นใช้ต้นแบบน้อยที่สุดในการขยายประเภท JavaScript พื้นฐานและเพียงเพราะ JS นั้นได้รับการออกแบบมาไม่ดีแม้แต่ในตัวที่น่าสนใจทั้งสองประเภทที่มาพร้อมก็ขาดคุณสมบัติครึ่งหนึ่งที่คุณคาดหวัง
e) ไม่สามารถสร้างประเภทพาส - บาย - ค่า นี่เป็นปัญหาที่พบบ่อยในทุกภาษานอกเหนือจาก C ++ / D จริงๆแล้ว สำหรับผู้ที่ใช้ JavaScript เพื่อเขียนแอป WebGL ให้ดูที่ไลบรารีพีชคณิตเชิงเส้นทั้งหมดสำหรับ JavaScript ในแอป 3D คุณใช้เวกเตอร์บ่อยกว่าสเกลาร์ ลองนึกภาพถ้าจำนวนเต็มในแอปของคุณถูกส่งผ่านโดยการอ้างอิงดังนั้น "a = 1; b = a; b ++" ทำทั้ง a และ b เท่ากับ 2 ทุกเวกเตอร์องค์ประกอบสามชิ้นเป็นวัตถุเต็มสมบูรณ์ พวกเขาถูกส่งผ่านโดยการอ้างอิง (ที่มาของข้อบกพร่องเกือบครึ่งในเกม WebGL ของเราในความเป็นจริงแล้ว) มีอยู่ในปริมาณมากถูกจัดสรรเป็นกองและเก็บขยะซึ่งทำให้เกิดแรงกดดันอย่างมากต่อ GC ซึ่งสามารถและส่งผลให้ GC หยุดชั่วคราวในเกม WebGL ที่เรียบง่าย นอกเสียจากว่าผู้พัฒนาจะกระโดดผ่านห่วงที่ซับซ้อนอย่างน่าขันเพื่อหลีกเลี่ยงการสร้างเวกเตอร์ใหม่ในทุก ๆ ที่ที่มันมีเหตุผลในการสร้างเวกเตอร์ใหม่ คุณไม่สามารถมีผู้ปฏิบัติงานมากไปดังนั้นคุณมีนิพจน์ขนาดใหญ่และน่าเกลียดในการทำงานขั้นพื้นฐาน การเข้าถึงแต่ละองค์ประกอบช้า วัตถุไม่ได้ถูกจัดเรียงอย่างเป็นธรรมชาติและด้วยเหตุนี้จึงช้าอย่างไม่น่าเชื่อที่จะผลักดันลงในบัฟเฟอร์จุดสุดยอดถ้าคุณใช้พวกเขาเป็นอินสแตนซ์ Float32Array ซึ่งสร้างความสับสนให้อึออกจากเครื่องมือเพิ่มประสิทธิภาพของทั้ง V8 และ SpiderMonkey ฉันพูดถึงพวกเขาผ่านการอ้างอิง? การเข้าถึงแต่ละองค์ประกอบช้า วัตถุไม่ได้ถูกจัดเรียงอย่างเป็นธรรมชาติและด้วยเหตุนี้จึงช้าอย่างไม่น่าเชื่อที่จะผลักดันลงในบัฟเฟอร์จุดสุดยอดถ้าคุณใช้พวกเขาเป็นอินสแตนซ์ Float32Array ซึ่งสร้างความสับสนให้อึออกจากเครื่องมือเพิ่มประสิทธิภาพของทั้ง V8 และ SpiderMonkey ฉันพูดถึงพวกเขาผ่านการอ้างอิง? การเข้าถึงแต่ละองค์ประกอบช้า วัตถุไม่ได้ถูกจัดเรียงอย่างเป็นธรรมชาติและด้วยเหตุนี้จึงช้าอย่างไม่น่าเชื่อที่จะผลักดันลงในบัฟเฟอร์จุดสุดยอดถ้าคุณใช้พวกเขาเป็นอินสแตนซ์ Float32Array ซึ่งสร้างความสับสนให้อึออกจากเครื่องมือเพิ่มประสิทธิภาพของทั้ง V8 และ SpiderMonkey ฉันพูดถึงพวกเขาผ่านการอ้างอิง?
f) ไม่มีการรวมหรือต้องการฟังก์ชันในตัว อย่างจริงจังยัง มีห้องสมุดของบุคคลที่สามอยู่ แต่เกือบทั้งหมดมีข้อผิดพลาดบางอย่างไม่อย่างน้อยก็เป็นปัญหาการแคชที่ทำให้เกิดความสับสนใน Chrome อย่างน้อยทำให้การพัฒนาจริงเกิดความเจ็บปวดในก้น
g) การพิมพ์แบบไดนามิก ใช่ฉันยินดีที่จะเริ่มการโต้แย้ง คุณเริ่มสังเกตเห็นมันเป็นวินาทีที่คุณหยุดเขียนเว็บแอพหรือหน้าเว็บเล็ก ๆ น้อย ๆ และเริ่มเขียนแอพขนาดใหญ่ที่คุณมีข้อมูลที่ยังคงอยู่นานกว่าการคลิกเมาส์เพียงครั้งเดียวหรือรอบคำขอ / ตอบสนอง: เพิ่มวัตถุผิดประเภท อาร์เรย์ที่จะดำเนินการในภายหลังและได้รับความผิดพลาดในภายหลังจากวิธีที่หายไปหรือสมาชิกในรหัสที่แตกต่างกันอย่างสิ้นเชิงกว่าที่ผิดพลาดจริง ช่วงเวลาแห่งความสนุก. ใช่จาวาทำให้การพิมพ์คงที่ดูเหมือนชั่วร้าย ไม่จาวา / C # / C ++ ไม่ใช่วิธีเดียวในการพิมพ์แบบสแตติก การอนุมานประเภทการผูกอินเทอร์เฟซโดยนัย ฯลฯ ให้ประโยชน์ทั้งหมด "ง่ายต่อการจัดการและไม่กดแป้นจำนวนมาก" ของการพิมพ์แบบไดนามิกโดยไม่มีข้อบกพร่องทั้งหมด ภาษาเว็บที่ได้รับความนิยมอันดับสองคือ ActionScript 3 - จะถูกพิมพ์แบบสแตติกในความเป็นจริงแม้จะเป็นอย่างอื่นกับ JS / ECMAScript นอกจากนี้ฉันได้รับความขัดข้องจากแอพ Python บนเดสก์ท็อป Fedora ของฉันมากกว่าที่ฉันทำจากแอพ C / C ++ (อันที่จริงแล้วไม่มีแอพ C / C ++ บนเดสก์ท็อปของฉันล่มตอนนี้ที่ฉันคิดถึงมัน) ไม่มีข้อยกเว้นสำหรับสมาชิก == ง่ายต่อการพัฒนาและดูแลรักษาแอพใช่ไหม?
h) ความเร็ว ใช่มีความพยายามอันยิ่งใหญ่จำนวนมากจากนักพัฒนาที่มีปัญหาเรื่องภาษาทำให้ JS เกือบครึ่งเร็วเท่าคอมไพเลอร์ C เกรดต่ำที่วิทยาลัยจูเนียร์คนเดียวสามารถเขียนได้ในไม่กี่ครั้ง เดือน และ LuaJIT อยู่ในเรือลำเดียวกันกับ JS ในแง่ของข้อ จำกัด ทางภาษาพื้นฐาน แต่สามารถทำได้ดีกว่าการใช้ JavaScript ทุกครั้ง ผู้ที่ไม่เข้าใจว่าการเพิ่มประสิทธิภาพ JS ทั้งหมดใน V8 หรือเช่นนั้นทำอะไรชอบที่จะอ้างสิทธิ์ JS สามารถทำสิ่งที่น่าอัศจรรย์ได้อย่างรวดเร็ว แต่ความจริงก็คือการเพิ่มประสิทธิภาพทั้งหมดนั้นเป็นเพียงแค่ "พยายามอย่างหนักมากในการวิเคราะห์รหัสเพื่อหาประเภทของตัวแปรแล้วรวบรวมมันเหมือนแบบสเตชั่นแบบหน่วงเล็กน้อย ผู้แปลภาษาจะทำเช่นนั้น " โอ้และมีการติดตามอยู่ แต่จากนั้นการติดตามก็ยังทำงานกับภาษาที่พิมพ์แบบคงที่ (และทำงานได้ดีขึ้นเนื่องจากไม่จำเป็นต้องมีการ์ดรักษาความปลอดภัยชนิดในรหัสเครื่องที่สร้างขึ้น) ไม่ใช่หนึ่งเดียวของการเพิ่มประสิทธิภาพ whizbang ที่ถูกคิดค้นโดยหรือสำหรับ JS ในความเป็นจริง; ส่วนใหญ่นำมาจากการวิจัย JVMs (Java เป็นความชั่วร้าย!) หรือภาษา OOP คลาสสิก (ต้นแบบนั้นยอดเยี่ยมมาก!)
i) ไม่มี IntelliSense ที่เป็นไปได้ ต้องการดูว่ามีวิธีใดบ้างในตัวแปรนั้นที่คุณมีอยู่ในบรรทัด 187 of foo.js ในโปรแกรมแก้ไขข้อความ เลวร้ายเกินไป. ไปตามรหัสจนกว่าคุณจะรู้ว่ามันถูกกำหนดค่าเริ่มต้นจากนั้นไปติดตามรหัสเพื่อค้นหาสิ่งที่ต้นแบบมีอยู่ และหวังว่าจะไม่มีการเปลี่ยนรหัสต้นแบบด้านหลังของคุณแบบไดนามิก ในความเป็นจริงเพียงแค่เรียกใช้ในเบราว์เซอร์และตั้งจุดพักเนื่องจากการหาสิ่งที่มีประโยชน์เกี่ยวกับค่าวิธีอื่น ๆ นั้นเป็นไปไม่ได้สำหรับ codebase ใด ๆ ที่ใหญ่กว่าเว็บไซต์ toy_web_app.html ที่ apologists JavaScript ใช้เพื่อยกย่องความสะดวกสบาย บางบรรณาธิการรหัสลองมันยากที่จะทำดีกว่าและเกือบจะประสบความสำเร็จครับ sorta สำหรับกรณีที่เรียบง่ายจริงๆบางครั้งเมื่อ
j) ไม่มีข้อได้เปรียบ JavaScript ไม่ได้พิเศษแม้แต่เมื่อเทียบกับภาษาที่พิมพ์แบบไดนามิกอื่น ๆ มันไม่สามารถทำสิ่งที่น่าสนใจได้ทั้งหมดที่ไม่สามารถทำได้โดย Lua, Python, Ruby และอื่น ๆ การใช้งาน JS ไม่เร็วกว่า LuaJIT หรือ PyPy หรือการใช้ JIT-ing ขั้นสูงอื่น ๆ ของไดนามิกอื่น ๆ ภาษา JS ไม่มีด้านบวกเมื่อเปรียบเทียบกับภาษาอื่น ๆ ที่มีโดยทั่วไป โอ้ยกเว้นว่ามันจะทำงานในเว็บเบราว์เซอร์ที่ไม่มีปลั๊กอิน ซึ่งเป็นเหตุผลเดียวในโลกที่ว่าทำไมมันถึงได้รับความนิยม ในความเป็นจริงมันเป็นเหตุผลเดียวที่มันเหตุการณ์อยู่. ถ้าใครสักคนเมื่อ 10 ปีที่แล้วเพิ่งคิดว่า "เฮ้เราทิ้งภาษาที่ได้รับการออกแบบและมีชื่อเสียงมาไว้ในเบราว์เซอร์ของเราแล้วพาคนอื่นทำแบบเดียวกันแทนที่จะทำให้ทุกคนใช้แฮ็คกี้ตัวเล็ก ๆ วันนี้ "เว็บจะดูต่างออกไป (ดีกว่า)" ลองจินตนาการถึงอนาคตถ้า Chrome ปล่อย Python ลงใน Chrome เป็นภาษาที่รองรับ หรือลองจินตนาการถึงสิ่งนี้: Google หยด C / C ++ ลงใน Chrome เป็นภาษาที่รองรับ (http://code.google.com/p/nativeclient/)