SlideShare uma empresa Scribd logo
1 de 46
JavaScript ,[object Object],Александр Мочёнов
Вопросы ,[object Object],[object Object],1
Я  не  буду говорить о ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],2
А лучше раскажу о ,[object Object],[object Object],[object Object],3
Факты и мысли ,[object Object],[object Object],[object Object],[object Object],[object Object],4
Литералы var   obj  = {object:  "literal" };  // === new Object(); var   str  =  "string literal" ;  // === new String(); var   arr  = [10, 20, 30];  // === new Array(); var   num  = 10;  // === new Number(); var   boo  =  true ;  // === new Boolean(); var   reg  =  /regexp literal/i ;  // === new RegExp(); var   fun  =  function (){ return   true ;}  // === new Function(); var   dat  =  new  Date(2010, 11, 30);  // no literal Object() String() Number() Boolean() ... etc 5
Объекты cat [ &quot;do&quot; ]( &quot;eat&quot; );  //do - is reserved word assert( cat .status ===  &quot;eating&quot; ); cat [ &quot;do&quot; ]( &quot;clean_wc&quot; ); >>> Uncaught #<an Object> var   cat  = { actions:{ sleep:  function (){  cat .status =  &quot;sleeping&quot; ; }, eat:  function (){ cat .status =  &quot;eating&quot; ; }, clean_wc:  function (){  cat .status =  &quot;cleaning wc&quot; ; } }, loves: [ &quot;sleep&quot; ,  &quot;eat&quot; ], &quot;do&quot; :  function ( action ){ if (  this .loves.has( action ) ){ this .actions[ action ](); } else { throw  {name: &quot;Cat Exception&quot; , message: &quot;Br-r-r!&quot; };  } } }; 6
for  ... in var   budget  = { beer : 1250, sandwich : 500, pizza: 670 }; var   sum  = 0; for (item  in   budget ){ if ( budget .hasOwnProperty(item)){ sum  +=  budget [item]; } } assert( sum  === 2420); 7
Функции обычные объекты ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],8
Функции - создание var   twiceTen  = getTwice(10);  //Can use it before declaration // - Function as Expression function   getTwice ( value ){ return   value  * 2; }; assert( twiceTen  === 20); // - Function as statement var   pub  =  function   priv ( param ){ //param, and priv are visible only here. }; pub(111);  //Can use it after declaration. 9
Анонимная функц. var   callme  =  function ( func ){ return  func();  //calling passed function }; var   res  = callme( function (){  //I am anonymous function return   &quot;Thank you&quot; ; }); assert( res  ==  &quot;Thank you&quot; ); 10
arguments var   argArr  =  function ( args ){ return  Array.prototype.slice.apply( args ); }; var   argSum  =  function (){ var   sum  = 0; var   argArray  = argArr(arguments); argArray .push(5); for ( var   i  = 0;  i  <  argArray .length;  i ++){ sum  +=  argArray [ i ]; } return   sum ; }; assert(argSum(1,2,3,4) === 15); 11
Вызов функции простой и метод function   simpleFunction (){ //this => global object return   &quot;simple value&quot; ; }; assert(simpleFunction() ===  &quot;simple value&quot; ); var   obj  = { value:  &quot;simple value&quot; , method:  function (){ //this => parent object return   this .value; } }; assert( obj .method() ===  &quot;simple value&quot; ); 12
Вызов функции псевдо-конструктор var   juice  =  function ( type ){ return  { make:  function (){ //this - parent object this .ready =  true ; }, drink:  function (){ if ( this .ready){ return   &quot;Drinking &quot; + type + &quot; juice!&quot; ; } } }; }; var   juice1  = juice( &quot;pineapple&quot; ); juice1 .make(); assert( juice1 .drink() ===  &quot;Drinking pineapple juice!&quot; ); 13
Вызов функции конструктор var   Jazz  =  function ( artist ){ //this - is newly created object (if &quot;new&quot; was used) this .music =  &quot;on&quot; ; this .play =  function (){ if ( this .music ===  &quot;on&quot; ){ return   artist  +  &quot; is playing&quot; ; } } return   undefined ;  //for demo only }; var   jazz  =  new   Jazz ( &quot;Louis Armstrong&quot; ); assert( jazz .play() ===  &quot;Louis Armstrong is playing&quot; ); 14
Вызов функции ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],15
Scope //No C style block scopes var   outside  = 10; for (;;){ var   inside  = 10; break ; } assert( outside  ===  inside ); //Global Scope is Bad, but necessary 16
Scope var   globalVar  = 10; function   one (){ var   innerVar  = 10; function   two (){ var   innerInnerVar  = 10; noVarVar = 10; assert( globalVar  ===  innerVar  &&    innerVar   ===  innerInnerVar ); } assert( globalVar  ===  innerVar ); //innerInnerVar - not in this scope two(); } one(); //Only global variables is in this scope assert( globalVar  === noVarVar); 17
(function(){})(); var   letters  = [ &quot;D&quot; , &quot;E&quot; , &quot;V&quot; , &quot;C&quot; , &quot;L&quot; , &quot;U&quot; , &quot;B&quot; ]; var   sayArr  = []; for ( var   i  = 0;  i  <  letters .length;  i ++){ sayArr .push( function (){ return   &quot;Say &quot;  + letter[ i ] +  &quot;!&quot; ; }); } for ( var   j  = 0;  j  <  sayArr .length;  j ++){ console.log( sayArr [ j ]()); } //Say undefined! //Say undefined! //Say undefined! //... 18
(function(){})(); var   letters  = [ &quot;D&quot; , &quot;E&quot; , &quot;V&quot; , &quot;C&quot; , &quot;L&quot; , &quot;U&quot; , &quot;B&quot; ]; var   sayArr  = []; for ( var   i  = 0;  i  <  letters .length;  i ++){ sayArr .push( function (){ return   &quot;Say &quot;  +  i  +  &quot;!&quot; ; }); } for ( var   j  = 0;  j  <  sayArr .length;  j ++){ console.log( sayArr [ j ]()); } //Say 7 //Say 7 //Say 7 //... 19
(function(){})(); var   letters  = [ &quot;D&quot; , &quot;E&quot; , &quot;V&quot; , &quot;C&quot; , &quot;L&quot; , &quot;U&quot; , &quot;B&quot; ]; var   sayArr  = []; for ( var   i  = 0;  i  <  letters .length;  i ++){ ( function ( k ){ sayArr .push( function (){ return   &quot;Say amp;quot;&quot;  +  letters [ k ] +  &quot;amp;quot; !&quot; ; }); })( i ); } for ( var   j  = 0;  j  <  sayArr .length;  j ++){ console.log( sayArr [ j ]()); } //Say &quot;D&quot; ! //Say &quot;E&quot; ! //Say &quot;V&quot; ! //... 20
(function(){})(); 22 var   letters  = [ &quot;D&quot; , &quot;E&quot; , &quot;V&quot; , &quot;C&quot; , &quot;L&quot; , &quot;U&quot; , &quot;B&quot; ]; var   sayArr  = []; for ( var   i  = 0;  i  <  letters .length;  i ++){ sayArr .push( ( function ( i ){ return   &quot;Say amp;quot;&quot;  +  letters [ i ] +  &quot;amp;quot; !&quot; ; })( i ) ); } for ( var   j  = 0;  j  <  sayArr .length;  j ++){ console.log( sayArr [ j ]()); }
(function(){})(); var   yourLib  = ( function (){ var   i  = 10; var   b  = 20; //your scoped code here function   innerLib ( c ){ return   c  +  i  +  b ; }; return  innerLib; })(); //i, b not visible here assert(yourLib(30) === 60); 23
Closure I’m gonna build my own amusement park. With ... var   RudeRobot  =  function (){ var   beerCans  = 0;  //Private variable this .drinkBeer =  function (){ beerCans ++; return   this ; }; }; var   bender  =  new   RudeRobot (); bender .drinkBeer().drinkBeer(); //Can't find out how many beers Bender drunk 24
Closure - guess number ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],25
Closure - fibonacci var   count  = 0; var   fibonacci  =  function   fib ( n ){ count ++; return   n  < 2 ?  n  : fib( n  - 1) + fib( n  - 2); }; for ( var   i  = 0;  i  <= 10;  i  += 1){ console.log( i  +  &quot; -> &quot;  + fibonacci( i )); } assert( count  === 453);  //453 calls 26
Closure - fibonacci var   count  = 0; var   fibonacci  = ( function (){ var   memo  = [0, 1]; var   fib  =  function  ( n ){ count ++; var   result  =  memo [ n ]; if  ( typeof  result !==  'number' ){ result  = fib( n  - 1) + fib( n  - 2); memo [ n ] =  result ; } return   result ; }; return   fib ; })(); for ( var   i  = 0;  i  <= 10;  i ++){ console.log( i  +  &quot; -> &quot;  + fibonacci( i )); } assert( count  === 29); 27
Curry - friends function   friends ( boy ,  girl ){ return   boy  +  &quot; and &quot;  +  girl  +  &quot; are friends.&quot; ; } var   boysFriends  =  function (){ var   thatArgs  = argArr(arguments); return   function (){ var   thisArgs  = argArr(arguments); return  friends.apply( null ,  thatArgs .concat( thisArgs )); }; }; var   johnsFriends  = boysFriends( &quot;John&quot; ); assert(johnsFriends( &quot;Jully&quot; ) ===  &quot;John and Jully are friends.&quot; ); assert(johnsFriends( &quot;Marta&quot; ) ===  &quot;John and Marta are friends.&quot; ); 28
Наследование ,[object Object],[object Object],[object Object],29
Prototype ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],30
Наследование ,[object Object],[object Object],[object Object],[object Object],31
Дополнения к примитивам Array.prototype.map =  function ( fn ){ for ( var   i  = 0,  size  =  this .length;  i  <  size ;  i ++){ this [ i ] =  fn .call( this [ i ],  i ,  this ); } return   this ; }; var   arr  = [1,2,3,4].map( function ( i ,  array ){ if ( this  % 2 == 0){ return   this  * 3; } return   this ; }); assert( arr  ==  &quot;1,6,3,12&quot; );  // == using for casting 32
Кэширование метода Function.prototype.cached =  function (){ var   _cache  = {}; var   fun  =  this ; return   function (){ var   args  = argArr(arguments); var   result  =  _cache [ args ]; if (! result ){ result  =  fun .apply( null ,  args ); _cache [ args ] =  result ; } return   result ; }; }; 33
Кэширование метода Function.prototype.cached =  function (){ ... var   count  = 0; var   fibo  =  function  ( n ){ count ++; return   n  < 2 ?  n  : fibo( n  - 1) + fibo( n  - 2); }.cached(); for ( var   i  = 0;  i  <= 10;  i  += 1){ console.log( i  +  &quot; -> &quot;  + fibo( i )); } assert( count  === 12); 34
Вкусненькое scope var var   APP  = { constants: { MAX_BUK: 10, MIN_BUK: 20 }, messages: {  hello_world:  &quot;Hello World&quot; , cancel:  &quot;Cancel&quot; }, sayHello:  function (){ return   this .messages.hello_world; } }; 35
Вкусненькое использование && и || в выр а жениях var   action  =  function (){ return   work  &&  work .doing &&  work .doing() ||  &quot;stay home&quot; ; }; assert(action() ===  &quot;stay home&quot; ); var   work  = { doing:  function (){  return   &quot;hard working&quot; ; } }; assert(action() ===  &quot;hard working&quot; ); 36
Вкусненькое falsy values if (0 || NaN ||  ''  ||  false  ||  null  ||  undefined ){ //All those values are falsy assert( false ); } else { //All other are truthy assert( true ); } 37
Вкусненькое evil twins  == и === assertFalse( ''  ==  '0' );  //false assertTrue(  0 ==  ''  );  //true assertTrue(  0 ==  '0' );  //true assertFalse( false  ==  'false' );  //false assertTrue(  false  == 0);  //true assertFalse( false  ==  undefined );  //false assertFalse( false  ==  null );    //false assertTrue(  null  ==  undefined );  //true assertTrue( ' '  == 0);   //true 38
Вкусненькое evil twins assertFalse( ''  ===  '0' ); assertFalse( 0 ===  ''  ); assertFalse( 0 ===  '0' ); assertFalse( false  ===  'false' ); assertFalse( false  === 0); assertFalse( false  ===  undefined ); assertFalse( false  ===  null ); assertFalse(  null  ===  undefined ); assertFalse( ' '  === 0); 39
Вкусненькое null, parseInt, IEEE 754, NaN //null var   nullable  =  null ; assert( typeof  nullable ===  'object' ); assert(nullable ===  null ); //pasreInt assert(parseInt( &quot;08&quot; ) === 0);  //Octal assert(parseInt( &quot;08&quot; , 10) === 8);  //Decimal //IEEE 754 assert(0.1 + 0.2 !== 0.3); //NaN var   notANum  = NaN; assert( typeof  notANum ===  'number' ); assert( notANum  !==  notANum ); assert(isNaN( notANum )); 40
Вкусненькое brackets style function   iLikeCStyleBrackets () { return { word: &quot;boo-gaga&quot; } } var   s  = iLikeCStyleBrackets(); //assert(s.word === &quot;boo-gaga&quot;); //Makes error assert( s  ===  undefined ); 41
Вкусненькое brackets style function   iLikeCStyleBrackets () { return ; { word: &quot;boo-gaga&quot; }; }; 42
Вкусненькое brackets style function   iUseGoodBrackets (){ return  { word: &quot;good boy&quot; }; }; var   s  = iUseGoodBrackets(); assert( s .word ===  &quot;good boy&quot; ); 43
Книги JavaScript:  The Good Parts JavaScript Ninja JavaScript:  The Definitive Guide Douglas Crockford John Resig David Flanagan
JavaScript  –  это клёва!
Спасибо! Александр Мочёнов [email_address]

Mais conteúdo relacionado

Mais procurados

Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17Sergey Platonov
 
Java script.trend(spec)
Java script.trend(spec)Java script.trend(spec)
Java script.trend(spec)dynamis
 
Ejercicios resueltos Practica 4 informatica II
Ejercicios resueltos Practica 4 informatica IIEjercicios resueltos Practica 4 informatica II
Ejercicios resueltos Practica 4 informatica IIAlvin Jacobs
 
Arrangement de la mémoire
Arrangement de la mémoireArrangement de la mémoire
Arrangement de la mémoireSalah Triki
 
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016Loïc Knuchel
 
Silex. Микрофреймворк для микроприложений
Silex. Микрофреймворк для микроприложенийSilex. Микрофреймворк для микроприложений
Silex. Микрофреймворк для микроприложенийSoftline
 
Practical JavaScript Programming - Session 3/8
Practical JavaScript Programming - Session 3/8Practical JavaScript Programming - Session 3/8
Practical JavaScript Programming - Session 3/8Wilson Su
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3Platonov Sergey
 
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習BopenFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習BAtsushi Tadokoro
 
JavaScript Virus Code Example
JavaScript Virus Code ExampleJavaScript Virus Code Example
JavaScript Virus Code ExampleMohd Sohaib
 
Barcamp
BarcampBarcamp
Barcamprenelc
 
Фатальный недостаток Node.js
Фатальный недостаток Node.jsФатальный недостаток Node.js
Фатальный недостаток Node.jsOleksii Okhrymenko
 
openFrameworks 外部ファイルを利用する - 画像、動画 - 多摩美メディアアートII
openFrameworks 外部ファイルを利用する - 画像、動画 - 多摩美メディアアートIIopenFrameworks 外部ファイルを利用する - 画像、動画 - 多摩美メディアアートII
openFrameworks 外部ファイルを利用する - 画像、動画 - 多摩美メディアアートIIAtsushi Tadokoro
 
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tipsOpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tipsHo Kim
 
openFrameworks 動きを生みだす様々なアルゴリズム - 多摩美メディアアートII
openFrameworks 動きを生みだす様々なアルゴリズム - 多摩美メディアアートIIopenFrameworks 動きを生みだす様々なアルゴリズム - 多摩美メディアアートII
openFrameworks 動きを生みだす様々なアルゴリズム - 多摩美メディアアートIIAtsushi Tadokoro
 

Mais procurados (20)

Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17
 
Java script.trend(spec)
Java script.trend(spec)Java script.trend(spec)
Java script.trend(spec)
 
Ejercicios resueltos Practica 4 informatica II
Ejercicios resueltos Practica 4 informatica IIEjercicios resueltos Practica 4 informatica II
Ejercicios resueltos Practica 4 informatica II
 
PHP Profiling
PHP ProfilingPHP Profiling
PHP Profiling
 
Arrangement de la mémoire
Arrangement de la mémoireArrangement de la mémoire
Arrangement de la mémoire
 
JavaScript Tips
JavaScript TipsJavaScript Tips
JavaScript Tips
 
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
Comprendre la programmation fonctionnelle, Blend Web Mix le 02/11/2016
 
Silex. Микрофреймворк для микроприложений
Silex. Микрофреймворк для микроприложенийSilex. Микрофреймворк для микроприложений
Silex. Микрофреймворк для микроприложений
 
Practical JavaScript Programming - Session 3/8
Practical JavaScript Programming - Session 3/8Practical JavaScript Programming - Session 3/8
Practical JavaScript Programming - Session 3/8
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習BopenFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
openFrameworks基礎 動きを生みだす、アニメーション入門 - 芸大グラフィックスプログラミング演習B
 
JavaScript Virus Code Example
JavaScript Virus Code ExampleJavaScript Virus Code Example
JavaScript Virus Code Example
 
Barcamp
BarcampBarcamp
Barcamp
 
Sbaw090929
Sbaw090929Sbaw090929
Sbaw090929
 
Фатальный недостаток Node.js
Фатальный недостаток Node.jsФатальный недостаток Node.js
Фатальный недостаток Node.js
 
openFrameworks 外部ファイルを利用する - 画像、動画 - 多摩美メディアアートII
openFrameworks 外部ファイルを利用する - 画像、動画 - 多摩美メディアアートIIopenFrameworks 外部ファイルを利用する - 画像、動画 - 多摩美メディアアートII
openFrameworks 外部ファイルを利用する - 画像、動画 - 多摩美メディアアートII
 
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tipsOpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
OpenResty/Lua 70+ Advanced Programming Skills and Optimization tips
 
Vcs21
Vcs21Vcs21
Vcs21
 
openFrameworks 動きを生みだす様々なアルゴリズム - 多摩美メディアアートII
openFrameworks 動きを生みだす様々なアルゴリズム - 多摩美メディアアートIIopenFrameworks 動きを生みだす様々なアルゴリズム - 多摩美メディアアートII
openFrameworks 動きを生みだす様々なアルゴリズム - 多摩美メディアアートII
 
Index2
Index2Index2
Index2
 

Destaque

Влад Иванищев. Про будущее
Влад Иванищев. Про будущееВлад Иванищев. Про будущее
Влад Иванищев. Про будущееAleksandr Motsjonov
 
Oracle External Tables
Oracle External TablesOracle External Tables
Oracle External Tablesgrogers1124
 
JS Libraries and jQuery Overview
JS Libraries and jQuery OverviewJS Libraries and jQuery Overview
JS Libraries and jQuery OverviewAleksandr Motsjonov
 
Юра Гуляев. Oracle tables
Юра Гуляев. Oracle tablesЮра Гуляев. Oracle tables
Юра Гуляев. Oracle tablesAleksandr Motsjonov
 
Clinical Data Repository vs. A Data Warehouse - Which Do You Need?
Clinical Data Repository vs. A Data Warehouse - Which Do You Need?Clinical Data Repository vs. A Data Warehouse - Which Do You Need?
Clinical Data Repository vs. A Data Warehouse - Which Do You Need?Health Catalyst
 
Oracle Database Overview
Oracle Database OverviewOracle Database Overview
Oracle Database Overviewhonglee71
 
Константин Третьяков. Machine Learning
Константин Третьяков. Machine LearningКонстантин Третьяков. Machine Learning
Константин Третьяков. Machine LearningAleksandr Motsjonov
 
Miramonte Floor Plans
Miramonte Floor PlansMiramonte Floor Plans
Miramonte Floor PlansJoey Levy
 
Produk Riset Bioperforasi ( Bag 2 Dari 3)
Produk  Riset  Bioperforasi ( Bag 2 Dari 3)Produk  Riset  Bioperforasi ( Bag 2 Dari 3)
Produk Riset Bioperforasi ( Bag 2 Dari 3)Bio Perforasi
 
事务传播级别探究
事务传播级别探究事务传播级别探究
事务传播级别探究liujianrong
 
Catedral de notre dame paris
Catedral de notre dame parisCatedral de notre dame paris
Catedral de notre dame parisDenizecomZ
 
HOWA/BA Julian Drault
HOWA/BA Julian DraultHOWA/BA Julian Drault
HOWA/BA Julian DraultJuan Damia
 
Portfolio Presentation
Portfolio PresentationPortfolio Presentation
Portfolio PresentationGSalcido
 

Destaque (20)

Влад Иванищев. Про будущее
Влад Иванищев. Про будущееВлад Иванищев. Про будущее
Влад Иванищев. Про будущее
 
Oracle External Tables
Oracle External TablesOracle External Tables
Oracle External Tables
 
Lisp'styled JavaScript
Lisp'styled JavaScriptLisp'styled JavaScript
Lisp'styled JavaScript
 
JS Libraries and jQuery Overview
JS Libraries and jQuery OverviewJS Libraries and jQuery Overview
JS Libraries and jQuery Overview
 
Юра Гуляев. Oracle tables
Юра Гуляев. Oracle tablesЮра Гуляев. Oracle tables
Юра Гуляев. Oracle tables
 
Oracle Essentials Oracle Database 11g
Oracle Essentials   Oracle Database 11gOracle Essentials   Oracle Database 11g
Oracle Essentials Oracle Database 11g
 
Clinical Data Repository vs. A Data Warehouse - Which Do You Need?
Clinical Data Repository vs. A Data Warehouse - Which Do You Need?Clinical Data Repository vs. A Data Warehouse - Which Do You Need?
Clinical Data Repository vs. A Data Warehouse - Which Do You Need?
 
Oracle Database Overview
Oracle Database OverviewOracle Database Overview
Oracle Database Overview
 
Константин Третьяков. Machine Learning
Константин Третьяков. Machine LearningКонстантин Третьяков. Machine Learning
Константин Третьяков. Machine Learning
 
Miramonte Floor Plans
Miramonte Floor PlansMiramonte Floor Plans
Miramonte Floor Plans
 
Washroom Assignment 4
Washroom Assignment 4Washroom Assignment 4
Washroom Assignment 4
 
Produk Riset Bioperforasi ( Bag 2 Dari 3)
Produk  Riset  Bioperforasi ( Bag 2 Dari 3)Produk  Riset  Bioperforasi ( Bag 2 Dari 3)
Produk Riset Bioperforasi ( Bag 2 Dari 3)
 
Iverson Resume 2016 Pro
Iverson Resume 2016 ProIverson Resume 2016 Pro
Iverson Resume 2016 Pro
 
Jt 1x1 2
Jt 1x1 2Jt 1x1 2
Jt 1x1 2
 
事务传播级别探究
事务传播级别探究事务传播级别探究
事务传播级别探究
 
Gfgfg Trslte
Gfgfg TrslteGfgfg Trslte
Gfgfg Trslte
 
Catedral de notre dame paris
Catedral de notre dame parisCatedral de notre dame paris
Catedral de notre dame paris
 
Ed intercult espan
Ed intercult espanEd intercult espan
Ed intercult espan
 
HOWA/BA Julian Drault
HOWA/BA Julian DraultHOWA/BA Julian Drault
HOWA/BA Julian Drault
 
Portfolio Presentation
Portfolio PresentationPortfolio Presentation
Portfolio Presentation
 

JavaScript

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6. Литералы var obj = {object: &quot;literal&quot; }; // === new Object(); var str = &quot;string literal&quot; ; // === new String(); var arr = [10, 20, 30]; // === new Array(); var num = 10; // === new Number(); var boo = true ; // === new Boolean(); var reg = /regexp literal/i ; // === new RegExp(); var fun = function (){ return true ;} // === new Function(); var dat = new Date(2010, 11, 30); // no literal Object() String() Number() Boolean() ... etc 5
  • 7. Объекты cat [ &quot;do&quot; ]( &quot;eat&quot; ); //do - is reserved word assert( cat .status === &quot;eating&quot; ); cat [ &quot;do&quot; ]( &quot;clean_wc&quot; ); >>> Uncaught #<an Object> var cat = { actions:{ sleep: function (){ cat .status = &quot;sleeping&quot; ; }, eat: function (){ cat .status = &quot;eating&quot; ; }, clean_wc: function (){ cat .status = &quot;cleaning wc&quot; ; } }, loves: [ &quot;sleep&quot; , &quot;eat&quot; ], &quot;do&quot; : function ( action ){ if ( this .loves.has( action ) ){ this .actions[ action ](); } else { throw {name: &quot;Cat Exception&quot; , message: &quot;Br-r-r!&quot; }; } } }; 6
  • 8. for ... in var budget = { beer : 1250, sandwich : 500, pizza: 670 }; var sum = 0; for (item in budget ){ if ( budget .hasOwnProperty(item)){ sum += budget [item]; } } assert( sum === 2420); 7
  • 9.
  • 10. Функции - создание var twiceTen = getTwice(10); //Can use it before declaration // - Function as Expression function getTwice ( value ){ return value * 2; }; assert( twiceTen === 20); // - Function as statement var pub = function priv ( param ){ //param, and priv are visible only here. }; pub(111); //Can use it after declaration. 9
  • 11. Анонимная функц. var callme = function ( func ){ return func(); //calling passed function }; var res = callme( function (){ //I am anonymous function return &quot;Thank you&quot; ; }); assert( res == &quot;Thank you&quot; ); 10
  • 12. arguments var argArr = function ( args ){ return Array.prototype.slice.apply( args ); }; var argSum = function (){ var sum = 0; var argArray = argArr(arguments); argArray .push(5); for ( var i = 0; i < argArray .length; i ++){ sum += argArray [ i ]; } return sum ; }; assert(argSum(1,2,3,4) === 15); 11
  • 13. Вызов функции простой и метод function simpleFunction (){ //this => global object return &quot;simple value&quot; ; }; assert(simpleFunction() === &quot;simple value&quot; ); var obj = { value: &quot;simple value&quot; , method: function (){ //this => parent object return this .value; } }; assert( obj .method() === &quot;simple value&quot; ); 12
  • 14. Вызов функции псевдо-конструктор var juice = function ( type ){ return { make: function (){ //this - parent object this .ready = true ; }, drink: function (){ if ( this .ready){ return &quot;Drinking &quot; + type + &quot; juice!&quot; ; } } }; }; var juice1 = juice( &quot;pineapple&quot; ); juice1 .make(); assert( juice1 .drink() === &quot;Drinking pineapple juice!&quot; ); 13
  • 15. Вызов функции конструктор var Jazz = function ( artist ){ //this - is newly created object (if &quot;new&quot; was used) this .music = &quot;on&quot; ; this .play = function (){ if ( this .music === &quot;on&quot; ){ return artist + &quot; is playing&quot; ; } } return undefined ; //for demo only }; var jazz = new Jazz ( &quot;Louis Armstrong&quot; ); assert( jazz .play() === &quot;Louis Armstrong is playing&quot; ); 14
  • 16.
  • 17. Scope //No C style block scopes var outside = 10; for (;;){ var inside = 10; break ; } assert( outside === inside ); //Global Scope is Bad, but necessary 16
  • 18. Scope var globalVar = 10; function one (){ var innerVar = 10; function two (){ var innerInnerVar = 10; noVarVar = 10; assert( globalVar === innerVar && innerVar === innerInnerVar ); } assert( globalVar === innerVar ); //innerInnerVar - not in this scope two(); } one(); //Only global variables is in this scope assert( globalVar === noVarVar); 17
  • 19. (function(){})(); var letters = [ &quot;D&quot; , &quot;E&quot; , &quot;V&quot; , &quot;C&quot; , &quot;L&quot; , &quot;U&quot; , &quot;B&quot; ]; var sayArr = []; for ( var i = 0; i < letters .length; i ++){ sayArr .push( function (){ return &quot;Say &quot; + letter[ i ] + &quot;!&quot; ; }); } for ( var j = 0; j < sayArr .length; j ++){ console.log( sayArr [ j ]()); } //Say undefined! //Say undefined! //Say undefined! //... 18
  • 20. (function(){})(); var letters = [ &quot;D&quot; , &quot;E&quot; , &quot;V&quot; , &quot;C&quot; , &quot;L&quot; , &quot;U&quot; , &quot;B&quot; ]; var sayArr = []; for ( var i = 0; i < letters .length; i ++){ sayArr .push( function (){ return &quot;Say &quot; + i + &quot;!&quot; ; }); } for ( var j = 0; j < sayArr .length; j ++){ console.log( sayArr [ j ]()); } //Say 7 //Say 7 //Say 7 //... 19
  • 21. (function(){})(); var letters = [ &quot;D&quot; , &quot;E&quot; , &quot;V&quot; , &quot;C&quot; , &quot;L&quot; , &quot;U&quot; , &quot;B&quot; ]; var sayArr = []; for ( var i = 0; i < letters .length; i ++){ ( function ( k ){ sayArr .push( function (){ return &quot;Say amp;quot;&quot; + letters [ k ] + &quot;amp;quot; !&quot; ; }); })( i ); } for ( var j = 0; j < sayArr .length; j ++){ console.log( sayArr [ j ]()); } //Say &quot;D&quot; ! //Say &quot;E&quot; ! //Say &quot;V&quot; ! //... 20
  • 22. (function(){})(); 22 var letters = [ &quot;D&quot; , &quot;E&quot; , &quot;V&quot; , &quot;C&quot; , &quot;L&quot; , &quot;U&quot; , &quot;B&quot; ]; var sayArr = []; for ( var i = 0; i < letters .length; i ++){ sayArr .push( ( function ( i ){ return &quot;Say amp;quot;&quot; + letters [ i ] + &quot;amp;quot; !&quot; ; })( i ) ); } for ( var j = 0; j < sayArr .length; j ++){ console.log( sayArr [ j ]()); }
  • 23. (function(){})(); var yourLib = ( function (){ var i = 10; var b = 20; //your scoped code here function innerLib ( c ){ return c + i + b ; }; return innerLib; })(); //i, b not visible here assert(yourLib(30) === 60); 23
  • 24. Closure I’m gonna build my own amusement park. With ... var RudeRobot = function (){ var beerCans = 0; //Private variable this .drinkBeer = function (){ beerCans ++; return this ; }; }; var bender = new RudeRobot (); bender .drinkBeer().drinkBeer(); //Can't find out how many beers Bender drunk 24
  • 25.
  • 26. Closure - fibonacci var count = 0; var fibonacci = function fib ( n ){ count ++; return n < 2 ? n : fib( n - 1) + fib( n - 2); }; for ( var i = 0; i <= 10; i += 1){ console.log( i + &quot; -> &quot; + fibonacci( i )); } assert( count === 453); //453 calls 26
  • 27. Closure - fibonacci var count = 0; var fibonacci = ( function (){ var memo = [0, 1]; var fib = function ( n ){ count ++; var result = memo [ n ]; if ( typeof result !== 'number' ){ result = fib( n - 1) + fib( n - 2); memo [ n ] = result ; } return result ; }; return fib ; })(); for ( var i = 0; i <= 10; i ++){ console.log( i + &quot; -> &quot; + fibonacci( i )); } assert( count === 29); 27
  • 28. Curry - friends function friends ( boy , girl ){ return boy + &quot; and &quot; + girl + &quot; are friends.&quot; ; } var boysFriends = function (){ var thatArgs = argArr(arguments); return function (){ var thisArgs = argArr(arguments); return friends.apply( null , thatArgs .concat( thisArgs )); }; }; var johnsFriends = boysFriends( &quot;John&quot; ); assert(johnsFriends( &quot;Jully&quot; ) === &quot;John and Jully are friends.&quot; ); assert(johnsFriends( &quot;Marta&quot; ) === &quot;John and Marta are friends.&quot; ); 28
  • 29.
  • 30.
  • 31.
  • 32. Дополнения к примитивам Array.prototype.map = function ( fn ){ for ( var i = 0, size = this .length; i < size ; i ++){ this [ i ] = fn .call( this [ i ], i , this ); } return this ; }; var arr = [1,2,3,4].map( function ( i , array ){ if ( this % 2 == 0){ return this * 3; } return this ; }); assert( arr == &quot;1,6,3,12&quot; ); // == using for casting 32
  • 33. Кэширование метода Function.prototype.cached = function (){ var _cache = {}; var fun = this ; return function (){ var args = argArr(arguments); var result = _cache [ args ]; if (! result ){ result = fun .apply( null , args ); _cache [ args ] = result ; } return result ; }; }; 33
  • 34. Кэширование метода Function.prototype.cached = function (){ ... var count = 0; var fibo = function ( n ){ count ++; return n < 2 ? n : fibo( n - 1) + fibo( n - 2); }.cached(); for ( var i = 0; i <= 10; i += 1){ console.log( i + &quot; -> &quot; + fibo( i )); } assert( count === 12); 34
  • 35. Вкусненькое scope var var APP = { constants: { MAX_BUK: 10, MIN_BUK: 20 }, messages: { hello_world: &quot;Hello World&quot; , cancel: &quot;Cancel&quot; }, sayHello: function (){ return this .messages.hello_world; } }; 35
  • 36. Вкусненькое использование && и || в выр а жениях var action = function (){ return work && work .doing && work .doing() || &quot;stay home&quot; ; }; assert(action() === &quot;stay home&quot; ); var work = { doing: function (){ return &quot;hard working&quot; ; } }; assert(action() === &quot;hard working&quot; ); 36
  • 37. Вкусненькое falsy values if (0 || NaN || '' || false || null || undefined ){ //All those values are falsy assert( false ); } else { //All other are truthy assert( true ); } 37
  • 38. Вкусненькое evil twins == и === assertFalse( '' == '0' ); //false assertTrue( 0 == '' ); //true assertTrue( 0 == '0' ); //true assertFalse( false == 'false' ); //false assertTrue( false == 0); //true assertFalse( false == undefined ); //false assertFalse( false == null ); //false assertTrue( null == undefined ); //true assertTrue( ' ' == 0); //true 38
  • 39. Вкусненькое evil twins assertFalse( '' === '0' ); assertFalse( 0 === '' ); assertFalse( 0 === '0' ); assertFalse( false === 'false' ); assertFalse( false === 0); assertFalse( false === undefined ); assertFalse( false === null ); assertFalse( null === undefined ); assertFalse( ' ' === 0); 39
  • 40. Вкусненькое null, parseInt, IEEE 754, NaN //null var nullable = null ; assert( typeof nullable === 'object' ); assert(nullable === null ); //pasreInt assert(parseInt( &quot;08&quot; ) === 0); //Octal assert(parseInt( &quot;08&quot; , 10) === 8); //Decimal //IEEE 754 assert(0.1 + 0.2 !== 0.3); //NaN var notANum = NaN; assert( typeof notANum === 'number' ); assert( notANum !== notANum ); assert(isNaN( notANum )); 40
  • 41. Вкусненькое brackets style function iLikeCStyleBrackets () { return { word: &quot;boo-gaga&quot; } } var s = iLikeCStyleBrackets(); //assert(s.word === &quot;boo-gaga&quot;); //Makes error assert( s === undefined ); 41
  • 42. Вкусненькое brackets style function iLikeCStyleBrackets () { return ; { word: &quot;boo-gaga&quot; }; }; 42
  • 43. Вкусненькое brackets style function iUseGoodBrackets (){ return { word: &quot;good boy&quot; }; }; var s = iUseGoodBrackets(); assert( s .word === &quot;good boy&quot; ); 43
  • 44. Книги JavaScript: The Good Parts JavaScript Ninja JavaScript: The Definitive Guide Douglas Crockford John Resig David Flanagan
  • 45. JavaScript – это клёва!

Notas do Editor

  1. Представиться. Будут номера – вопросы в конце. Вас ждёт куча примеров =)
  2. Моя задача сегодня сделать так, что бы и те и другие засамневались =)
  3. JavaScript – это очень обширная тема и за 45 минут обо всём не расскажешь. По-этому вот об этом я говорить НЕ буду. (Перечислить) И о многом другом
  4. вкусности
  5. Прежде всего – не путайте ЖС с Жавой. Между ними совершенно ничего общего, кроме названия и чем-то схожево синтаксиса!! ЖаваСкрипт – скорее Лисп в одежде Си. ДжаваСкрипт - Это прототипно-ореентированный язык с динамической типизацией. Прототипное наследование является фишкой, которой нету во многих других языках. ЖС – один из самых популярных языков программирования на земле. В то же время это один из самых ненавистных и непонятых языков =) Часто на ЖС клевещат не по делу, путая ЖС с ДОМ-ом, который реализована просто ужасно. Т.е. ЖС – является деФакто языком программирования в вебе, то у людей, знающих другие языки попросту нет права выбора, а по-этому часто и желания изучать ЖС, что ведёт к непониманию и нелюбви. =) Удивительная особенность ЖС заключается в том, что можно написать что-то работающее и нужное на ЖС без особых знаний самого языка, или даже программирования в целом.
  6. В языке есть несколько основных или примитивных типом. Все или почти все они приведены на экране. Все наследуются от прородителя Обжект, и все они могут быть созданы с помощью соответствующих конструкторов, но так делать НЕ НАДО! В каждом из случаев за исключением Даты необходимо использовать литералы.
  7. В ЖС практически всё является объектом, а он представляет из себя простой МАП, с ключами и значениями. Ключами может быть ЧТО угодно и значениями тоже. (Описать что на экране) (сказать о зарезервированных словах)
  8. Ключи можно итерировать вот таким образом. Как я скажу ещё раз позже объекты в ЖС могут наследовать свойства от других объектов. У любого объекта есть вот такой метод, который подтверждает что такой ключи есть у данного объекта.
  9. Функция – это обычный объект. Т.е. к самой функции можно прицепить какое-то свойство.
  10. Функцию можно создать несколькими способами. Обычный способ . Так называемый «выражение» при поможи литералов. При этом способе дикларации функция как бы всплывает в начало скоупа и её можно использовать до её появления в коде Второй способ. Так называемый «утверждение». Т.к. Это обычное присвоение к переменной, то использовать можно только после появления в коде. Можно назвать (прив) и присвоить к переменной (пуб), при этом (прив) будет видна только внутри метода.
  11. Функцию не обязательно называть. Тогда она является анонимной. В данном случае мы посылаем анонимную функцию (показать) в качестве аргумента. А потом её вызываем (показать).
  12. Внутри любой функции есть магическая переменная arguments, в которой .... Это Массиво-подобный объект, т.е. ... С помощью вот такой операции из него можно сделать обычный массиов. Этот метод делает сл. ...
  13. Внутри каждого метода есть ещё одна магическая переменная this – в зависимости от того как вы вызываете функцию, this ссылается на разные вещи. Вызывать функции можно так же несколькими способами: – обычный вызов (показать). Тут this – ссылается на глобальный объетк. (об этом позже) - если функция является свойством объекта, то это вызов функции как метода. this - ссылка на объект от которого вызывается метод.
  14. 3) Вызов как конструктор, но псевдо. Конструктор, потому что он на выходе выдает объект. Псевдо, потому-что это обычный объект.
  15. 4) Вызов метода как конструктор. Для этого при вызове надо добавить ключевое слово new и тогда эта функция возвращает новый объект, который создаёт сама функция. Внутри таких функций this ссылается на новый объект, который создат сама функция. (показать) Если эту функцию вызвать без new то случиться страшное. ... Для того, что бы этого не случалось есть конвеншн, по которому методы конструктуры начинаются с большой буквы.
  16. У каждой функции есть два метода apply и call. С помощью них можно вызвать сам метод послав им в качестве аргументов то, на что внутри самой функции будет ссылаться this , а так же можно заслать аргументы.
  17. ЖС не Си. Тут операторский скобки и различные блоки не делают нового скоупа. В ЖС скоуп создаёт метод! В ЖС есть понятие глобального скоупа, мало того, для написания в ЖС кода его необходимо использовать. Но делать это надо как можно реже. Далее будут показаны пару способов как это сделать. (Объяснить код)
  18. Для того, что бы задекларировать свойство внутри ближайшего скоупа надо использовать ключевое слово var (показать) . Если это опустить, то переменная уйдёт в глобальный скоуп.
  19. Объяснить код. И что я хочу что бы случилось. Но что-то не так.
  20. Заменим массив на индекс. И wtf – почему везде 7. Потому-что тут i является ссылкой на этот i . А к моменту вызова в этой переменной лежит 7. (т.к. Список пробежал) Как обойти?
  21. Использовать вот такую конструкцию. Т.е. Мы делаем анонимную функцию, и тут же её вызываем. Теперь уже и ссылается на аргумент этой функции. И всё работает.
  22. Эту конструкцию можно пихнуть даже в качестве аргумента в метод. В этом случае эта анонимная функция возвращает нашу функцию ,которая потом вернёт нужную нам фразу.
  23. Многие либы используют эту конструкцию что бы не засорять глобальный скоуп разными переменными. Т.е. Мы делаем анонимную функцию, пихаем в неё всё что нам нужно. Всё то, что создаёт саму либу – и на выходе выдаём объект в котором всё есть. Таким образом в глобальном скоупе лежит только один объект – наша либа.
  24. Кложеры. Когда функция имеет доступ к контексту в виде скоупа другой функции, в которой она была создана. В данном случае beerCons видна только внутри конструктора. Т.е. Метод drinkBeer находиться тоже внутри конструктора, он тоже видит эту переменную и может её использовать.
  25. Более интересный пример. Описать что делает программа.
  26. Классическая задача вычисления радов фибоначи. 453 вызова.
  27. С помощью такой конструкции можно сделать функцию вычисляющий рады фибоначи, но при этом у неё есть доступ к массиву внутри кложера, в который при каждов вызове мы кладём вычесленное значение, и если оно уже было вычислено – то возвращаем его. 29 вызовов.
  28. Карринг – популярная тема. Т.е. Мы может сделать функцию, которая является другой функцией, у которой уже определена часть аргументов.
  29. 1) 2) У каждого есть свойство protoype, которая ссылается на прорадителя.
  30. Описать код.
  31. Можно дополнять примитивные типа. Например так.
  32. Можно сделать вот такое вот переопределение. Которое я назвал кэшем. Эта конструкция делает нечто подобное, что я делал с фибоначи. Но! Это можно прицепить к любой функции. Например.
  33. Если применить это к тому же фибоначи, то получается даже 12 вызовов.
  34. Итак. А теперь на последок. Всякие вкусненькие мелочи. Тут мы видим некую переменную, в которой есть всё, что нам надо в нашей аппликации. Опять таки для того, что бы не засорять глобальный скоуп,
  35. В ЖС существуют два дьявольских близнеца в виде двух операторов сравнения. С помощью дьявольского брата == можно получить такие вот чудеса.
  36. С === всё так как надо. От сюда правило!!! Всегда используйте ===
  37. Особый тип нул Использование parseInt Сложение двух чисел с плавающей точкой Особая штука NaN
  38. Тут две проблемы – фугурные скобки и отсутствие точки с запятой. WTF – почему тут undefined.
  39. ЖС сам проставляет точки с запятой. И тогда всё становиться понятно.
  40. Ставте скобки ТАК! И ставте точку с запятой после определения функций
  41. В ЖС есть очно много плохих мест, которые надо знать в лицо и стараться избегать их, но так же в нём есть много такого, чего нет вдругих языках, чето-то такого, что делает его очень клёвым! =)