Câu trả lời:
Không phải jQuery. Không phải YUI. Không phải (v.v.)
Các khung có thể hữu ích, nhưng chúng thường ẩn các chi tiết đôi khi xấu về cách JavaScript và DOM thực sự hoạt động với bạn. Nếu mục đích của bạn là có thể nói là Tôi biết JavaScript, thì việc đầu tư nhiều thời gian vào một khung là trái ngược với điều đó.
Dưới đây là một số tính năng ngôn ngữ JavaScript mà bạn nên biết để tìm hiểu những gì nó đang làm và không bị phát hiện, nhưng điều này không rõ ràng ngay lập tức đối với nhiều người:
Đó object.prop
và object['prop']
là những điều tương tự (để bạn có thể xin vui lòng ngừng sử dụng eval
, nhờ); các thuộc tính đối tượng đó luôn là các chuỗi (ngay cả đối với các mảng); những gì for
... in
là cho (và những gì nó không ).
Đánh hơi tài sản; undefined
là gì (và tại sao nó có mùi ); tại sao toán tử dường như ít được biết đến in
lại có lợi và khác với typeof
/ undefined
kiểm tra; hasOwnProperty
; mục đích của delete
.
Rằng Number
datatype thực sự là một float; những khó khăn độc lập với ngôn ngữ của việc sử dụng phao; tránh parseInt
bẫy bát phân.
Chức năng lồng nhau phạm vi; sự cần thiết của việc sử dụng var
trong phạm vi bạn muốn tránh tình trạng toàn cầu; làm thế nào phạm vi có thể được sử dụng để đóng cửa; các vấn đề vòng lặp đóng cửa .
Làm thế nào các biến và window
tính chất toàn cầu va chạm; làm thế nào các biến toàn cầu và các yếu tố tài liệu không nên va chạm nhưng làm trong IE; sự cần thiết của việc sử dụng var
trong phạm vi toàn cầu để tránh điều này.
Cách function
câu lệnh hành động để ' nâng ' một định nghĩa trước khi mã trước nó; sự khác biệt giữa các câu lệnh hàm và biểu thức hàm; tại sao tên biểu thức hàm không nên được sử dụng .
Làm thế nào các hàm xây dựng, prototype
tài sản và new
toán tử thực sự làm việc; các phương thức khai thác điều này để tạo ra hệ thống lớp / lớp con / thể hiện bình thường mà bạn thực sự muốn; khi bạn có thể muốn sử dụng các đối tượng dựa trên đóng cửa thay vì tạo mẫu. (Hầu hết các tài liệu hướng dẫn về JS hoàn toàn khủng khiếp về điều này; tôi đã mất nhiều năm để đưa nó thẳng vào đầu mình.)
Làm thế nào this
được xác định tại thời điểm cuộc gọi, không bị ràng buộc; làm thế nào để truyền phương thức không hoạt động như bạn mong đợi từ các ngôn ngữ khác; làm thế nào đóng cửa hoặc Function#bind
có thể được sử dụng để có được xung quanh đó.
Các tính năng khác của ECMAScript Fifth Edition như indexOf
, forEach
và các phương phápArray
lập trình chức năng trên ; cách khắc phục các trình duyệt cũ hơn để đảm bảo bạn có thể sử dụng chúng; sử dụng chúng với các biểu thức hàm ẩn danh nội tuyến để có được mã nhỏ gọn, dễ đọc.
Luồng kiểm soát giữa trình duyệt và mã người dùng; thực hiện đồng bộ và không đồng bộ; các sự kiện kích hoạt bên trong luồng điều khiển (ví dụ: tiêu điểm) so với các sự kiện và thời gian chờ xảy ra khi điều khiển quay trở lại; làm thế nào để gọi một nội dung được cho là đồng bộ như thế alert
có thể gây ra sự tái nhập có khả năng gây thảm họa.
Làm thế nào kịch bản chéo cửa sổ ảnh hưởng instanceof
; kịch bản chéo cửa sổ ảnh hưởng đến luồng điều khiển trên các tài liệu khác nhau như thế nào; postMessage
Hy vọng sẽ khắc phục điều này như thế nào .
Xem câu trả lời này liên quan đến hai mục cuối cùng.
Trên hết, bạn nên xem JavaScript một cách nghiêm túc, thừa nhận rằng đó là vì lý do lịch sử là một ngôn ngữ không hoàn hảo (thậm chí nhiều hơn hầu hết các ngôn ngữ) và tránh những rắc rối tồi tệ nhất của nó. Tác phẩm của Crockford trên mặt trận này chắc chắn đáng để đọc (mặc dù tôi không đồng ý 100% với anh ấy về những phần của Good Good.
this
bị ràng buộc theo bất cứ cách nào bạn truy cập nó. Hãy thử : var o= {b: function(){alert(this===o);}};
, sau đó o['b']();
-> true
. Và nếu bạn muốn thực sự quái đản, (o['b'])()
-> true
, nhưng (c= o['b'])()
-> false
, và chỉ trong Mozilla, (true? o['b'] : null)()
-> true
. W, T, và thực sự, F.
Rằng nó có thể bị vô hiệu hóa.
Hiểu những thứ được viết trong Javascript của Crockford : Các bộ phận tốt là một giả định khá hay rằng một người là một lập trình viên đàng hoàng.
Bạn có thể biết khá nhiều về cách sử dụng một thư viện tốt như JQuery mà vẫn không biết các phần ẩn của Javascript.
Một lưu ý khác là công cụ gỡ lỗi trên các trình duyệt khác nhau. Một lập trình viên JS nên biết cách gỡ lỗi mã của mình trong các trình duyệt khác nhau.
Oh! Và biết rằng JSLint sẽ hoàn toàn làm tổn thương cảm xúc của bạn !!
Nếu bạn muốn trở thành một ninja JavaScript thực thụ, bạn nên biết câu trả lời cho mọi câu hỏi trong Perfection giết chết JavaScript Quiz .
Một ví dụ để kích thích sự thèm ăn của bạn:
(function f(f){
return typeof f();
})(function(){ return 1; });
Biểu hiện này trở lại là gì?
- "con số"
- "chưa xác định"
- "chức năng"
- lỗi
Bạn không biết JavaScript nếu bạn không biết:
You don't know JavaScript if you don't know The W3C-DOM
. Hai điều khác nhau.
.. đó là javascript không phải là java :)
Nhiều, nhiều người bắt đầu với việc phát triển trang web đã nói với tôi rằng javascript chỉ là java đơn giản!
Làm quen với ít nhất một thư viện Javascript (Jquery, Prototype, v.v.).
Tìm hiểu cách sử dụng các công cụ gỡ lỗi của các trình duyệt chính (MSIE 7-8, Firefox, Chrome, Safari)
Đọc về ngành công nghiệp: Trang web của Douglas Crockford là một kho báu trong khi Ajaxian.com là một blog tốt để cập nhật những ý tưởng mới, thú vị và kỳ lạ cho Javascript. Có một số tài nguyên khác nhưng đó là những tài nguyên giúp tôi nhiều nhất.
Javascript đó không phải là thứ có thể học được trong một giờ!
Các biến là toàn cầu trừ khi được tuyên bố là cục bộ !!
Xấu (DoS Something () chỉ được gọi 10 lần):
function CountToTen()
{
for(i=0; i< 10; i++)
{
DoSomething(i);
}
}
function countToFive()
{
for(i=0; i<5; i++)
{
CountToTen();
}
}
CountToFive();
Tốt (DoS Something () được gọi 50 lần như dự định):
function CountToTen()
{
var i;
for(i=0; i< 10; i++)
{
DoSomething(i);
}
}
function countToFive()
{
var i;
for(i=0; i<5; i++)
{
CountToTen();
}
}
CountToFive();
for (var i=0;
trong tất cả các vòng lặp của mình
var
trí hàng đầu của hàm, vì nó không đánh lừa bạn về kích thước của phạm vi của biến. js2-mode
sẽ phàn nàn nếu bạn var i
ở hai for
vòng riêng biệt trong cùng một hàm, vì nó gợi ý bạn nghĩ rằng bạn có hai biến riêng biệt và bạn thì không. Tuy nhiên, tôi cố gắng không bao giờ var
tách rời khỏi nơi tôi khởi tạo chúng.
Để biết rằng Javascript ban đầu được gọi là LiveScript và tiền tố 'Java' được đính kèm cho mục đích tiếp thị không phải vì Java và Javascript có liên quan với nhau (mà chúng không liên quan).
Ồ và vì đã sở hữu bất kỳ phiên bản 'Javascript: Hướng dẫn dứt khoát' nào của David Flanagan (thông tin này nằm ở trang 2).
... và để đánh giá cao những người đã đi trước khi cố gắng làm xáo trộn tài liệu của Internet Explorer 4.all [] và tài liệu của Netscape Navigator 4.layers [] trước khi Jquery xóa tan nỗi đau.
BIÊN TẬP:
Như @Kinopiko chỉ ra JavaScript ban đầu được gọi là dự án Mocha ( một số nguồn cũng cho rằng nó được gọi là dự án LiveWire) nhưng người ta thường chấp nhận rằng ngôn ngữ (được viết bởi Brendan Eich) được dự kiến sẽ được phát hành dưới dạng LiveScript trước khi tiền tố Java được thông qua phát hành vào đầu năm 1996.
Mọi người nên biết về những điều sau đây để nói "Tôi biết JavaScript":
JavaScript đó khác nhiều so với các ngôn ngữ khác so với bạn nghĩ. Xem Google Tech Talk tuyệt vời này để có ấn tượng: http://www.youtube.com/watch?v=hQVTIJBZook
Điều mà mọi lập trình viên javascript nên biết?
Làm thế nào về, tôi có thể tắt những nỗ lực của bạn với 2 lần nhấp. Vì vậy, cung cấp một dự phòng nếu có thể.
Tôi thực sự khuyên bạn nên đọc Javascript: Phần tốt
Bạn biết javascript nếu bạn có thể sử dụng Array, Number, String, Date và Object một cách hiệu quả. Điểm cộng cho môn Toán và RegExp. Bạn sẽ có thể viết các hàm và sử dụng các biến (trong phạm vi chính xác, tức là 'phương thức' của một đối tượng).
Tôi thấy một số ý kiến về việc biết đóng cửa, cú pháp hàm ngông cuồng, blabla. Tất cả điều đó là không liên quan cho câu hỏi này. Điều đó giống như nói rằng bạn là người chạy nếu bạn có thể chạy 100 mét trong vòng 11 giây.
Tôi nói có thể mất vài tuần để thành thạo javascript. Sau đó, phải mất nhiều năm và hàng chục cuốn sách và hàng ngàn dòng lập trình để trở thành một chuyên gia, một ninja, v.v.
Nhưng đó không phải là câu hỏi.
Ồ, và DOM không phải là một phần của javascript và jQuery cũng không. Vì vậy, tôi nghĩ rằng cả hai đều không liên quan đến câu hỏi quá.
JSLint http://www.JSLint.com/
mảng . length
phương thức không phải là số lượng các mục của mảng, mà là chỉ mục cao nhất. ngay cả khi mục được đặt thànhundefined
var a = [];
a.length; // === 0
a[10]; // === undefined
a[10] = undefined;
a.length; // === 11
a.pop(); // === undefined
a.length; // === 10
hành vi này khó có thể phân biệt với lỗi thiết kế ngôn ngữ ..
jQuery sẽ là đề xuất tốt nhất của tôi. Không chỉ đối với bản thân mã, đó là thành ngữ, phong cách, suy nghĩ đằng sau nó đáng được mô phỏng nhất.
Đó là javascript là ngôn ngữ được triển khai rộng rãi nhất trên thế giới. (Có lẽ)
Học một ngôn ngữ thực sự tốt và hiểu được những điều kỳ quặc khác nhau đến từ (nhiều năm) kinh nghiệm. Nếu bạn muốn trở thành một lập trình viên giỏi hơn, tôi sẽ nói, hiểu các mẫu thiết kế, cách thức và thời điểm sử dụng chúng và / hoặc ngay cả khi bạn đang sử dụng chúng mà không nhận ra nó; kiến trúc kỹ thuật & kinh nghiệm người dùng.
Biết ngôn ngữ (JavaScript) có nghĩa là bạn có thể chọn bất kỳ khung nào và sử dụng nó theo ý muốn. Bạn chắc chắn sẽ cần phải đi sâu vào mã nguồn và nếu tất cả những gì bạn biết là cú pháp một khung hoặc 2 hoặc 3, thì bạn sẽ không đi xa. Nói như vậy, đi vào một vài mã nguồn của các khung khác nhau có lẽ là một trong những cách tốt nhất để xem JavaScript có thể được sử dụng như thế nào. Lúng túng bằng cách chuyển qua mã trong Fireorms hoặc Web Inspector, sau đó kiểm tra Tài liệu JavaScript, đặc biệt là các tài liệu Mozilla và Webkit, để hiểu thêm về những gì bạn đang xem.
Hiểu được sự khác biệt giữa Lập trình hướng đối tượng và Lập trình chức năng, JavaScript là sự pha trộn gợi cảm của cả hai và khi nào và làm thế nào để sử dụng cả hai để tạo ra một cơ sở mã hóa sát thủ và các ứng dụng tuyệt vời sẽ giúp bạn trở thành một Lập trình viên JavaScript tốt hơn.
Chỉ cần đọc một số cuốn sách, đặc biệt là "những phần hay" của Crockford, đơn thuần chỉ trình bày ý kiến của anh ấy về những gì tốt trong JavaScript, trong khi bỏ qua hầu hết các phần TUYỆT VỜI của JavaScript sẽ khiến bạn đi sai hướng.
Kiểm tra mã được viết bởi một người như Thomas Fuchs, mặt khác sẽ giúp bạn hiểu rõ hơn về sức mạnh của việc viết JavaScript tuyệt vời và hiệu quả.
Cố gắng ghi nhớ một vài vấn đề hoặc WTF cũng sẽ không giúp được gì nhiều, bạn sẽ chọn nó nếu bạn bắt đầu viết mã và bước qua mã thư viện / khung, đặc biệt là một nhận xét hữu ích, để xem tại sao họ đã sử dụng một số các thuộc tính / giá trị chứ không phải tại sao và khi nào tốt khi sử dụng các toán hạng và toán tử cụ thể, đây là tất cả những gì có trong mã của khung công tác mà mọi người sử dụng. Làm thế nào tốt hơn để học bằng ví dụ? : ^)
Trong Javascript, Hiệu suất quan trọng.
Không có trình biên dịch thông minh để tối ưu hóa mã của bạn, vì vậy bạn nên cẩn thận hơn trong khi viết văn bản javascript so với các ngôn ngữ như C #, Java ...
Những điều sau đây cũng quan trọng:
1) Palăng biến thiên. 2) Chuỗi phạm vi và các đối tượng kích hoạt.
và sau đó những thứ như thế này: :)
3) wtfjs.com
4) tất cả mọi thứ là một đối tượng http://www.lifeinafolder.com/images/Js.jpg
JavaScript không hỗ trợ tách từ khóa return và return return với ký tự dòng mới như đoạn mã sau (hoặc thử nó tại trang jsFiddle của tôi )
function foo()
{
return
{
bar: 'something'
};
}
$(function()
{
document.write(foo());
});
Tôi không hiểu tại sao JavaScript không hỗ trợ kiểu này vì việc đọc mã nguồn JavaScript rất phức tạp sẽ dễ dàng hơn nhiều khi so sánh với kiểu JavaScript mặc định.
Tái bút Tôi đã viết JavaScript gần 6 năm. Nhưng tôi chỉ tìm thấy lỗi này với chính mình khi tôi cố gắng thực hiện chức năng sau. Nó luôn trả về không xác định. Khi tôi sử dụng trình gỡ lỗi và bước vào chức năng này, mọi thứ đều hoạt động tốt. Tôi nghĩ nó nên là lỗi lập trình tồi tệ nhất trong cuộc đời tôi.
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') : '');
}
var foo = "bar" +
) trình phân tích cú pháp đọc.
var foo = 5
và -1;
sẽ dẫn đến foo được đặt thành 4, mặc dù mỗi dòng đều là các câu lệnh hợp lệ.
Vì JS là một ngôn ngữ chức năng, một lập trình viên đàng hoàng phải có khả năng viết Y-combinator và giải thích cách nó hoạt động ra khỏi đỉnh đầu.
... trong khoảng Google Web Toolkit , có nghĩa là dự án javascript của bạn có thể được phát triển theo cách triệu tập hơn nhiều.