โปรแกรมเมอร์ JavaScript ทุกคนควรรู้อะไร [ปิด]


368

มีชุดของสิ่งที่โปรแกรมเมอร์ JavaScript ทุกคนควรรู้ว่าสามารถพูดว่า "ฉันรู้จัก JavaScript" หรือไม่?

คำตอบ:


590

ไม่ใช่ jQuery ไม่ใช่ YUI ไม่ (ฯลฯ )

กรอบงานอาจมีประโยชน์ แต่มักจะซ่อนรายละเอียดที่น่าเกลียดในบางครั้งว่า JavaScript และ DOM ใช้งานได้จริงจากคุณอย่างไร หากเป้าหมายของคุณคือสามารถพูดว่า "ฉันรู้จาวาสคริปต์" ดังนั้นการลงทุนเวลามากในกรอบนั้นตรงกันข้ามกับที่

ต่อไปนี้เป็นคุณสมบัติภาษา JavaScript ที่คุณควรรู้ว่าควรทำอะไรและไม่ได้รับความสนใจ

  • นั่นobject.propและobject['prop']เป็นสิ่งเดียวกัน (เพื่อให้คุณสามารถหยุดใช้evalขอบคุณ); คุณสมบัติของวัตถุนั้นจะเป็นสตริงเสมอ (แม้กระทั่งสำหรับอาร์เรย์) สิ่งที่for... inมีไว้สำหรับ (และสิ่งที่ไม่ )

  • ทรัพย์สินดมกลิ่น; undefinedมันคืออะไร(และทำไมมันมีกลิ่น ); เหตุใดผู้ดำเนินการที่ดูเหมือนไม่ค่อยรู้จักinจึงมีประโยชน์และแตกต่างจากtypeof/ undefinedเช็ค hasOwnProperty; deleteวัตถุประสงค์ของ

  • ว่าNumberประเภทข้อมูลมันลอย; ความยากลำบากในการใช้ภาษาที่ลอยตัว - ภาษา; หลีกเลี่ยงparseIntกับดักแปด

  • การกำหนดขอบเขตฟังก์ชันแบบซ้อน ความจำเป็นในการใช้งานvarในขอบเขตที่คุณต้องการหลีกเลี่ยงการกลมกลืนโดยไม่ตั้งใจ วิธีใช้ขอบเขตสำหรับการปิด ปัญหาการปิดห่วง

  • ตัวแปรและwindowคุณสมบัติทั่วโลกชนกันอย่างไร; ตัวแปรทั่วโลกและองค์ประกอบเอกสารไม่ควรชน แต่ทำใน IE; ความจำเป็นในการใช้งานvarในขอบเขตทั่วโลกเช่นกันเพื่อหลีกเลี่ยงปัญหานี้

  • วิธีfunctionงบทำหน้าที่ในการ ' ยก ' คำนิยามก่อนรหัสก่อนหน้านั้น ความแตกต่างระหว่างคำสั่งฟังก์ชั่นและการแสดงออกฟังก์ชั่น; ทำไมชื่อฟังก์ชั่นการแสดงออกไม่ควรใช้

  • ฟังก์ชั่นคอนสตรัคเตอร์prototypeคุณสมบัติและnewโอเปอเรเตอร์ทำงานอย่างไร วิธีการใช้ประโยชน์จากสิ่งนี้เพื่อสร้างระบบคลาส / คลาสย่อย / อินสแตนซ์ปกติที่คุณต้องการ เมื่อคุณอาจต้องการใช้วัตถุที่มีการปิดแทนการสร้างต้นแบบ (เนื้อหาการสอน JS ส่วนใหญ่แย่มาก ๆ ในเรื่องนี้ฉันต้องใช้เวลาหลายปีกว่าจะเข้าใจได้ในหัวของฉัน)

  • วิธีthisจะถูกกำหนดเมื่อทวงถามเวลาไม่ผูกพัน; วิธีการส่งผ่านวิธีการไม่ทำงานอย่างที่คุณคาดหวังจากภาษาอื่น ๆ ; วิธีปิดหรือFunction#bindอาจใช้เพื่อแก้ไข

  • ECMAScript อื่น ๆ ฉบับที่ห้าคุณสมบัติเช่นindexOf, forEachและการทำงานเขียนโปรแกรมวิธีการในArray ; วิธีแก้ไขเบราว์เซอร์รุ่นเก่าเพื่อให้แน่ใจว่าคุณสามารถใช้งานได้ ใช้พวกเขาด้วยการแสดงออกฟังก์ชั่นที่ไม่ระบุชื่อแบบอินไลน์เพื่อรับรหัสขนาดกะทัดรัดอ่านได้

  • การไหลของการควบคุมระหว่างเบราว์เซอร์และรหัสผู้ใช้; การประมวลผลแบบซิงโครนัสและแบบอะซิงโครนัส เหตุการณ์ที่เกิดขึ้นภายในการไหลของการควบคุม (เช่นโฟกัส) กับเหตุการณ์และหมดเวลาที่เกิดขึ้นเมื่อการควบคุมกลับมา; วิธีการเรียกบิวอินบิวอินแบบซิงโครนัสว่าalertสามารถทำให้เกิดการเข้าสู่ระบบอีกครั้งได้อย่างไร

  • การเขียนสคริปต์ข้ามหน้าต่างมีผลต่อinstanceofอย่างไร การเขียนสคริปต์ข้ามหน้าต่างมีผลต่อโฟลว์การควบคุมข้ามเอกสารต่างกันอย่างไร วิธีการที่postMessageหวังว่าจะแก้ไขปัญหานี้

ดูคำตอบนี้เกี่ยวกับสองรายการสุดท้าย

