SlideShare a Scribd company logo
Effective JavaScript
         第1章

    @teppeis 2013/04/01
      サイボウズ社内勉強会
ファーストクラスの関数と、
オブジェクトプロトタイプという、
2つの大きな目標は別として、
そういう実現困難な要求と、
すさまじく加熱したスケジュールに対して、
僕が採用したソリューションは、
JavaScriptを最初から
極度に柔軟なものにしておくことだった。
           ∼ブレンダン・アイクによる序文∼ より
極度に
柔軟!
JavaScriptは言語でできる
ことをやりたい放題やるとチー
ム開発とか絶対無理だよ。
規律を持って開発しましょう。
=> Effective JavaScript!
余談
• 類書に『JavaScript: The Good
  Parts』というのがあってこれも良い
  本だけど、原理主義すぎて盲信すると
  副作用があります。いろいろ分かって
  から読むとニヤニヤできる。

• 『Effective JavaScript』の方は
  安心して参考にできるプラクティスを
  収録している印象です。
第1章
JavaScriptに慣れ親しむ
項目1
    どのJavaScriptを
使っているのかを意識しよう
JavaScriptの歴史
 • ECMAScirpt 3 <= IE8-
 • ECMAScript 4 <= 黒歴史
 • ECMAScript 5 <= モダンブラウザ
 • ECMAScript 6 <= 策定中
ES3とES5
• 実際使うときによく間違えるのが、
 Arrayのメソッドとか。
 ES3にはmapとかfilerとかないよ。

• ES5 compatibility tableで確認で
 きる。
 http://kangax.github.com/es5-compat-table/
strictモード

   function  hoge()  {
       "use  strict";
       //  something...
   }
strictモード
 • いろいろstrictになる。
 • 最近は割と常識になってきた。
 • 参考:
 •   Strict モード - JavaScript ¦ MDN
     https://developer.mozilla.org/ja/docs/JavaScript/Reference/Functions_and_function_scope/Strict_mode



 •   arguments.calleeがstrictモードで禁止な理由 - Togetter
     http://togetter.com/li/215907



 •   function - Why was the arguments.callee.caller
     property deprecated in JavaScript? - Stack Overflow
     http://stackoverflow.com/questions/103598/why-was-the-arguments-callee-caller-property-deprecated-in-javascript
ファイル連結に注意
   "use  strict";
   function  strictFunc()  {
       //  strict  code...
   }

   function  nonStrictFunc()  {
       //  non-­‐strict  code...
   }


• 連結したらどっちもstrict
 逆に連結したらどちらもnon-strict

• 即時関数で囲んで          use strict しよう
Closure的には?
• DEBUGモードではgoog.base()な
  どでarguments.callee使ってて
  strictモードでは動かない。

• gjslint, Closure Compilerでほと
  んど検出できるので、Closure世界で
  はstrictモードにしない。
項目2
JavaScriptの浮動小数点を
            理解しよう
number
• JSの数は倍精度浮動小数点数。
• JSにおける整数はダブルの部分集合。
• ビット演算は、数値を32ビット符号付
 き整数として扱う。 8  |  1  //  9

• 浮動小数点演算の精度に注意
項目3
暗黙の型変換に注意しよう
型変換
• 型エラーは暗黙の型強制で隠される
• +演算子は、引数の型によって、数の加
 算か文字列の連結のどちらかになる

  3  +  true  //  4
  "hoge:"  +  true  //  "hoge:true"
  (1  +  2)  +  "3"  //  "33"
  1  +  (2  +  "3")  //  "123"
NaN is not NaN
• isNaNは型強制してしまうので、
 数値型以外には使えない!
  var  str  =  "hoge";
  isNaN(str);  //  true!



• 「それ自身と等しくない」性質を使おう
  var  a  =  NaN;
  a  !==  a;  //  true!
未定義チェックは要注意
 function  do(num,  str)  {
     //  デフォルト値を設定するときによく見るコード
     //  このままだとnum  =  0やstr  =  ""を指定できない!
     num  =  num  ||  10;
     str  =  str  ||  "default  string";
     //  ...
 }


 //  正攻法
 if  (typeof  num  ===  'undefined')  {
     num  =  10;
 }
   
 //  null  or  undefinedのチェックはこれがオススメ
 if  (num  ==  null)  {
     num  =  10;
 }
Falsy value in JS
• false
• +0, -0
• (empty string)
• NaN
• null
• undefined

