JavaScript A Crash Course - Part I: Core Language Syntax
Bạn đang xem 20 trang mẫu của tài liệu "JavaScript A Crash Course - Part I: Core Language Syntax", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên
Tài liệu đính kèm:
- javascript_a_crash_course_part_i_core_language_syntax.pdf
Nội dung text: JavaScript A Crash Course - Part I: Core Language Syntax
- © 2009 Marty Hall JavaScript: A Crash Course Part I: Core Language Syntax Originals of Slides and Source Code for Examples: Customized Java EE Training: Servlets, JSP, JSF 1.x & JSF 2.0, Struts Classic & Struts 2, Ajax, GWT, Spring, Hibernate/JPA, Java 5 & 6. Developed and taught by well-known author and developer. At public venues or onsite at your location. © 2009 Marty Hall For live Ajax & GWT training, see training courses at http:// courses.coreservl et s.com/ . Taught by the author of Core Servlets and JSP, More Servlets and JSP, and this tutorial. Available at public venues, or customized versions can be held on-site at your organization. • CdlddthtbMtHllCourses developed and taught by Marty Hall – Java 6, intermediate/beginning servlets/JSP, advanced servlets/JSP, Struts, JSF 1.x & 2.0, Ajax, GWT, custom mix of topics – Ajax coursesCustomized can concentrate Java on EEone library Training: (jQuery, Prot httpotype/Scriptaculous,://courses.coreservlets.com/ Ext-JS, Dojo) or survey several • Courses developed and taught by coreservlets.com experts (edited by Marty) Servlets, –JSP,Spring, JSF Hibernate/JPA, 1.x & JSF 2.0,EJB3, Struts Ruby/Rails Classic & Struts 2, Ajax, GWT, Spring, Hibernate/JPA, Java 5 & 6. Developed and taught by well-knowContactn author hall@coreservlets.com and developer. At public for details venues or onsite at your location.
- Topics in This Section • Overview • JavaScript references • Embedding in browser • Basic syntax • Strings and regular expressions • Functions • Objects 5 © 2009 Marty Hall Intro Customized Java EE Training: Servlets, JSP, JSF 1.x & JSF 2.0, Struts Classic & Struts 2, Ajax, GWT, Spring, Hibernate/JPA, Java 5 & 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.
- Books • JavaScript the Definitive Guide – By David Flanagan , O ’ Reilly. The only really complete reference on the JavaScript language. Thorough and well-written. • Makes the global variable blunder when covering Ajax. • JavaScript: The Good Parts – By Douglas Crockford (of JSON and YUI fame), O’Reilly – Outstanding advanced guide to best practices in core JavaScript, esppyecially functions ,j,g, objects, and regular exp ressions. Very short. • Does not cover Ajax at all. No DOM scripting. “The K&R of JS”. • Pro JavaScript Techniques – By John Resig ((jQyof jQuery fame ), APress – Excellent guide to best practices; not a thorough reference • Does not make the global variable blunder when covering Ajax. • DOM Scrippgting – By Jeremy Keith, FriendsOf Press – Focuses on manipulating DOM and CSS 7 • Makes the global variable blunder when briefly covering Ajax. Online References • JavaScript tutorial (language syntax) • .com/js/ • Core_JavaScript_1.5_Guide • JavaScript API references ( builtin objects) • • QuickRef/ • • • Core_JavaScript_1.5_Reference • HTML DOM reference (with JavaScript Examples) • • Official ECMAScript specification • 8 Ecma-262.htm
- Firebug • Install Firebug in Firefox – • Use Firebug console for interactive testing – h//fib /lhlcl.html • Can also use Firebug Lite in Internet Explorer – Not great, but better than nothing – httppg://getfirebug .com/lite.html • See especially “bookmarklet” link • For more details on Firebug usage – See section on Ajax development and debugging tools 9 © 2009 Marty Hall Embedding JavaScript in HTML Customized Java EE Training: Servlets, JSP, JSF 1.x & JSF 2.0, Struts Classic & Struts 2, Ajax, GWT, Spring, Hibernate/JPA, Java 5 & 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.
- Loading Scripts • script with src • – Purpose • To define functions, objects, and variables. • Functions will later be triggered by buttons, other user events, inline script tags with body content, etc. • script with body content • JavaScript code – Purpose • To directly invoke code that will run as page loads – E.g., to output HTML content built by JavaScript • Don’ t use this approach for defining functions or for doing things that could be done in external files. – Slower (no browser caching) and less reusable 11 Example (phish.js) function getMessage() { var amount = Math.round (Math. random() * 100000); var message = "You won $" + amount + "!\n" + "To collect yyg,your winnings, send your credit card\n" + "and bank details to oil-minister@phisher.com."; return(message); “alert” pops up dialog box } function showWinnings1() { alert(getMessage()); } “dtitdocument.write” inser ts text int o page at current loca tion function showWinnings2() { document. write(" " + getMessage() + " "); } 12
- Example (loading-scripts.html) Loading Scripts Loads script from previous page Calls showWinnings1 when user presses button. Puts result in dialog box. showWinnings2() Calls showWinnings2 when page is loaded in browser. Puts result at this location in page. 13 Example (Results) 14
- Loading Scripts: Special Cases • Internet Explorer bug – Scripts with src fail to load if you use . • You must use • XHTML: Scripts with body content – It is an error if the body of the script contains special XML c haract ers such as & or if (a – So, use CDATA section unless body content is simple and clearly has no special characters • 15 © 2009 Marty Hall Basic Syntax Customized Java EE Training: Servlets, JSP, JSF 1.x & JSF 2.0, Struts Classic & Struts 2, Ajax, GWT, Spring, Hibernate/JPA, Java 5 & 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.
- Variables • Introduce with “var” – For global variables (!) and local variables. – No “var” for function arguments • You do not declare types – Some people say JavaScript is “untyped” language, but really it is “dyyyypnamically typed” langgguage – JavaScript is very liberal about converting types • There are only two scopes – Global scope • Be very careful with this when using Ajax. • Can cause race conditions. – Function (lexical) scope 17 – There is not block scope as in Java Operators and Statements • Almost same set of operators as Java – + (addition and String concatenation), -, */*, / – &&, ||, ++, , etc – The == comparison is more akin to Java's "equals" – The === operator (less used) is like Java 's== s == • Statements – Semicolons are technically optional • But highly recommended – Consider • return x • return x • They are not identical! The second one returns, then evaluates x. You should act as though semicolons are required as in Java. • Comments – Same as in Java (/* */ and // ) 18
- Conditionals and Simple Loops • if/else – Almost identical to Java except test can be converted to true/false instead of strict true/false • “false” : false , null, undefined, "" (empty string) , 0, NaN • “true”: anything else (including the string “false”) • Basic for loop – Identical to Java except for variable declarations • for(var i=0; i<someVal; i++) { doLoopBody(); } • while loop – Same as Java except test can be converted to boolean • while(someTest) { doLoopBody(); } • do/while loop 19 – Same as Java except test can be converted to boolean Array Basics • One-step array allocation – var primes = [2, 3, 5, 7, 11, 13]; – var names = ["Joe", "Jane", "John", "Juan"]; • No trailing comma after last element (see later slide) • Two-step array allocation – var names = new Array(4) ; names[0] = "Joe"; names[3] = "Juan" ; • Indexed at 0 as in Java – foo(var(var i=0; i<naaes.egtmes.length; i++)){ { doSomethingWith(names[i]); } 20
- Other Conditionals and Loops • switch – Differs from Java in two ways • The “case” can be an expression • Values need not be ints (compared with ===) • for/in loop – On surface, looks similar to Java for/each loop, but • For arrays, values are array indexes, not array values – Use this loop for objects (to see property names), not arrays! Fails with Prototype or other extended arrays • For objects, values are the property names – var names = ["Joe", "Jane", "John", "Juan"]; for(var i in names ){) { doSomethingWith(names[i]); } 21 More on Arrays • Arrays can be sparse – var names = new A()Array(); names[0] = "Joe"; names[100000] = "Juan"; • Arrays can be resized – Regardless of how arrays is created, you can do: • myArray.length = someNewLength; • myArray[anyNumber] = someNewValue; • myArray.push(someNewValue) – These are legal reggyardless of which way myyyArray was made • Arrays have methods – push, pop, join, reverse, sort, concat, slice, splice, etc. • See API reference • Regular objects can be treated like arrays 22 – You can use numbers (indexes) as properties
- Arrays Example function arrayLoops() { var names = ["Joe", "Jane", "John"]; printArray1(names); printArray2(names); names.length = 6; printArray 1(names); printArray2(names); } function printArray1(array) { for(var i=0; i<array.length; i++) { console.log("[printArray1] array[%o] is %o", i, array[i]); } } console.log is a printf-like way to print output in Firebug function printArray2(array) { Console window. For testing/debugging only. for(var i in array) { console.log("[printArray2] array[%o] is %o", i, array[i]); } Direct call for interactive testing in Firebug console. } (Cut/paste all code into console command line.) 23 arrayLoops(); Array Performance Time to create and sum array of 16 million random numbers 9 8 7 6 5 4 3 2 1 0 JavaScript: Firefox 3 JavaScript: Google Chrome Java: 1.6_0_10 Note: Internet Explorer 7 was more than 10 times slower than Firefox, so times are not shown here. 24 Source code for benchmarks is in downloadable Eclipse project at coreservlets.com.
- The Math Class • Almost identical to Java – Like Java, static methods (Math.cos, Math.random, etc.) – Like Java, logs are base e, trig functions are in radians • Functions – Math.abs, Math.acos, Math.asin, Math.atan, Math.atan2, Math.ceil,,,p, Math.cos, Math.exp, Math.floor,,g, Math.log, Math.max, Math.min, Math.pow, Math.random, Math.round, Math.sin, Math.sqrt, Math.tan • Constants – Math.E, Math.LN10, Math.LN2, Math.LOG10E, Math.PI, Math.SQRT1 _2, Math.SQRT2 25 © 2009 Marty Hall Strings and Reggpular Expressions Customized Java EE Training: Servlets, JSP, JSF 1.x & JSF 2.0, Struts Classic & Struts 2, Ajax, GWT, Spring, Hibernate/JPA, Java 5 & 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.
- String Basics • You can use double or single quotes – var names = [Joe ["Joe"', Jane'", John"', Juan' ]; • You can access length property – E.g., "foobar".length returns 6 • NbNumbers can be convert tdttied to strings – Automatic conversion during concatenations. String need not be first as in Java • var val =3+= 3 + "abc" + 5; // Result is "3abc5" – Conversion with fixed precision • var n = 123.4567; var val = n.toFixed(();2); // Result is 123.46 ( not 123.45) • Strings can be compared with == – "foo" == 'foo' returns true • Strings can be converted to numbers – var i = parseInt("37 blah"); // Result is 37 – ignores blah – var d = parseFloat("6.02 blah"); // Ignores blah 27 Core String Methods • Simple methods similar to Java – charAt, indexOf, lastIndexOf, substring, toLowerCase, toUpperCase • Methods that use regular expressions – match, replace, search, split • HTML methods – anchor, big, bold, fixed, fontcolor, fontsize, italics, link, small, strike, sub, sup • "test".bold().italics().fontcolor("red") returns ' test ' – These are technicallyypp nonstandard methods, but supported in all major browsers • But I prefer to construct HTML strings explicitly anyhow 28
- Regular Expressions • You specify a regexp with /pattern/ – Not wihith a S tri ng as i n J ava • Most special characters same as in Java/Unix/Perl – ^,,, $, . – beggg,inning, end of string, g,y any one char – \ – escape what would otherwise be a special character – *, +, ? – 0 or more, 1 or more, 0 or 1 occurrences – {n}, {n ,} – exactly n , n or more occurrences – [] – grouping – \s, \S – whitespace, non-whitespace – \w, \W – word char (letter or number) , non -word char • Modifiers – /pattern/g – do global matching (find all matches, not just first one) – /pattern/i – do case-insensitive matching – /pattern/m – do multiline matching 29 Regular Expression: Examples 30
- More Information on Regular Expressions • Online API references given earlier (See R eg Exp c lass) – – . com/technologies/ecmascript/ QuickRef/regexp.html • JavaScrippgt Regular Exp ression Tutorials – JavaScript/17/36435/ – h//j iki/jptkit.com/javatutors/ /hlre.shtml 31 © 2009 Marty Hall Functions “It is Lisp in Cs C’s clothing.” - JSON and YUI guru Douglas Crockford, describing the JavaScript language in JavaScript: The Good Parts. Customized Java EE Training: Servlets, JSP, JSF 1.x & JSF 2.0, Struts Classic & Struts 2, Ajax, GWT, Spring, Hibernate/JPA, Java 5 & 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.
- Overview • Not similar to Java – JSifiJavaScript functions very different from Java met ho ds • Main differences from Java – You can have global functions • Not just methods (functions as part of objects) – You don’t declare return types or argument types – Caller can supply any number of arguments • Regardless of how many arguments you defined – Functions are first-class datatypes • You can pass functi ons around , st ore th em i n arrays, et c. – You can create anonymous functions (closures) • Critical for Ajax • These are equivalent – function foo( ) { } – var foo = function( ) { } 33 Passing Functions: Example function third(x) { return(x / 3); } function triple(x) { return(()x * 3); } function nineTimes(x) { return (x * 9 ); } Function as argument. function operate(f){) { var nums = [1, 2, 3]; for(var i=0; i<nums.length; i++) { var num = nums[i]; console. log("Operationon%ois%o Operation on %o is %o.," num, f(num)); } } 34
- Anonymous Functions • Anonymous functions (or closures) let you capture local variables inside a function – You can't do Ajax without this! • Basic anonymous function – operate(function(x) { return(x * 20); }); • Outputs 20, 40, 60 • The "operate" function defined on previous page • Anonymous function with captured data – function someFunction(args) { var val = someCalculation(args); return(function(moreArgs){) { doSomethingWith(val, moreArgs); }); } var f1 = someFunction(args1); var f2 = someFunction(args2); f1(args3); // Uses one copy of "val" 35 f2(args3); // Uses a different copy of "val" Anonymous Functions: Example function multiplier(m) { return(function(x) { return(x * m); }); } function operate2() { var nums = [1, 2, 3]; var functions = [multiplier(1/3), multiplier(3), multiplier(9)]; for(var i=0; i<functions.length; i++) { for(var j=0; j<nums.length; j++) { var f = functions[i]; var num = nums[j]; console.loggp("Operation on %o is %o.", num, f(num)); } } 36 }
- Optional Args: Summary • Fixed number of optional args – Functions can always be called with any number of args – Compare typeof args to "undefined" – See next page and upcoming convertString function • Arbitrary args – Discover number of args with arguments. length – Get arguments via arguments[i] – See next page and upcoming longestString function • Optional args via anonymous object – Caller always supplies same number of arguments, but one of th e argument s i s an anonymous (JSON) obj ect • This object has optional fields 37 – See later example in “Objects” section Optional Args: Details • You can call any function with any number of arguments – If called with fewer args, extra args equal "undefined" • You can use typeof arg == "undefined" for this – You can also use boolean comparison if you are sure that no real value could match (e.g., 0 and undefined both return true for !arg) • Use comments to indicate optional args – function foo(arg1, arg2, /* Optional */ arg3) { } – If called with extra args, you can use “arguments” array • RdlfdfidiblRegardless of defined variables, argumentlts.leng thtlltells you how many arguments were supplied, and arguments[i] returns the designated argument • Use comments to indicate extra args – function bar(arg1, arg2 /* varargs */) { } 38
- Optional Arguments function convertString(numString, /* Optional */ base) { if (typeof base == "undefined" ) { base = 10; } var num = parseInt(numString, base); console.log("%s base %o equals %o base 10.", numString, base, num); } 39 Varargs function longestString(/* varargs */) { var longest = ""; for(var i=0; i longest. length){) { longest = candidateString; } } return(longest); } longestString("a", "bb", "ccc", "dddd"); // Returns "dddd" 40
- © 2009 Marty Hall Objects Customized Java EE Training: Servlets, JSP, JSF 1.x & JSF 2.0, Struts Classic & Struts 2, Ajax, GWT, Spring, Hibernate/JPA, Java 5 & 6. Developed and taught by well-known author and developer. At public venues or onsite at your location. Basics • Constructors – FiFunctions named dfl for class names. Th en use “”“new”. • No separate class definition! No “real” OOP in JavaScript! – Can define properties with “this” • You must use “this” for properties used in constructors function MyClass(n1) { this.foo = n1; } var m = new MyClass(10); • Pti(itProperties (instance vari ibl)ables) – You don’t define them separately • When ev er you r ef er to on e, Jav aScri pt just cr eates i t m.bar = 20; // Now m.foo is 10 and m.bar is 20 • Usually better to avoid introducing new properties in outside code and instead do entire definition in constructor • Methods – Properties whose values are functions 42
- Objects: Example (Circle Class) function Circle(radius) { this. radius = radius; this.getArea = function() { return(Math.PI * this.radius * this.radius); }; } var c = new Circle(10); c.getArea(); // Returns 314. 15 92 43 The prototype Property • In previous example – ECilifdiEvery new Circle got its own copy of radius • Fine, since radius has per-Circle data – Every new Circle got its own copy of getArea function • Wasteful since function definition never changes • Class-level properties – Classname.prototype .propertyName = value; • Methods – Classname.prototype.methodName = function() { }; • Just a special case of class-level properties – This is legal anywhere, but it is best to do it in constructor • Pseudo-Inheritance – The prototype property can be used for inheritance – But complex. See later section on Prototype library 44
- Objects: Example (Updated Circle Class) function Circle(radius) { this. radius = radius; Circle.prototype.getArea = function() { return(Math.PI * this.radius * this.radius); }; } var c = new Circle(10); c.getArea(); // Returns 314. 15 92 45 Rolling Your Own Namespace • Idea – HldHave related fifunctions th hdat do not use obj ect properti es – You want to group them together and call them with Utils.func1, Utils.func2, etc. • Grouping is a syntactic convenience. Not real methods. • Helps to avoid name conflicts when mixing JS libraries – Similar to static methods in Java • Syntax – Assign functions to properties of an object, but do not define a constructor . E .g ., • var Utils = {}; // Or "new Object()", or make function Utils Utils.foo = function(a, b) { }; Utils. bar = func tion( c) { }; var x = Utils.foo(val1, val2); 46 var y = Utils.bar(val3);
- Static Methods: Example (Code) var MathUtils = {}; MathUtils.fact = function(n) { if (n <= 1) { return(1); } else { return(n * MathUtils.fact(n-1)); } }; MathUtils.log10 = function(x) { return(Math.lo g(x )/Math.lo g(10 )); }; 47 Namespaces in Real Applications • Best practices in large projects – In many (most?) large projects, all global variables (including functions!) are forbidden due to the possibility of name collisions from pieces made by different authors. – So, these primitive namespaces play the role of Java’s packages. Much weaker, but still very valuable. • Fancy variation: repeat the name • var MyApp = {}; • MyApp. foo = function foo(){};( ) { }; • MyApp.bar = function bar( ) { }; – The name on the right does not become a global name. The onl y ad vant age i s f or d eb uggi ng • Firebug and other environments will show the name when 48 you print the function object.
- JSON (JavaScript Object Notation) • Idea – A simple textual representation of JavaScript objects – Main applications • One-time-use objects (rather than reusable classes) • Objects received via strings • Directly in JavaScript – var someObject = { property1: value1, property2: value2, }; • In a string (e.g., when coming in on network) – Surround object representation in parens – Pass to the builtin “eval” function 49 JSON: Example var person = { firstName: 'Brendan', lastName: 'Eich', bestFriend: { firstName: 'Chris', lastName: 'Wilson' }, greeting: function() { return("Hi, I am " + this.firstName + " " + this.lastName + "."); } }; 50
- Using JSON for Optional Arguments • Idea – Caller always supplies same number of arguments, but one of the arguments is an anonymous (JSON) object • This object has optional fields – This approach is widely used in Prototype, Scriptaculous, and other JavaScript libraries • Example (a/b: required, c/d/e/f: optional) – someFunction(1.2, 3.4, {c: 4.5, f: 6.7}); – someFunction(1.2 , 3 .4 , {c: 4 .5 , d: 6 .7 , e: 7 .8}); – someFunction(1.2, 3.4, {c: 9.9, d: 4.5, e: 6.7, f: 7.8}); – someFunction((,1.2, 3.4); 51 Using JSON for Optional Arguments: Example Code function sumNumbers(x, y, extraParams) { var result = x + y; if (isDefined(extraParams)) { if (isTrue(extraParams.logInput)) { console.log("Input: x=%s, y=%s", x, y); } if (isDefined(extraParams.extraOperation)) { result = extraParams.extraOperation(result); } } return(result) } function isDefined(value) { return(typeof value != "undefined"); } function isTrue(value) { return(isDefined(value) && (value == true)) 52 }
- Using JSON for Optional Arguments: Example Results 53 Internet Explorer and Extra Commas • Firefox tolerates trailing commas in both arrays andJSONd JSON • var nums = [1, 2, 3, ]; • var obj = { firstName: "Joe" , lastName: "Hacker", }; • IE will crash in both cases. – And, since it is not technically legal anyway, you should write it without commas after the final element: • var nums = [1, 2, 3]; • var obj = { firstName: "Joe" , lastName: "Hacker" }; – This issue comes up moderately often, especially when building JavaScript data on the server, as we will do in upcomilting lectures. 54
- Other Object Tricks • The instanceof operator – Determ ines if lh s i s a memb er of cl ass on rhs • if (blah instanceof Array) { doSomethingWith(blah.length); } • The typeof operator – Returns direct type of operand, as a String • "number", "string", "boolean", "object", "function", or "undefined". – Arrays and null both return "object" • Adding methods to builtin classes String.prototype.describeLength = function() { return("My length is " + this.length); }; "Any Random String".describeLength(); • eval – Takes a String representing any JavaScript and runs it • eval("3 * 4 + Math.PI"); // Returns 15.141592 55 © 2009 Marty Hall Wrap-up Customized Java EE Training: Servlets, JSP, JSF 1.x & JSF 2.0, Struts Classic & Struts 2, Ajax, GWT, Spring, Hibernate/JPA, Java 5 & 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.
- Summary • Use Firebug for testing and debugging • BkBookmar kfk references – • Embedding in browser – • Basic syntax – Mostly similar to Java • Functions – Totally different from Java . Passing functions around and making anonymous functions very important. • Objects – Constructor also defines class. Use “this”. – Totally different from Java. Not like classical OOP at all. 57 © 2009 Marty Hall Questions? Customized Java EE Training: Servlets, JSP, JSF 1.x & JSF 2.0, Struts Classic & Struts 2, Ajax, GWT, Spring, Hibernate/JPA, Java 5 & 6. Developed and taught by well-known author and developer. At public venues or onsite at your location.