ที่สำคัญที่สุดคุณควรดู JavaScript อย่างยิ่งโดยยอมรับว่าเป็นเหตุผลทางประวัติศาสตร์ว่าเป็นภาษาที่ไม่สมบูรณ์ (ยิ่งกว่าภาษาส่วนใหญ่) และหลีกเลี่ยงการแก้ไขปัญหาที่เลวร้ายที่สุด งานของ Crockford ในหน้านี้เป็นสิ่งที่ควรค่าแก่การอ่านแน่นอน (แม้ว่าฉันจะไม่เห็นด้วย 100% กับเขาซึ่งเป็น "ส่วนที่ดี")


80
Ahhhh ในที่สุดคำตอบที่รอบคอบและละเอียดรอบคอบ ถ้าฉันทำได้ +10 ฉันจะ การรู้กรอบงานไม่ได้หมายความว่าคุณสามารถตั้งโปรแกรม JavaScript ได้อย่างมีประสิทธิภาพ
Tim Down

6
ขอบคุณมากสำหรับคำตอบที่คิดดี ฉันต้องการเพิ่มว่าการใช้กรอบงานสามารถเป็นประโยชน์จริง ๆ ถ้าคุณรู้ว่ามันทำอะไร คุณควรเรียนรู้ที่จะทำสิ่งเหล่านั้นด้วยตัวเองก่อนที่จะหันไปใช้กรอบ
Javier Parra

4
@Daniel: อันที่จริงไม่เป็นเช่นthisนั้นผูกพันวิธีใดที่คุณเข้าถึง ลองมันvar o= {b: function(){alert(this===o);}};แล้ว->o['b'](); trueและถ้าคุณต้องการจริงๆนอกลู่นอกทาง(o['b'])()-> trueแต่(c= o['b'])()-> falseและใน Mozilla เท่านั้น->(true? o['b'] : null)() trueW, T, และแน่นอน, F.
bobince

7
ช่างเป็นหม้อ! ไม่ใช่ว่าการรู้ว่าเบราว์เซอร์ที่แตกต่างกันทั้งหมดทำให้คุณเป็น coder JS ที่ดีขึ้น บางทีความน่าเชื่อถือบนถนนในหมู่เพื่อน ๆ ของคุณ ... Abstractions ทำให้ชีวิตง่ายขึ้นและเป็นส่วนสำคัญของ JS ดังนั้นฉันจะบอกว่าการรู้กรอบทำให้คุณเป็น coder JS ที่ดีกว่าคนที่ไม่ได้และต้องการทำสิ่งต่าง ๆ ในระยะยาว
Vince Panuccio

19
คุณ Sir Psycho: โปรดทราบว่าไม่มีคำตอบใดที่พูดถึง DOM ซึ่งเป็นสิ่งที่ห้องสมุดขนาดใหญ่อยู่ที่นั่นเพื่อช่วยเหลือคุณ กรอบไม่สามารถปกป้องคุณจากสิ่งที่กล่าวถึงที่นี่ สิ่งนี้มีความสำคัญสำหรับทุกคนที่ทำสคริปต์เบราว์เซอร์โดยใช้เฟรมเวิร์กหรือไม่
Tim Down

248

ว่ามันสามารถปิดการใช้งาน


12
+1, ฉันรู้สึกเบื่อหน่ายกับหน้าเว็บที่ไม่สนใจแม้แต่เรื่องพื้นฐานของความเสื่อมที่สง่างามเพราะ "มันยากมากและทุกคนเปิดใช้งานจาวาสคริปต์แล้ว"
wasatz

27
+1 หน้าเว็บที่ใช้งานไม่ได้หากไม่มี JavaScript เป็นหน้าที่จะบอบบางแม้เปิดใช้งาน JS
bobince

9
@iconiK ฉันจะไปบอกลูกค้าภาครัฐของฉันทุกคนที่ปิดการใช้งาน JavaScript ทั่วโลกด้วยเหตุผลด้านความปลอดภัยว่าพวกเขาเป็นคนผิด
graphicdivine

16
-1 นี่ไม่ใช่หัวข้อและไม่มีอะไรเกี่ยวข้องกับการรู้เกี่ยวกับจาวาสคริปต์เป็นภาษา เป็นเรื่องดีที่ควรพิจารณาเมื่อออกแบบเว็บแอป แต่ก็ยังไม่ใช่คำตอบที่อยู่ในกระทู้นี้
TM

24
@TM ไม่สำคัญจริงๆสำหรับการพิจารณา สิ่งนี้ควรอยู่ในระดับแนวหน้าของความคิดของคุณในขณะที่คุณทดสอบค่าก่อนที่จะแทรกลงในฐานข้อมูลหรือมีวิธีเดียวที่จะเข้าสู่เว็บไซต์ของคุณผ่านทางจาวาสคริปต์ที่แปลกใหม่ การพูดที่ .... ฉันคิดว่าฉันต้องไปตรวจสอบบางอย่าง
Elizabeth Buckwalter

75

ทำความเข้าใจกับสิ่งที่เขียนในJavascriptของ Crockford : ส่วนที่ดีเป็นข้อสันนิษฐานที่ดีว่าบุคคลนั้นเป็นโปรแกรมเมอร์ JS ที่เหมาะสม

คุณสามารถรู้วิธีการใช้ห้องสมุดที่ดีเช่น JQuery และยังไม่รู้จักกับส่วนที่ซ่อนของ Javascript

หมายเหตุอีกประการคือเครื่องมือดีบั๊กในเบราว์เซอร์ต่างๆ โปรแกรมเมอร์ JS ควรรู้วิธีการแก้ปัญหารหัสของเขาในเบราว์เซอร์ที่แตกต่างกัน