• 他はすべてtrueです。
項目4
オブジェクトラッパーよりも
  プリミティブが好ましい
プリミティブ型
• boolean
• number
• string
• null
• undefined
オブジェクトラッパー
• オブジェクトラッパーは、等値演算子
 (===)で比較されたときプリミティブ
 値と同じ振る舞いをしない。
  var  s  =  new  String('hello');
  typeof  s;  //  'object'  not  'string'
  s  ===  'hello';  //  false
  s  ==  'hello';  //  true

  var  s2  =  new  String('hello');
  s  ===  s2;  //  false
  s  ==  s2;  //  false
オブジェクトラッパー
• プリミティブのプロパティを取得ある
 いは設定すると、オブジェクトラッパ
 ーが暗黙のうちに作成される。

  "hello".toUpperCase();  //  "HELLO"
  "hello".hoge  =  1;
  "hello".hoge;  //  undefined
  (123).toString();  //  '123'
  123..toString();  //  '123'
項目5
型が異なるときに
  ==を使わない
==演算子
• ==演算子は、引数の型が異なるとき、
   分かりにくい暗黙の強制を適用される
"1.0e0"  ==  {valueOf:  function()  {return  true;}}
//  true  だけど、頭がいたくなる。。




• valueOfとかtoStringとかDateだ
   け違うとか、おおよそ人間には理解で
   きないルールが存在する。
   http://os0x.hatenablog.com/entry/20100916/1284650917
   http://d.hatena.ne.jp/sandai/20100916/p1
===演算子使おう
• ===演算子を使えば、比較に暗黙の強
 制が関わらないことを明示できる。

• 型の異なる値を比較するときは、
 明示的な型変換を自分で行うこと。
項目6
セミコロン挿入の限度を学ぼう
セミコロン;自動挿入ルール
• 厳密には結構むずい。
 a  =  b
 /hoge/i.test(str)
 //  a  =  b  /  hoge  /  i.test(str)
 //  自動挿入されないので正規表現が割り算に!



• returnのあとに改行しちゃいけないこ
 とだけは覚えておこう。
セミコロンの省略
• セミコロンの省略はするな(超意訳)
 省略したければCoffee使え。

• スクリプトを連結による意図しない
 セミコロン自動挿入に注意。

  //  先頭に;を置いて連結ミスを防ぐテクニック
  ;(function()  {
      //  ..
  })();
項目7
  文字列は16ビットの
    符号単位を並べた
シーケンスとして考えよう
文字列とUnicode
• JavaScriptの文字列は、Unicode
  の符号位置(code point)ではなく、
  16ビットの符号単位(code unit)

• code point が2^16未満のときは、
  普通に文字列操作できますが。
サロゲートペア
• code point が2^16以上のとき、
     1対の符号単位(サロゲートペア)で表現

 • サロゲートペアは length, charAt,
     charCodeAt や正規表現に影響する

//  " ":  U+20BB7
//  http://www.fileformat.info/info/unicode/char/20bb7/index.htm
" ".length;  //  2
" ".charCodeAt(0).toString(16);  //  "d842"
" ".charCodeAt(1).toString(16);  //  "dfb7"
サロゲートペア
• 文字列を扱うサードパーティライブラ
 リには要注意。

• 開発してるアプリがサロゲートペア対
 応するのか、対応してないならどんな
 挙動になるのか、気をつけましょう。
第1章 完

More Related Content

ODP
RSpecのここがすごい!
PPT
Start!! Ruby
PDF
Tottoruby 20130119
PDF
Tips for bash script
PPT
クラスのインスタンス変数について
PPT
値渡しと参照渡しの比較
PDF
Perl 6 Object-Oliented Programming
PPTX
本当のオブジェクト指向は可読性を上げる
RSpecのここがすごい!
Start!! Ruby
Tottoruby 20130119
Tips for bash script
クラスのインスタンス変数について
値渡しと参照渡しの比較
Perl 6 Object-Oliented Programming
本当のオブジェクト指向は可読性を上げる

Viewers also liked (17)

