SlideShare une entreprise Scribd logo
1  sur  92
JavaScript  Needn’t Hurt! Thomas Kjeldahl Nilsson [email_address] linkedin.com/in/thomaskjeldahlnilsson twitter.com/thomanil
Intro
Who Are You? Done any JavaScript? Dozen lines of code? Hundreds?   Thousands?
Who Am I? JavaScript enthusiast Hundreds of hours Thousands lines of code Not an expert!
What Are We Covering Today? Language basics Html scripting Good practices Tools
Practical Stuff
History Lesson
 
Brendan Eich
ECMAScript
A Note on ActionScript
What Rocks? Powerful, elegant, dynamic Present & enabled for most users Not confined to the browser Small learning surface
What Sucks? Rushed out the door Some bad language features Crossbrowser problems
Development Environment Walkthrough
Language Basics Syntax Types Variables Objects Functions
Basic Syntax Similar to Java, C# Operators, statements if-else, while, for, try-catch-finally Still in Kansas...
Types Strings Numbers Booleans Objects Arrays
Variable Declarations var x = “foo”;  // string var x = 2;  // number var x = true;  // boolean var x = { };  // object var x = [ ];  // array
Objects
Object Creation Literal Form var BasicProject = { name : "Steria Workshop", version : 1.2, getName : function() { return this.name; } };
Object Creation Dynamic Form var BasicProject = {}; BasicProject.name = "Steria Workshop"; BasicProject.version = 1.2; BasicProject.getName = function() { return this.name; };
Objects as Maps (Associative Arrays) var Person = { firstname:"John", lastname:"Smith" }; Person.firstname;  // => "John" (Access using identifier) Person["firstname"];  // => "John" (Access using variable name)
Arrays are Special Case of Object var arr = [];  // Always declared without size.  // Grows as needed. arr[0] = true; arr[3] = "john"; arr[300] = { description : "object!" }; arr[100];  // => Undefined  arr.length;  // => 301
Arrays and Objects Can Be Deeply Nested var OuterObject = { innerArray : [ innerObject : { deepestArray : [1,2,3] } ] };
JSON {"firstName":"Gustav","lastName":"Adolf", "roles":["King of Sweden","Terrible shipbuilder"], "other":{"birth":"9.12.1594","death":"16.11.1632"}}
Kind Familiar Looking { "firstName" : "Gustav", "lastName" : "Adolf", "roles" : [ "King of Sweden",  "Terrible shipbuilder" ], "other" : { "birth" : "9.12.1594", "death" : "16.11.1632" } }
JavaScript Object Literal! var EvaluatedObject =  { firstName : "Gustav", lastName : "Adolf", roles : [ "King of Sweden",  "Terrible shipbuilder" ], other : { birth : "9.12.1594", death : "16.11.1632" } } ;
Inheritance
Prototypal Inheritance (Simplified) var Employee = {name : "CEO Jack", company : "ACME Inc."}; var Janitor = Object.create(Employee); // Janitor now looks and behaves just like its prototype, Employee Janitor.company // =>  "ACME Inc.", falls back to prototype.company Janitor.name = "Janitor Tim"; // Override name Janitor.tools = ["broom", "bucket"]; // Define member variable only on child Employee.name = "CEO Jane"; // Change name of prototype Janitor.name; // => Still "Janitor Tim". Overriden members unaffected by prototype changes
Functions
Simple Function Definition function add(a, b) { return a + b; }
That's Just a  Way of Saying:  var add = function(a, b) { return a + b; }; // Use this consistently // Helps you remember: // Functions are just variables!
An Anonymous Function... function(element) { // Do something with element }
...Can Be Sent To Another Function each(collection, function(element) { // Do something with current element });
Example: Event Handler button.onClick(function(element) { alert(«You clicked me!»); });
Sharp Edges Global variables No block s cope Semicolon insertion == operator
Properly Scoped Variable var getSmallNumber = function(){ var  smallNumber = 42; // Note use of  var  keyword return smallNumber; };
Sloppy, Global Variable var getSmallNumber = function(){ smallNumber = 42;  return smallNumber; }; // Missing var prefix = smallNumber gets global scope // Becomes available for all code // Sticks around and pollutes namespace
No Block Scope var x = 1; if (true) { var x = 123; } // x => 123
Semicolon insertion Don't force the browser to guess!
Example a = b + c (d + e).print() becomes... a = b + c(d + e).print();
== vs ===
Quiz '' == '0'  // true or false? 0 == ''  // true or false? 0 == '0'  // true or false? false == 'false'  // true or false? false == '0'  // true or false? false == undefined  // true or false? false == null  // true or false? null == undefined  // true or false? '  ' == 0  // true or false?
How Many Did You Get? '' == '0'  // false 0 == ''  // true 0 == '0'  // true false == 'false'  // false false == '0'  // true false == undefined  // false false == null  // false null == undefined  // true '  ' == 0  // true // Why? Type coercion on right operand, that's why.
Instead, Use === (And !==)  '' === '0'  // false 0 === ''  // false 0 === '0'  // false false === 'false'  // false false === '0'  // false false === undefined  // false false === null  // false null === undefined  // false '  ' === 0  // false
Advanced Stuff Closures Modules Memoization
Clientside Firebug jQuery
Firebug Demo
The DOM
 
<TABLE>   <TBODY>    <TR>    <TD>Shady Grove</TD>   <TD>Aeolian</TD>    </TR>    <TR>   <TD>Over the River, Charlie</TD>    <TD>Dorian</TD>    </TR>    </TBODY>   </TABLE>
 
DOM Scripting Basics x.getElementById(id) ; // get the element with a specified id x.getElementsByTagName(name);  // get all elements with a    // specified tag name x.appendChild(node);   // insert a child node to x x.removeChild(node), // remove a child node from x x.innerHTML = «<p>New text</p>»; // fill element with html or text
Live Example
DOM Api: Crossbrowser Headache http://www.quirksmode.org
So Use a Framework!
jQuery
Instant Win: Crossbrowser Non-verbose Traverse DOM Manipulate DOM
Lots of Other Stuff, Too Server communication UI widgets and effects each(), map(), etc JSON parsing +++
jQuery Function $()  // Short form jQuery() // Long form
Find Stuff $(“p”);    // Find all paragraphs $(“#shoppingList”);  // Find element with id 'shoppingList' $(“.shoppingListItem”); // Find elements with class 'shoppingListItem' $(“:text”);   // Find all text elements $(“:visible”);   // Find only visible elements
$() Wraps and Returns Matching Element(s)
Manipulate Matched DOM Elements $(“p”).css(”color”, ”green”);  // Set color on all paragraph elements $(“p”).hide();  // Hide all paragraphs // Make all input buttons react to mouse clicks $(“input”).click(function(){ alert(”You clicked this button!”); });
Chaining Every API call returns jQuery object So we can chain function calls together “Fluent API”
Chaining Example // Set color on all paragraph elements, then hide them all $(“p”).css(”color”, ”green”).hide();
Live Example
Prepared Example
Caution! Use frameworks as needed But don't depend on them! JavaScript != jQuery
Good Practices jsLint Automated testing Unobtrusive JavaScript
JsLint Demo
Automated Testing YUI Test demo
Unobtrusive JavaScript Structure vs behavior Separate js files Event handler setup Namespaces Universal Access
 
 
 
 
 
Namespace Hygiene All your code within single object
Universal Access Can all your users use your site? Users without JS? Blind users with screen readers? Use progressive enhancement
Crossbrowser Dev Process Frameworks > raw DOM Test early, test often  Clean, disciplined code
Let’s Code! Exercises
Wrap-up
What Did We Cover Today? Language basics Html scripting Good practices Tools
What´s Missing? Server Communication Performance Security Practice practice practice!
References & Further Studies
 
 
Web Resources http://javascript.crockford.com http://cjohansen.no/javascript http://developer.yahoo.com/yui/theater http://ajaxian.com
Best Way to Learn: Start Building! http://ajaxian.com/archives/writing-a-javascript-tetris-lessons-learned-from-a-ruby-chap
Download This Workshop http://kjeldahlnilsson.net/jsnh.zip Slides, lecture notes, exercises Creative Commons license Use and distribute freely... ...or have me present it for you on-site :)
Q&A  Discussion
Contact Info [email_address] linkedin.com/in/thomaskjeldahlnilsson twitter.com/thomanil

Contenu connexe

Tendances

Secrets of JavaScript Libraries
Secrets of JavaScript LibrariesSecrets of JavaScript Libraries
Secrets of JavaScript Librariesjeresig
 
Best practices for crafting high quality PHP apps (Bulgaria 2019)
Best practices for crafting high quality PHP apps (Bulgaria 2019)Best practices for crafting high quality PHP apps (Bulgaria 2019)
Best practices for crafting high quality PHP apps (Bulgaria 2019)James Titcumb
 
Introduction to jQuery
Introduction to jQueryIntroduction to jQuery
Introduction to jQueryGunjan Kumar
 
Javascript 2009
Javascript 2009Javascript 2009
Javascript 2009borkweb
 
Crafting Quality PHP Applications (ConFoo YVR 2017)
Crafting Quality PHP Applications (ConFoo YVR 2017)Crafting Quality PHP Applications (ConFoo YVR 2017)
Crafting Quality PHP Applications (ConFoo YVR 2017)James Titcumb
 
2013-06-25 - HTML5 & JavaScript Security
2013-06-25 - HTML5 & JavaScript Security2013-06-25 - HTML5 & JavaScript Security
2013-06-25 - HTML5 & JavaScript SecurityJohannes Hoppe
 
Crafting Quality PHP Applications (PHP Benelux 2018)
Crafting Quality PHP Applications (PHP Benelux 2018)Crafting Quality PHP Applications (PHP Benelux 2018)
Crafting Quality PHP Applications (PHP Benelux 2018)James Titcumb
 
Building Complex GUI Apps The Right Way. With Ample SDK - SWDC2010
Building Complex GUI Apps The Right Way. With Ample SDK - SWDC2010Building Complex GUI Apps The Right Way. With Ample SDK - SWDC2010
Building Complex GUI Apps The Right Way. With Ample SDK - SWDC2010Sergey Ilinsky
 
Patterns for JVM languages - Geecon 2014
Patterns for JVM languages - Geecon 2014Patterns for JVM languages - Geecon 2014
Patterns for JVM languages - Geecon 2014Jaroslaw Palka
 
JavaScript - Like a Box of Chocolates
JavaScript - Like a Box of ChocolatesJavaScript - Like a Box of Chocolates
JavaScript - Like a Box of ChocolatesRobert Nyman
 
Dip Your Toes in the Sea of Security (ConFoo YVR 2017)
Dip Your Toes in the Sea of Security (ConFoo YVR 2017)Dip Your Toes in the Sea of Security (ConFoo YVR 2017)
Dip Your Toes in the Sea of Security (ConFoo YVR 2017)James Titcumb
 
Unobtrusive javascript with jQuery
Unobtrusive javascript with jQueryUnobtrusive javascript with jQuery
Unobtrusive javascript with jQueryAngel Ruiz
 
Non Conventional Android Programming En
Non Conventional Android Programming EnNon Conventional Android Programming En
Non Conventional Android Programming Enguest9bcef2f
 
Crafting Quality PHP Applications (Bucharest Tech Week 2017)
Crafting Quality PHP Applications (Bucharest Tech Week 2017)Crafting Quality PHP Applications (Bucharest Tech Week 2017)
Crafting Quality PHP Applications (Bucharest Tech Week 2017)James Titcumb
 
jQuery Performance Tips and Tricks (2011)
jQuery Performance Tips and Tricks (2011)jQuery Performance Tips and Tricks (2011)
jQuery Performance Tips and Tricks (2011)Addy Osmani
 
Kicking off with Zend Expressive and Doctrine ORM (ConFoo YVR 2017)
Kicking off with Zend Expressive and Doctrine ORM (ConFoo YVR 2017)Kicking off with Zend Expressive and Doctrine ORM (ConFoo YVR 2017)
Kicking off with Zend Expressive and Doctrine ORM (ConFoo YVR 2017)James Titcumb
 
Crafting Quality PHP Applications (PHP Joburg Oct 2019)
Crafting Quality PHP Applications (PHP Joburg Oct 2019)Crafting Quality PHP Applications (PHP Joburg Oct 2019)
Crafting Quality PHP Applications (PHP Joburg Oct 2019)James Titcumb
 

Tendances (20)

Secrets of JavaScript Libraries
Secrets of JavaScript LibrariesSecrets of JavaScript Libraries
Secrets of JavaScript Libraries
 
Best practices for crafting high quality PHP apps (Bulgaria 2019)
Best practices for crafting high quality PHP apps (Bulgaria 2019)Best practices for crafting high quality PHP apps (Bulgaria 2019)
Best practices for crafting high quality PHP apps (Bulgaria 2019)
 
JavaScript Patterns
JavaScript PatternsJavaScript Patterns
JavaScript Patterns
 
Introduction to jQuery
Introduction to jQueryIntroduction to jQuery
Introduction to jQuery
 
Element
ElementElement
Element
 
Javascript 2009
Javascript 2009Javascript 2009
Javascript 2009
 
Crafting Quality PHP Applications (ConFoo YVR 2017)
Crafting Quality PHP Applications (ConFoo YVR 2017)Crafting Quality PHP Applications (ConFoo YVR 2017)
Crafting Quality PHP Applications (ConFoo YVR 2017)
 
2013-06-25 - HTML5 & JavaScript Security
2013-06-25 - HTML5 & JavaScript Security2013-06-25 - HTML5 & JavaScript Security
2013-06-25 - HTML5 & JavaScript Security
 
Crafting Quality PHP Applications (PHP Benelux 2018)
Crafting Quality PHP Applications (PHP Benelux 2018)Crafting Quality PHP Applications (PHP Benelux 2018)
Crafting Quality PHP Applications (PHP Benelux 2018)
 
Building Complex GUI Apps The Right Way. With Ample SDK - SWDC2010
Building Complex GUI Apps The Right Way. With Ample SDK - SWDC2010Building Complex GUI Apps The Right Way. With Ample SDK - SWDC2010
Building Complex GUI Apps The Right Way. With Ample SDK - SWDC2010
 
Patterns for JVM languages - Geecon 2014
Patterns for JVM languages - Geecon 2014Patterns for JVM languages - Geecon 2014
Patterns for JVM languages - Geecon 2014
 
JavaScript - Like a Box of Chocolates
JavaScript - Like a Box of ChocolatesJavaScript - Like a Box of Chocolates
JavaScript - Like a Box of Chocolates
 
Dip Your Toes in the Sea of Security (ConFoo YVR 2017)
Dip Your Toes in the Sea of Security (ConFoo YVR 2017)Dip Your Toes in the Sea of Security (ConFoo YVR 2017)
Dip Your Toes in the Sea of Security (ConFoo YVR 2017)
 
Unobtrusive javascript with jQuery
Unobtrusive javascript with jQueryUnobtrusive javascript with jQuery
Unobtrusive javascript with jQuery
 
Non Conventional Android Programming En
Non Conventional Android Programming EnNon Conventional Android Programming En
Non Conventional Android Programming En
 
Crafting Quality PHP Applications (Bucharest Tech Week 2017)
Crafting Quality PHP Applications (Bucharest Tech Week 2017)Crafting Quality PHP Applications (Bucharest Tech Week 2017)
Crafting Quality PHP Applications (Bucharest Tech Week 2017)
 
jQuery Performance Tips and Tricks (2011)
jQuery Performance Tips and Tricks (2011)jQuery Performance Tips and Tricks (2011)
jQuery Performance Tips and Tricks (2011)
 
Kicking off with Zend Expressive and Doctrine ORM (ConFoo YVR 2017)
Kicking off with Zend Expressive and Doctrine ORM (ConFoo YVR 2017)Kicking off with Zend Expressive and Doctrine ORM (ConFoo YVR 2017)
Kicking off with Zend Expressive and Doctrine ORM (ConFoo YVR 2017)
 
Ampersandjs
AmpersandjsAmpersandjs
Ampersandjs
 
Crafting Quality PHP Applications (PHP Joburg Oct 2019)
Crafting Quality PHP Applications (PHP Joburg Oct 2019)Crafting Quality PHP Applications (PHP Joburg Oct 2019)
Crafting Quality PHP Applications (PHP Joburg Oct 2019)
 

Similaire à JavaScript Needn't Hurt!

Introduction to Prototype JS Framework
Introduction to Prototype JS FrameworkIntroduction to Prototype JS Framework
Introduction to Prototype JS FrameworkMohd Imran
 
Beginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScriptBeginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScriptStoyan Stefanov
 
Lecture 5 - Comm Lab: Web @ ITP
Lecture 5 - Comm Lab: Web @ ITPLecture 5 - Comm Lab: Web @ ITP
Lecture 5 - Comm Lab: Web @ ITPyucefmerhi
 
Javascript Primer
Javascript PrimerJavascript Primer
Javascript PrimerAdam Hepton
 
Javascript Experiment
Javascript ExperimentJavascript Experiment
Javascript Experimentwgamboa
 
Javascript: Ajax & DOM Manipulation v1.2
Javascript: Ajax & DOM Manipulation v1.2Javascript: Ajax & DOM Manipulation v1.2
Javascript: Ajax & DOM Manipulation v1.2borkweb
 
Ods Markup And Tagsets: A Tutorial
Ods Markup And Tagsets: A TutorialOds Markup And Tagsets: A Tutorial
Ods Markup And Tagsets: A Tutorialsimienc
 
jQuery Presentation - Refresh Events
jQuery Presentation - Refresh EventsjQuery Presentation - Refresh Events
jQuery Presentation - Refresh EventsEugene Andruszczenko
 
Eugene Andruszczenko: jQuery
Eugene Andruszczenko: jQueryEugene Andruszczenko: jQuery
Eugene Andruszczenko: jQueryRefresh Events
 
Migration testing framework
Migration testing frameworkMigration testing framework
Migration testing frameworkIndicThreads
 
Introduction To Lamp
Introduction To LampIntroduction To Lamp
Introduction To LampAmzad Hossain
 
jQuery Performance Rules
jQuery Performance RulesjQuery Performance Rules
jQuery Performance Rulesnagarajhubli
 
Non Conventional Android Programming (English)
Non Conventional Android Programming (English)Non Conventional Android Programming (English)
Non Conventional Android Programming (English)Davide Cerbo
 

Similaire à JavaScript Needn't Hurt! (20)

Introduction to Prototype JS Framework
Introduction to Prototype JS FrameworkIntroduction to Prototype JS Framework
Introduction to Prototype JS Framework
 
Fantom and Tales
Fantom and TalesFantom and Tales
Fantom and Tales
 
Beginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScriptBeginning Object-Oriented JavaScript
Beginning Object-Oriented JavaScript
 
Advanced JavaScript
Advanced JavaScriptAdvanced JavaScript
Advanced JavaScript
 
Lecture 5 - Comm Lab: Web @ ITP
Lecture 5 - Comm Lab: Web @ ITPLecture 5 - Comm Lab: Web @ ITP
Lecture 5 - Comm Lab: Web @ ITP
 
Javascript Primer
Javascript PrimerJavascript Primer
Javascript Primer
 
Javascript Experiment
Javascript ExperimentJavascript Experiment
Javascript Experiment
 
Javascript: Ajax & DOM Manipulation v1.2
Javascript: Ajax & DOM Manipulation v1.2Javascript: Ajax & DOM Manipulation v1.2
Javascript: Ajax & DOM Manipulation v1.2
 
Ods Markup And Tagsets: A Tutorial
Ods Markup And Tagsets: A TutorialOds Markup And Tagsets: A Tutorial
Ods Markup And Tagsets: A Tutorial
 
jQuery Presentation - Refresh Events
jQuery Presentation - Refresh EventsjQuery Presentation - Refresh Events
jQuery Presentation - Refresh Events
 
Eugene Andruszczenko: jQuery
Eugene Andruszczenko: jQueryEugene Andruszczenko: jQuery
Eugene Andruszczenko: jQuery
 
SlideShare Instant
SlideShare InstantSlideShare Instant
SlideShare Instant
 
SlideShare Instant
SlideShare InstantSlideShare Instant
SlideShare Instant
 
"Javascript" por Tiago Rodrigues
"Javascript" por Tiago Rodrigues"Javascript" por Tiago Rodrigues
"Javascript" por Tiago Rodrigues
 
Goodparts
GoodpartsGoodparts
Goodparts
 
Migration testing framework
Migration testing frameworkMigration testing framework
Migration testing framework
 
Javascript Basic
Javascript BasicJavascript Basic
Javascript Basic
 
Introduction To Lamp
Introduction To LampIntroduction To Lamp
Introduction To Lamp
 
jQuery Performance Rules
jQuery Performance RulesjQuery Performance Rules
jQuery Performance Rules
 
Non Conventional Android Programming (English)
Non Conventional Android Programming (English)Non Conventional Android Programming (English)
Non Conventional Android Programming (English)
 

Dernier

"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii SoldatenkoFwdays
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLScyllaDB
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embeddingZilliz
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostZilliz
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piececharlottematthew16
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationRidwan Fadjar
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfAddepto
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 

Dernier (20)

"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko"Debugging python applications inside k8s environment", Andrii Soldatenko
"Debugging python applications inside k8s environment", Andrii Soldatenko
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Developer Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQLDeveloper Data Modeling Mistakes: From Postgres to NoSQL
Developer Data Modeling Mistakes: From Postgres to NoSQL
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
Training state-of-the-art general text embedding
Training state-of-the-art general text embeddingTraining state-of-the-art general text embedding
Training state-of-the-art general text embedding
 
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage CostLeverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
Leverage Zilliz Serverless - Up to 50X Saving for Your Vector Storage Cost
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Story boards and shot lists for my a level piece
Story boards and shot lists for my a level pieceStory boards and shot lists for my a level piece
Story boards and shot lists for my a level piece
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
My Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 PresentationMy Hashitalk Indonesia April 2024 Presentation
My Hashitalk Indonesia April 2024 Presentation
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 
Gen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdfGen AI in Business - Global Trends Report 2024.pdf
Gen AI in Business - Global Trends Report 2024.pdf
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 

JavaScript Needn't Hurt!

  • 1. JavaScript Needn’t Hurt! Thomas Kjeldahl Nilsson [email_address] linkedin.com/in/thomaskjeldahlnilsson twitter.com/thomanil
  • 3. Who Are You? Done any JavaScript? Dozen lines of code? Hundreds? Thousands?
  • 4. Who Am I? JavaScript enthusiast Hundreds of hours Thousands lines of code Not an expert!
  • 5. What Are We Covering Today? Language basics Html scripting Good practices Tools
  • 8.  
  • 11. A Note on ActionScript
  • 12. What Rocks? Powerful, elegant, dynamic Present & enabled for most users Not confined to the browser Small learning surface
  • 13. What Sucks? Rushed out the door Some bad language features Crossbrowser problems
  • 15. Language Basics Syntax Types Variables Objects Functions
  • 16. Basic Syntax Similar to Java, C# Operators, statements if-else, while, for, try-catch-finally Still in Kansas...
  • 17. Types Strings Numbers Booleans Objects Arrays
  • 18. Variable Declarations var x = “foo”; // string var x = 2; // number var x = true; // boolean var x = { }; // object var x = [ ]; // array
  • 20. Object Creation Literal Form var BasicProject = { name : &quot;Steria Workshop&quot;, version : 1.2, getName : function() { return this.name; } };
  • 21. Object Creation Dynamic Form var BasicProject = {}; BasicProject.name = &quot;Steria Workshop&quot;; BasicProject.version = 1.2; BasicProject.getName = function() { return this.name; };
  • 22. Objects as Maps (Associative Arrays) var Person = { firstname:&quot;John&quot;, lastname:&quot;Smith&quot; }; Person.firstname; // => &quot;John&quot; (Access using identifier) Person[&quot;firstname&quot;]; // => &quot;John&quot; (Access using variable name)
  • 23. Arrays are Special Case of Object var arr = []; // Always declared without size. // Grows as needed. arr[0] = true; arr[3] = &quot;john&quot;; arr[300] = { description : &quot;object!&quot; }; arr[100]; // => Undefined arr.length; // => 301
  • 24. Arrays and Objects Can Be Deeply Nested var OuterObject = { innerArray : [ innerObject : { deepestArray : [1,2,3] } ] };
  • 25. JSON {&quot;firstName&quot;:&quot;Gustav&quot;,&quot;lastName&quot;:&quot;Adolf&quot;, &quot;roles&quot;:[&quot;King of Sweden&quot;,&quot;Terrible shipbuilder&quot;], &quot;other&quot;:{&quot;birth&quot;:&quot;9.12.1594&quot;,&quot;death&quot;:&quot;16.11.1632&quot;}}
  • 26. Kind Familiar Looking { &quot;firstName&quot; : &quot;Gustav&quot;, &quot;lastName&quot; : &quot;Adolf&quot;, &quot;roles&quot; : [ &quot;King of Sweden&quot;, &quot;Terrible shipbuilder&quot; ], &quot;other&quot; : { &quot;birth&quot; : &quot;9.12.1594&quot;, &quot;death&quot; : &quot;16.11.1632&quot; } }
  • 27. JavaScript Object Literal! var EvaluatedObject = { firstName : &quot;Gustav&quot;, lastName : &quot;Adolf&quot;, roles : [ &quot;King of Sweden&quot;, &quot;Terrible shipbuilder&quot; ], other : { birth : &quot;9.12.1594&quot;, death : &quot;16.11.1632&quot; } } ;
  • 29. Prototypal Inheritance (Simplified) var Employee = {name : &quot;CEO Jack&quot;, company : &quot;ACME Inc.&quot;}; var Janitor = Object.create(Employee); // Janitor now looks and behaves just like its prototype, Employee Janitor.company // => &quot;ACME Inc.&quot;, falls back to prototype.company Janitor.name = &quot;Janitor Tim&quot;; // Override name Janitor.tools = [&quot;broom&quot;, &quot;bucket&quot;]; // Define member variable only on child Employee.name = &quot;CEO Jane&quot;; // Change name of prototype Janitor.name; // => Still &quot;Janitor Tim&quot;. Overriden members unaffected by prototype changes
  • 31. Simple Function Definition function add(a, b) { return a + b; }
  • 32. That's Just a Way of Saying: var add = function(a, b) { return a + b; }; // Use this consistently // Helps you remember: // Functions are just variables!
  • 33. An Anonymous Function... function(element) { // Do something with element }
  • 34. ...Can Be Sent To Another Function each(collection, function(element) { // Do something with current element });
  • 35. Example: Event Handler button.onClick(function(element) { alert(«You clicked me!»); });
  • 36. Sharp Edges Global variables No block s cope Semicolon insertion == operator
  • 37. Properly Scoped Variable var getSmallNumber = function(){ var smallNumber = 42; // Note use of var keyword return smallNumber; };
  • 38. Sloppy, Global Variable var getSmallNumber = function(){ smallNumber = 42; return smallNumber; }; // Missing var prefix = smallNumber gets global scope // Becomes available for all code // Sticks around and pollutes namespace
  • 39. No Block Scope var x = 1; if (true) { var x = 123; } // x => 123
  • 40. Semicolon insertion Don't force the browser to guess!
  • 41. Example a = b + c (d + e).print() becomes... a = b + c(d + e).print();
  • 43. Quiz '' == '0' // true or false? 0 == '' // true or false? 0 == '0' // true or false? false == 'false' // true or false? false == '0' // true or false? false == undefined // true or false? false == null // true or false? null == undefined // true or false? ' ' == 0 // true or false?
  • 44. How Many Did You Get? '' == '0' // false 0 == '' // true 0 == '0' // true false == 'false' // false false == '0' // true false == undefined // false false == null // false null == undefined // true ' ' == 0 // true // Why? Type coercion on right operand, that's why.
  • 45. Instead, Use === (And !==) '' === '0' // false 0 === '' // false 0 === '0' // false false === 'false' // false false === '0' // false false === undefined // false false === null // false null === undefined // false ' ' === 0 // false
  • 46. Advanced Stuff Closures Modules Memoization
  • 50.  
  • 51. <TABLE> <TBODY> <TR> <TD>Shady Grove</TD> <TD>Aeolian</TD> </TR> <TR> <TD>Over the River, Charlie</TD> <TD>Dorian</TD> </TR> </TBODY> </TABLE>
  • 52.  
  • 53. DOM Scripting Basics x.getElementById(id) ; // get the element with a specified id x.getElementsByTagName(name); // get all elements with a // specified tag name x.appendChild(node); // insert a child node to x x.removeChild(node), // remove a child node from x x.innerHTML = «<p>New text</p>»; // fill element with html or text
  • 55. DOM Api: Crossbrowser Headache http://www.quirksmode.org
  • 56. So Use a Framework!
  • 58. Instant Win: Crossbrowser Non-verbose Traverse DOM Manipulate DOM
  • 59. Lots of Other Stuff, Too Server communication UI widgets and effects each(), map(), etc JSON parsing +++
  • 60. jQuery Function $() // Short form jQuery() // Long form
  • 61. Find Stuff $(“p”); // Find all paragraphs $(“#shoppingList”); // Find element with id 'shoppingList' $(“.shoppingListItem”); // Find elements with class 'shoppingListItem' $(“:text”); // Find all text elements $(“:visible”); // Find only visible elements
  • 62. $() Wraps and Returns Matching Element(s)
  • 63. Manipulate Matched DOM Elements $(“p”).css(”color”, ”green”); // Set color on all paragraph elements $(“p”).hide(); // Hide all paragraphs // Make all input buttons react to mouse clicks $(“input”).click(function(){ alert(”You clicked this button!”); });
  • 64. Chaining Every API call returns jQuery object So we can chain function calls together “Fluent API”
  • 65. Chaining Example // Set color on all paragraph elements, then hide them all $(“p”).css(”color”, ”green”).hide();
  • 68. Caution! Use frameworks as needed But don't depend on them! JavaScript != jQuery
  • 69. Good Practices jsLint Automated testing Unobtrusive JavaScript
  • 72. Unobtrusive JavaScript Structure vs behavior Separate js files Event handler setup Namespaces Universal Access
  • 73.  
  • 74.  
  • 75.  
  • 76.  
  • 77.  
  • 78. Namespace Hygiene All your code within single object
  • 79. Universal Access Can all your users use your site? Users without JS? Blind users with screen readers? Use progressive enhancement
  • 80. Crossbrowser Dev Process Frameworks > raw DOM Test early, test often Clean, disciplined code
  • 83. What Did We Cover Today? Language basics Html scripting Good practices Tools
  • 84. What´s Missing? Server Communication Performance Security Practice practice practice!
  • 86.  
  • 87.  
  • 88. Web Resources http://javascript.crockford.com http://cjohansen.no/javascript http://developer.yahoo.com/yui/theater http://ajaxian.com
  • 89. Best Way to Learn: Start Building! http://ajaxian.com/archives/writing-a-javascript-tetris-lessons-learned-from-a-ruby-chap
  • 90. Download This Workshop http://kjeldahlnilsson.net/jsnh.zip Slides, lecture notes, exercises Creative Commons license Use and distribute freely... ...or have me present it for you on-site :)
  • 92. Contact Info [email_address] linkedin.com/in/thomaskjeldahlnilsson twitter.com/thomanil

Notes de l'éditeur

  1. First page
  2. First page