Oh! และการรู้ว่า JSLint จะทำร้ายความรู้สึกของคุณโดยสิ้นเชิง !!


+1 ลืมเกี่ยวกับหนังสือเล่มนั้นคำแนะนำที่ดีเยี่ยม
เดวิด

8
นอกจากนี้ยังมีวิดีโอ Crockford จำนวนมากที่ให้คำแนะนำและชาญฉลาดที่developer.yahoo.com/yui/theater - และฉันคิดว่าฉันไม่จำเป็นต้องพูดถึงcrockfordfacts.com :-)
ndim

+1 - JSLint เป็นสิ่งที่ยอดเยี่ยมเมื่อคุณลองพัฒนา JS สำหรับเฟรมเวิร์กที่ไม่มีการสนับสนุนการดีบักแบบฝังศูนย์ ( กระแอม Siebel, กระแอม PDF)
J. Polfer

49

หากคุณต้องการที่จะเป็นนินจา JavaScript จริงคุณควรจะรู้คำตอบของคำถามในทุกPerfection ฆ่า JavaScript แบบทดสอบ

ตัวอย่างของการกระตุ้นความอยากอาหารของคุณ:

(function f(f){ 
  return typeof f(); 
})(function(){ return 1; });

นิพจน์นี้ส่งคืนอะไร

  • "จำนวน"
  • "ไม่ได้กำหนด"
  • “ฟังก์ชั่น”
  • ความผิดพลาด

10
ดูคำตอบของฉัน: codingspot.com/2010/02/…
CMS

@CMS ดีมาก! คุณได้รับสิ่งที่ถูกต้องเป็นครั้งแรกหรือไม่รวมถึงการวิจัยบางอย่าง?
Skilldrick

7
Skilldrick: ฉันคิดว่าฉันได้รับพวกเขาทั้งหมดในครั้งแรกฉันเป็นผู้อ่านมาตรฐาน ECMA-262 บ่อยครั้ง (ฉันรู้ว่าฉันเป็นคนที่คลั่งไคล้ :-)
CMS

46

คุณไม่รู้จักจาวาสคริปต์ถ้าคุณไม่รู้:

  1. ปิด
  2. การสืบทอดตามต้นแบบ
  3. รูปแบบโมดูล
  4. W3C-DOM
  5. เหตุการณ์ทำงานอย่างไร

ฉันชอบคำตอบนี้จริงๆ มันช่วยให้คุณมองเห็นจุดที่มืดในความรู้ของคุณ เหตุการณ์เป็นสิ่งเดียวที่ยังคลุมเครือเล็กน้อยสำหรับฉันในรายการตรวจสอบนี้ (หากรูปแบบของโมดูลหมายถึง "อย่าปิดกั้นเนมสเปซส่วนกลาง" และรวมถึงขอบเขตและโอเปอเรเตอร์ var)
silviot

11
You don't know JavaScript if you don't know The W3C-DOMฉันจะยืนยันว่า สองสิ่งนั้นแตกต่างกัน
gblazex

37

.. นั่นคือจาวาสคริปต์ไม่ใช่จาวา :)

หลาย ๆ คนที่เริ่มต้นด้วยการพัฒนาเว็บไซต์บอกกับฉันว่าจาวาสคริปต์เป็นเพียง java อย่างง่าย!


+1 ประเด็นนี้ค่อนข้างพื้นฐาน!
amelvin

71
“ JavaScript สำหรับ Java คือพรมรถยนต์”
Josh Lee

1
Javascript นั้นเกี่ยวกับคล้ายกับ Java ในขณะที่ C # คล้ายกับ C. แน่นอนว่ามีไวยากรณ์ที่มีลักษณะคล้ายกัน แต่วิธีที่แตกต่างกัน
Earlz

4
เว้นแต่พวกเขาใช้ Google Web Toolkit
Afriza N. Arief

ที่น่าสนใจคือ Microsoft ได้สร้างฟังก์ชั่นวันที่ที่สอดคล้องกับ Y2k ใน JScript สำหรับ IE3 บน java.util.Date
Bayard Randel

27
  1. ทำความคุ้นเคยกับห้องสมุด Javascript (Jquery, Prototype, etc) อย่างน้อยหนึ่งไลบรารี

  2. เรียนรู้วิธีใช้เครื่องมือแก้ไขข้อบกพร่องของเบราว์เซอร์หลัก (MSIE 7-8, Firefox, Chrome, Safari)

  3. อ่านเกี่ยวกับอุตสาหกรรม: เว็บไซต์ของ Douglas Crockford เป็นขุมทรัพย์ในขณะที่ Ajaxian.com เป็นบล็อกที่ดีในการติดตามแนวคิดใหม่ที่น่าสนใจและแปลกใหม่สำหรับ Javascript มีทรัพยากรอื่น ๆ อีกจำนวนมาก แต่เป็นทรัพยากรที่ช่วยฉันได้มากที่สุด


อย่างจริงจังทำไมลงคะแนนเสียง?
เดวิด

+1 การลงคะแนนทางยุทธวิธีมากเกินไปผู้คนอย่างจริงจังควรกำจัดคำตอบที่ดีไม่เพียง แต่พยายามกำจัดคำตอบของพวกเขาไปด้านบน
amelvin