PDF
時を超えた JavaScript の道
KEY
goog.require()を手書きしていいのは小学生まで
PDF
Browser oh browser browser
PDF
templateとautoの型推論
PDF
Emcpp item31
PDF
Emcpp item41
PPTX
Emcpp0506
PDF
Effective Modern C++ 読書会 Item 35
PPTX
Effective Modern C++勉強会#4 Item 17, 18資料
PPTX
Effective modern c++ 5
PPTX
TypeScriptをオススメする理由
PDF
JavaScript Language Update 2016 (LLoT)
PDF
サイボウズの現在と未来
PDF
離れた場所でも最高のチームワークを実現する方法 ーサイボウズ開発チームのリモートワーク事例ー
PDF
Effective ES6
PDF
You Don't Know ES Modules
PDF
サイボウズのフロントエンド開発 現在とこれからの挑戦
時を超えた JavaScript の道
goog.require()を手書きしていいのは小学生まで
Browser oh browser browser
templateとautoの型推論
Emcpp item31
Emcpp item41
Emcpp0506
Effective Modern C++ 読書会 Item 35
Effective Modern C++勉強会#4 Item 17, 18資料
Effective modern c++ 5
TypeScriptをオススメする理由
JavaScript Language Update 2016 (LLoT)
サイボウズの現在と未来
離れた場所でも最高のチームワークを実現する方法 ーサイボウズ開発チームのリモートワーク事例ー
Effective ES6
You Don't Know ES Modules
サイボウズのフロントエンド開発 現在とこれからの挑戦
Ad

Similar to Effective JavaScript Ch.1 (20)

PDF
Kanazawa.js.Next
PDF
JavaScriptことはじめ
PDF
これからのJavaScriptー関数型プログラミングとECMAScript6
PDF
JavaScript.Next
PPTX
JavaScriptクイックスタート
PDF
JSer Class #1
PDF
JavaScriptの落とし穴
PPTX
Nds meetup8 lt
PDF
JavaScript入門
PDF
JavaScript基礎勉強会
PPTX
Java scriptの基礎
PDF
ECMAScript 6 Features(PDF 版)
PPTX
前期講座08
PDF
JavaScript (ECMAScript) 2013
PDF
Javascripでオブジェクト指向
PPT
[A 3]SSJSでも使える!Javascriptでオブジェクト指向プログラミング入門
PDF
そしてjsの基礎へ戻る#4
PDF
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 1 章
PDF
JavaScript 講習会 #1
PDF
traceur-compilerで ECMAScript6を体験
Kanazawa.js.Next
JavaScriptことはじめ
これからのJavaScriptー関数型プログラミングとECMAScript6
JavaScript.Next
JavaScriptクイックスタート
JSer Class #1
JavaScriptの落とし穴
Nds meetup8 lt
JavaScript入門
JavaScript基礎勉強会
Java scriptの基礎
ECMAScript 6 Features(PDF 版)
前期講座08
JavaScript (ECMAScript) 2013
Javascripでオブジェクト指向
[A 3]SSJSでも使える!Javascriptでオブジェクト指向プログラミング入門
そしてjsの基礎へ戻る#4
【Topotal輪読会】JavaScript で学ぶ関数型プログラミング 1 章
JavaScript 講習会 #1
traceur-compilerで ECMAScript6を体験
Ad

More from Teppei Sato (16)

PDF
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
PDF
サイボウズの給与交渉戦 - Boss Side -
PDF
Recent compat-table issues
PDF
kintoneがAWSで目指すDevOpsQAな開発
PDF
Automated Dependency Updates with Renovate
PDF
君はyarn.lockをコミットしているか?
PDF
サイボウズの開発を支えるKAIZEN文化
PDF
SPAと覚悟
PDF
Closure Compiler Updates for ES6
PDF
ES6 in Practice
PDF
Our wish to Flowtype
PDF
Flowtype Introduction
PDF
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
PDF
本当のClosure Compilerをお見せしますよ。
PDF
DockerがYAVAY!
PDF
JavaScript Unit Test Why? What? How?
Node.js Native ESM への道 〜最終章: Babel / TypeScript Modules との闘い〜
サイボウズの給与交渉戦 - Boss Side -
Recent compat-table issues
kintoneがAWSで目指すDevOpsQAな開発
Automated Dependency Updates with Renovate
君はyarn.lockをコミットしているか?
サイボウズの開発を支えるKAIZEN文化
SPAと覚悟
Closure Compiler Updates for ES6
ES6 in Practice
Our wish to Flowtype
Flowtype Introduction
Closure CompilerのES6対応 あるいはES6時代のAltJS生存戦略
本当のClosure Compilerをお見せしますよ。
DockerがYAVAY!
JavaScript Unit Test Why? What? How?

Effective JavaScript Ch.1