1
@Murali VP ฉันทำสมมติฐานสำหรับ "รู้จัก" Javascript ในบริบทของเบราว์เซอร์ หลังจาก Hello World ที่เทียบเท่าคุณจะต้องเข้าใจข้อผิดพลาดทางตรรกะและรันไทม์ของคุณซึ่งอาจแตกต่างกันไปตามล่าม ฉันจะไม่เรียกร้องให้รู้ภาษาใด ๆ หากฉันไม่ทราบวิธีการแก้ปัญหา สำหรับข้อกำหนดของกรอบงานจาวาสคริปต์นั้นเป็นเหมือนต้นซีซึ่งความแตกต่างของการใช้งานที่ลึกซึ้งจะก่อวินาศกรรมที่ไม่ระมัดระวัง jQuery & prototypejs คัดค้านความแตกต่างเหล่านี้และทำให้ Javascript เป็นเครื่องมือที่เชื่อถือได้ในขณะที่เพิ่มการเรียก API เพิ่มเติมเพื่อเพิ่มประสิทธิภาพ (ต่อ)
เดวิด

@Murali VP เพื่อความยุติธรรม Javascript มาไกลตั้งแต่ฉันเริ่มใช้ใน 90's และด้วยข้อยกเว้นของ Microsoft ล่าม Javascript อื่น ๆ ได้ทำงานที่น่าประทับใจเพื่อปฏิบัติตามข้อกำหนดและเล่นอย่างยุติธรรม
เดวิด

@ David ขอบคุณสำหรับคำอธิบายที่ดี มีแนวโน้มที่จะเห็นด้วยกับคุณ
Murali VP

24

จาวาสคริวัตถุและฟังก์ชั่นเป็นพลเมืองชั้นแรก , การเรียกกลับไม่ได้ที่จะลืมเกี่ยวกับเหตุการณ์ที่เกิดขึ้นแล้วJQuery


20
อ่า jQuery, เฟรมเวิร์กของ JS ที่มีเหงื่อออกมาก!
Murali VP

24

Javascript นั้นไม่ใช่สิ่งที่สามารถเรียนรู้ได้ในหนึ่งชั่วโมง!


4
แต่สิ่งนี้ดูเหมือนจะเป็นความเชื่อที่โด่งดัง
Livingston Samuel

23

ตัวแปรเป็นโกลบอลยกเว้นว่าได้รับการประกาศให้เป็นโลคอล !!

ไม่ดี (DoSomething () เรียกว่า 10 ครั้งเท่านั้น):

function CountToTen()
{
  for(i=0; i< 10; i++)
  {
    DoSomething(i);
  }
}

function countToFive()
{
  for(i=0; i<5; i++)
  {
    CountToTen();
  }
}

CountToFive();

ดี (DoSomething () เรียกว่า 50 ครั้งตามที่ต้องการ):

function CountToTen()
{
  var i;
  for(i=0; i< 10; i++)
  {
    DoSomething(i);
  }
}

function countToFive()
{
  var i;
  for(i=0; i<5; i++)
  {
    CountToTen();
  }
}

CountToFive();

2
ฉันไม่เคยพิจารณาเรื่องนี้เลย จุดที่ดีมาก
โอลีฟ

6
ฉันลองและเป็นนิสัยfor (var i=0;ในทุกลูปของฉัน
ghoppe

2
Crockford ชอบวางvarที่ด้านบนของฟังก์ชั่นเพราะมันไม่ได้หลอกลวงคุณเกี่ยวกับขนาดของขอบเขตของตัวแปร js2-modeจะบ่นถ้าคุณvar iแยกเป็นสองforลูปในฟังก์ชั่นเดียวกันเพราะมันบอกว่าคุณคิดว่าคุณมีตัวแปรสองตัวแยกกันและคุณไม่มี อย่างไรก็ตามฉันพยายามที่จะไม่varแยกจากสิ่งที่ฉันเริ่มต้นพวกเขา
Kragen Javier Sitaker

ฉันไม่สนใจว่าจะไม่ได้กำหนดขอบเขต ฉันทนไม่ได้กับการประกาศตัวแปร 20 บรรทัดก่อนที่มันจะถูกใช้
Juan Mendes

20

ทำอย่างไร ใช้ชิ้นส่วนที่ดีและวิธีการหลีกเลี่ยงส่วนอันยิ่งใหญ่


+1 หนังสือที่ดีที่สุดในการอ่านบน JavaScript และหนังสือของฟลานาแกนอีกด้วย
Andreas Grech

8

สำหรับการรู้ว่า Javascript นั้นเดิมเรียกว่าLiveScriptและคำนำหน้า 'Java' ได้ถูกแนบเพื่อวัตถุประสงค์ทางการตลาดไม่ใช่เพราะ Java และ Javascript นั้นเกี่ยวข้องกัน (ซึ่งไม่เกี่ยวข้อง)

โอ้และเป็นเจ้าของJavascript: The Definitive Guideของ David Flanagan ทุกรุ่น(ข้อมูลนี้อยู่ในหน้า 2)

... และสำหรับการซาบซึ้งผู้ที่เคยมีมาก่อนในการพยายามทำให้งงงวย document.all ของ Internet Explorer 4 [] และ document.layers ของ Netscape Navigator 4 [] ก่อนที่จะชอบ Jquery เอาความเจ็บปวด

แก้ไข:

@Kinopiko ชี้ให้เห็นว่า JavaScript ถูกเรียกว่าโครงการ Mocha แต่เดิม ( บางแหล่งยังคิดว่ามันถูกเรียกว่า project LiveWire) แต่โดยทั่วไปก็ยอมรับว่าภาษา (เขียนโดย Brendan Eich) ถูกกำหนดให้เปิดตัวเป็น LiveScript ก่อนที่จะนำหน้า Java มาใช้ เปิดตัวในต้นปี 1996


+1 สำหรับการหยิบบิทบิตจาก Douglas Crockford!
gath

1
ฉันคิดว่า JavaScript ชื่อเดิมว่า Mocha?

1
@Kinopiko ตาม 'Javascript: The Definitive Guide' หนังสือ 3ed (มิถุนายน 1998) โดย David Flanaghan มันถูกเรียกว่า LiveScript
amelvin

@gath วันที่คุณเรียนรู้บางสิ่งบางอย่างเป็นวันที่ดี!
amelvin

1
@amelvin ทุกวันเป็นวันเรียน
พันเอก Sponsz

8

เราควรทราบเกี่ยวกับสิ่งต่อไปนี้เพื่อพูดว่า "ฉันรู้จักจาวาสคริปต์":

  1. JavaScript ดี แต่DOM เป็นจุดปวด
  2. ปัญหาเบราว์เซอร์ข้ามสามารถทำให้คุณเป็นบ้า
  3. ยกเว้นว่ามีการทดสอบโค้ดในเบราว์เซอร์ที่ดีอย่างน้อย 4 ชนิดที่แตกต่างกันคุณจะไม่สามารถบอกได้ว่ามันปราศจากบั๊ก
  4. ปิด .............. ต้องรู้
  5. ต้นแบบของมัน........... เป็นคนดีสนุกที่ได้เรียนรู้สิ่งนี้
  6. คำหลักดีบักเกอร์ ..... ช่วยในภาวะวิกฤต

รายการที่ดีผอมสวย ฉันหัวเราะที่เบราว์เซอร์ที่ดี "4" :) ผมคิดว่าจำนวน 7 ควรจะเป็นความเกลียดชังที่มีสุขภาพดีสำหรับเบราว์เซอร์ IE ภายใต้รุ่นที่ 8
ยัม

@Shamam อะไรทำให้คุณคิดว่าเราไม่ควรมีความเกลียดชังที่ดีต่อสุขภาพของ IE8? ฉันยังคงมีปัญหาใน IE8 ... ปัญหาที่มีเฉพาะใน IE8 ที่
Tracker1

@ Tracker1: จะมีปัญหาเสมอ และทุบตีเบราว์เซอร์ที่ฉันไม่ได้สัมผัสเอาล่ะนั่นจะค่อนข้างไม่ยุติธรรมเลย นั่นเป็นเหตุผลที่ฉันหัวเราะที่เบราว์เซอร์ที่ดี 4 รายการ: 'Firefox, Chrome, Safari และ Opera' เป็นสิ่งเดียวที่ฉันพัฒนาขึ้นมา ฉันหยุดการแฮ็กสำหรับ IE ฉันแค่ทำให้มันรันรหัส Fisher Price ราวกับว่าจะปิดการใช้งาน JavaScript
Shyam

7

JavaScript นั้นแตกต่างจากภาษาอื่นมากกว่าที่คุณคิด ดู Google Tech Talk ที่ยอดเยี่ยมนี้เพื่อรับความประทับใจ: http://www.youtube.com/watch?v=hQVTIJBZook


1
+1 นี่คือคำอธิบายที่ดีเกี่ยวกับวิธีหยุดการดูด JavaScript สิ่งเหล่านี้ควรรับชมในภายหลัง: yuiblog.com/crockford
ผู้พันเอก Sponsz

อีกหนึ่งการนำเสนอที่ดีจาก Crockfod ("ภาษาโปรแกรมจาวาสคริปต์" 4 ส่วน) video.yahoo.com/watch/111593/1710507
Alex K.

7

สิ่งที่จาวาสคริปต์ทุกคนควรรู้คืออะไร?

แล้วฉันจะปิดความพยายามของคุณได้ด้วย 2 คลิก ดังนั้นให้เลือกทางเลือกถ้าเป็นไปได้


คุณอาจถอนการติดตั้งเว็บเบราว์เซอร์ของคุณเช่นกัน มีคนน้อยมากที่ปิดการใช้งานจาวาสคริปต์ในวันนี้ ผู้ที่ไม่จำเป็นต้องท่องเว็บ ข้อยกเว้นเพียงอย่างเดียวคือโปรแกรมรวบรวมข้อมูลเว็บจำเป็นต้องเข้าถึงเนื้อหาสาธารณะของคุณและไม่สามารถใช้ JS ได้
Jean Vincent

ฉันสนใจที่จะจัดหาวิธีที่ไม่ใช่ JS เพื่อเข้าถึงสิ่งต่างๆ ฉันรู้จักคนที่เรียกดูด้วย JS ที่ปิดใช้งานหรือใช้โปรแกรมอ่านหน้าจอ พวกเขาไม่ได้เล่นที่ดีกับ JS เสมอไป ฉันเคยเห็นเว็บไซต์ที่มีหน้าเข้าสู่ระบบแบบง่ายส่งผ่าน ajax โดยไม่มีทางเลือกใด ๆ เลย ไม่มี JS ไม่มีการลงชื่อเข้าใช้ เว็บไซต์ไม่ได้ใช้ประโยชน์จาก JS มากเพียงแค่ส่งแบบฟอร์ม
Khainestar

ฉันเชื่อว่าผู้ใช้ที่ปิดการใช้งาน JS อย่างที่คุณบอกไว้เป็นเรื่องธรรมดามากในวันนี้แน่นอนน้อยกว่า 10 ปีที่แล้ว นี่คือเหตุผลที่ฉันไม่เข้าใจว่าทำไมเราควรออกแบบไซต์สองครั้งสำหรับผู้ที่ไม่ต้องการเยี่ยมชมไซต์ของคุณจริงๆ ดังนั้นในตัวอย่างของคุณพวกเขาไม่สามารถเข้าสู่ระบบดังนั้นอะไร อีกอย่างคือไม่มีทางที่คุณจะสามารถออกแบบเว็บไซต์ที่ทันสมัยโดยไม่มี JS ได้
Jean Vincent


6

คุณรู้จักจาวาสคริปต์หากคุณสามารถใช้ Array, Number, String, Date และ Object ได้อย่างมีประสิทธิภาพ บวกคะแนนสำหรับคณิตศาสตร์และ RegExp คุณควรจะสามารถเขียนฟังก์ชั่นและใช้ตัวแปร (ในขอบเขตที่ถูกต้องเช่น 'วิธีการ' ของวัตถุ)

ฉันเห็นความคิดเห็นบางอย่างเกี่ยวกับการรู้การปิดไวยากรณ์ฟังก์ชั่นฟุ่มเฟือย blabla สิ่งที่ค่อนข้างไม่เกี่ยวข้องกับคำถามนี้ เหมือนกับว่าคุณเป็นนักวิ่งถ้าคุณสามารถวิ่งได้ 100m ในเวลา 11 วินาที

ฉันบอกว่าอาจใช้เวลาสองสามสัปดาห์กว่าจะมีความเชี่ยวชาญในจาวาสคริปต์ หลังจากนั้นใช้เวลาหลายปีและหนังสือหลายสิบเล่มและหลายพันบรรทัดของการเขียนโปรแกรมเพื่อเป็นผู้เชี่ยวชาญนินจา ฯลฯ

แต่นั่นไม่ใช่คำถาม

โอ้และ DOM ไม่ได้เป็นส่วนหนึ่งของจาวาสคริปต์และไม่ใช่ jQuery ดังนั้นฉันคิดว่าทั้งสองคำถามนั้นไม่เกี่ยวข้องกันด้วย


1
จะมีการปิดไม่ว่าคุณจะสนใจหรือไม่ มันทรงพลัง แต่สามารถนำไปใช้ในทางที่ผิดได้ง่าย คุณไม่รู้ภาษาถ้าคุณไม่รู้วิธีการใช้งาน
gblazex

นอกเหนือจากการปิดอันตรายอาจทำให้เกิดการรั่วไหลของหน่วยความจำโดยเฉพาะอย่างยิ่งใน Internet Explorer 6 เพื่อนที่แท้จริงของเรา
Marcel Korpel


4

ต้องอ่านทั้งหมดข้างต้นก็ยังดีอย่างสมบูรณ์แบบในการเรียนรู้โดยใช้ Javascript กรอบเช่น jQuery ความจริงก็คือมันเป็นวิธีแรกที่คนจำนวนมากหยิบ JS ขึ้นมาตั้งแต่แรก ไม่มีความละอายในเรื่องนั้น


4

อาเรย์ lengthmethod ไม่นับรายการของ array แต่เป็นดัชนีสูงสุด แม้เมื่อรายการถูกตั้งค่าเป็นundefined

var a = [];
a.length;   // === 0
a[10];      // === undefined
a[10] = undefined;
a.length;   // === 11
a.pop();    // === undefined
a.length;   // === 10

พฤติกรรมนี้แทบจะไม่แตกต่างจากข้อบกพร่องในการออกแบบภาษา ..


3

jQuery จะเป็นคำแนะนำที่ดีที่สุดของฉัน ไม่เพียง แต่สำหรับรหัสเท่านั้นมันเป็นสำนวนสไตล์ความคิดที่อยู่เบื้องหลังมันมีค่าที่สุดสำหรับการลอกเลียนแบบ


2
+1 Jquery ปฏิวัติการใช้จาวาสคริปต์ของฉัน
amelvin

1
โครงร่างอาร์กิวเมนต์ที่ดี การขยายตัวจะทำให้เป็นคำตอบที่ยอดเยี่ยม
Donal Fellows

jQuery บังคับให้คุณเข้าสู่โหมดขั้นตอน ฉันค่อนข้างจะเขียน OO JS
Juan Mendes

ไม่มีอะไรมหัศจรรย์เกี่ยวกับการวางแนวของวัตถุ ฉันควรใช้เฟรมเวิร์กที่ออกแบบโดย John Resig และใช้งานโดยนักพัฒนาอื่น ๆ นับพันกว่าสิ่งใดที่คุณหรือฉันจะเขียนโดยไม่คำนึงถึงโหมด
duffymo

3

จาวาสคริปต์นั้นเป็นภาษาที่ใช้กันอย่างแพร่หลายที่สุดในโลก (อาจ)


8
ภาษาธรรมชาติที่ใช้กันอย่างแพร่หลายส่วนใหญ่คือภาษาจีนกลาง จะรู้ว่าทำให้คุณพูดภาษาจีนกลาง? จะรู้ข้อเท็จจริงที่ว่าแม้จะมีอะไรเกี่ยวข้องกับการเข้าใจภาษาของคุณ?
Zano

11
ภาษาที่มีการนำไปใช้อย่างกว้างขวางที่สุดในโลกคือรหัสพันธุกรรมของ DNA ที่ควบคุมการสังเคราะห์โปรตีนภายในเซลล์
Ernelli

ก่อนที่ภาษาจีนกลางและ DNA จะต้องใช้ภาษาแห่งความรักก่อนดังนั้นจึงชนะ BAM!
Christopher

3

การเรียนรู้ภาษาดีมากและการทำความเข้าใจนิสัยใจคอที่หลากหลายนั้นมาจากประสบการณ์ (ปี) ถ้าคุณต้องการเป็นโปรแกรมเมอร์ที่ดีกว่าฉันจะบอกว่าเข้าใจรูปแบบการออกแบบอย่างไรและเมื่อใดที่จะใช้พวกเขาและ / หรือแม้กระทั่งเมื่อคุณใช้งานพวกเขาโดยไม่ทราบ สถาปัตยกรรมทางเทคนิคและประสบการณ์การใช้งาน

การรู้ภาษา (JavaScript) หมายความว่าคุณสามารถเลือกกรอบงานใด ๆ และใช้ตามใจชอบ คุณจะต้องดำลงไปในซอร์สโค้ดอย่างหลีกเลี่ยงไม่ได้และถ้าคุณรู้ว่ามันคือกรอบไวยากรณ์หรือ 2 หรือ 3 คุณก็จะไม่ไปไกล ในการบอกว่าการเข้าไปในซอร์สโค้ดของเฟรมเวิร์กต่าง ๆ เป็นวิธีที่ดีที่สุดในการดูว่า JavaScript สามารถใช้งานได้อย่างไร ทำใจให้วุ่นวายโดยการใช้รหัสใน Firebug หรือ Web Inspector จากนั้นตรวจสอบเอกสาร JavaScript โดยเฉพาะเอกสาร Mozilla และ Webkit เพื่อทำความเข้าใจเพิ่มเติมเกี่ยวกับสิ่งที่คุณกำลังดู

การทำความเข้าใจความแตกต่างระหว่างการเขียนโปรแกรมเชิงวัตถุและฟังก์ชั่นการใช้งาน JavaScript นั้นเป็นการผสมผสานที่ลงตัวระหว่างทั้งสองและเวลาและวิธีการใช้ทั้งในการสร้างฐานข้อมูลนักฆ่าและแอพพลิเคชั่นที่ยอดเยี่ยม

เพียงแค่อ่านหนังสือบางเล่มโดยเฉพาะ "ส่วนที่ดี" ของ Crockford ซึ่งนำเสนอความคิดเห็นของเขาเกี่ยวกับสิ่งที่ดีใน JavaScript ในขณะที่การข้ามส่วนที่น่ากลัวของ JavaScript ส่วนใหญ่จะทำให้คุณรู้สึกผิด

การตรวจสอบโค้ดที่เขียนโดยคนอย่าง Thomas Fuchs ในทางกลับกันจะทำให้คุณเข้าใจถึงพลังของการเขียน JavaScript ที่น่าทึ่งและมีประสิทธิภาพมากขึ้น

การพยายามจดจำ gotchas หรือ WTF สองสามตัวจะไม่ช่วยอะไรมากคุณจะเลือกมันถ้าคุณเริ่มเขียนโค้ดและก้าวผ่านโค้ดไลบรารี่ / กรอบงานโดยเฉพาะความเห็นที่เป็นประโยชน์ คุณสมบัติ / ค่าและไม่ใช่เหตุผลอื่น ๆ และเมื่อใดจึงควรใช้ตัวถูกดำเนินการและตัวดำเนินการเฉพาะนี่คือทั้งหมดที่อยู่ในรหัสของคนที่ใช้เฟรมเวิร์ก เป็นอย่างไรดีกว่าที่จะเรียนรู้จากตัวอย่าง? : ^)


+1 สำหรับการไม่บูชา Crockford ฉันปฏิบัติต่อมุมมองของเขาเหมือนเป็นนักเทศน์ที่โบสถ์ ฉันเคารพสิ่งที่พวกเขาพูด แต่เอาทุกอย่างไปด้วยเม็ดเกลือ
Juan Mendes

2

ใน Javascript ประสิทธิภาพมีความสำคัญ

ไม่มีคอมไพเลอร์อัจฉริยะในการเพิ่มประสิทธิภาพโค้ดของคุณดังนั้นคุณควรระมัดระวังในขณะที่คุณเขียนโค้ดจาวาสคริปต์มากกว่าภาษาอย่าง C #, Java ...


1
ในความเป็นจริงคอมไพเลอร์เบราว์เซอร์นั้นดีในการปรับโค้ดของคุณให้ดี
Eduardo

1
Chrome ฉลาดมากในการเพิ่มประสิทธิภาพรหัสของคุณคำตอบนี้ไม่เป็นความจริงกับเครื่องมือ JS ใหม่ทั้งหมด
Juan Mendes

เบราว์เซอร์มือถือคืออะไร
caltuntas


0

สิ่งต่อไปนี้ก็มีความสำคัญเช่นกัน:

1) ตัวแปรยก 2) ขอบเขตขอบเขตและวัตถุการเปิดใช้งาน

และจากนั้นสิ่งเหล่านี้: :)

3) wtfjs.com

4) ทุกอย่างเป็นวัตถุ http://www.lifeinafolder.com/images/Js.jpg


6
3. ) เป็นที่ไม่ถูกต้อง ไม่ใช่ทุกสิ่งที่เป็นวัตถุ stackoverflow.com/questions/3907613/…
gblazex

0
  1. รู้ว่ามีชีวิตที่มีและไม่มี with()และที่จะวาดเส้น
  2. คุณสามารถสร้างข้อผิดพลาดที่กำหนดเองด้วยthrowคำสั่งเพื่อจงใจหยุดการทำงานของจาวาสคริปต์

-1

JavaScript ไม่รองรับการแยกคำหลักreturnและคำสั่ง return ด้วยอักขระขึ้นบรรทัดใหม่เช่นรหัสต่อไปนี้ (หรือลองที่หน้า jsFiddle ของฉัน )

function foo()
{
    return
    {
        bar: 'something'
    };
}

$(function()
{
    document.write(foo());
});

ฉันไม่เข้าใจว่าทำไม JavaScript ไม่สนับสนุนสไตล์นี้เนื่องจากง่ายต่อการอ่านซอร์สโค้ด JavaScript ที่ซับซ้อนมากเมื่อเปรียบเทียบกับสไตล์เริ่มต้นของ JavaScript

PS ฉันเขียน JavaScript เกือบ 6 ปี แต่ฉันเพิ่งพบข้อผิดพลาดนี้ด้วยตัวเองเมื่อฉันพยายามเรียกใช้ฟังก์ชันต่อไปนี้ มันจะส่งกลับไม่ได้กำหนดเสมอ เมื่อฉันใช้ดีบักเกอร์และเข้าสู่ฟังก์ชั่นนี้ทุกอย่างก็ใช้ได้ดี ฉันคิดว่ามันควรจะเป็นข้อบกพร่องในการเขียนโปรแกรมที่เลวร้ายที่สุดในชีวิตของฉัน

function JqGridInlineEditor_GenerateTool(cellvalue, options, rowObject, disableEdit, disableDelete)
{
    return 
        (!disableEdit ? '<a class="button edit" href="javascript: void(0);" onclick="JqGridInlineEditor_EditRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Edit.gif'), 'Click here to Edit or \nDouble-click row to edit.') : '') +
        (!disableDelete ? '<a class="button delete" href="javascript: void(0);" onclick="JqGridInlineEditor_DeleteRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Delete.png'), 'Click here to Delete or \nSelect row and then press Delete') : '') +
        (!disableEdit ? '<a class="button save" style="display:none" href="javascript: void(0);" onclick="JqGridInlineEditor_SaveRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Save.png'), 'Click here to Save or \nPress Enter') : '') +
        (!disableEdit ? '<a class="button cancel" style="display:none" href="javascript: void(0);" onclick="JqGridInlineEditor_RestoreRow(this, \'{0}\');return false;" title="{2}"><img src="{1}" alt="{2}" /></a>'.format(options.rowId, getUrl('~/Content/Icons/Cancel.png'), 'Click here to Cancel or \nPress Esc') : '');
}

3
ใน JavaScript อักขระบรรทัดใหม่มักจะทำหน้าที่เป็นตัวคั่นของข้อความ เฉพาะเมื่อเป็นไปไม่ได้ที่คำสั่งจะสิ้นสุดลง (เช่นvar foo = "bar" +) parser อ่าน
Marcel Korpel

jsFiddle อีกอัน jsfiddle.net/Soul_Master/BxrDJ
Soul_Master

2
@Marcel - นั่นไม่จริงอย่างแน่นอน; ตัวอย่างเช่นสองบรรทัดvar foo = 5และ-1;จะส่งผลให้ foo ถูกตั้งค่าเป็น 4 แม้ว่าแต่ละรายการจะเป็นข้อความสั่งที่ถูกต้องด้วยตนเอง
Ben Blank

4
นี่เป็นเพราะภาษาฉีดอัฒภาคโดยอัตโนมัติเพื่อแยกงบ นี่คือ gotcha ด้วยภาษา ข้อความสั่งคืนของคุณถูกแปลงเป็นสิ่งนี้: return; {key: value,} เพื่อหลีกเลี่ยงปัญหานี้คุณควรปรับใช้เซมิโคลอนในบรรทัดเดียวกันเช่น: return {key: value}; นอกจากนี้ทำตัวคุณเองและคว้าสำเนา Douglas Crockford: The Good Parts สิ่งนี้ถูกกล่าวถึงอย่างชัดเจนในหนังสือ
Rajat

@Ben - กรณีที่น่าสนใจขอบคุณที่ชี้ไปที่ ที่กล่าวว่าฉันขอแนะนำไม่ให้ใช้กรณีขอบเหล่านี้และเพียงวางทุกอย่างในหนึ่งบรรทัดที่ลงท้ายด้วยเครื่องหมายอัฒภาคและใส่รหัสของคุณในหลายบรรทัดเมื่อบรรทัดลงท้ายด้วยบางสิ่งบางอย่างคำสั่งหรือนิพจน์ไม่สามารถลงท้ายด้วย .
Marcel Korpel

-3

เนื่องจาก JS เป็นภาษาที่ใช้งานได้โปรแกรมเมอร์ JS ที่ดีต้องสามารถเขียน Y-combinator และอธิบายวิธีการทำงานของส่วนหัว


1
มีอะไรผิดปกติกับความสามารถในการเขียน Y-combinator และใช่จาวาสคริปต์เป็นภาษาที่ใช้งานได้ หากคุณต้องการบอกว่า "รู้จาวาสคริปต์" ความเข้าใจที่ดีของการเขียนโปรแกรมฟังก์ชั่นเป็นสิ่งจำเป็น
Raynos

C สามารถใช้เป็นภาษาทำงานได้เช่นกัน
kzh

ฉันเพิ่งอ่านเกี่ยวกับ Y combinator เมื่อเร็ว ๆ นี้เข้าใจวิธีการทำงานและในกรณีที่สามารถใช้ .. แต่ไม่เคยพบตัวอย่างที่ฉันไม่สามารถเขียนปัญหาที่ไม่จำเป็นต้อง Y combinator
หลีกเลี่ยง

-5

... เกี่ยวกับGoogle Web Toolkitซึ่งหมายความว่าโครงการจาวาสคริปต์ของคุณอาจได้รับการพัฒนาในลักษณะที่สะดวกกว่า


2
GWT ไม่ใช่ JavaScript จริงๆมันเป็นวิธีการเขียน JavaScript แบบชวา
Livingston ซามูเอล

... และโปรแกรมเมอร์ Javascipt ทุกคนควรรู้เกี่ยวกับมัน
Viktor Sehr

ว่าโปรเจ็กต์ javascript ของคุณอาจพัฒนาได้ในลักษณะที่เป็นกันเองมากกว่า
Viktor Sehr

6
ฉันคิดว่า Javascript ง่ายต่อการจัดการมากกว่า Java ส่วนตัว
timw4mail
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.