SlideShare a Scribd company logo
1 of 73
Download to read offline
#crazy-js Quiz
エムスリー株式会社 マルチデバイスチーム
星川貴樹 (@oboenikui)
2018/12/06 M3 Tech Meetup #5 #m3tech
自己紹介
- 星川 貴樹 (@oboenikui)
- 新卒2年目
- Androidエンジニア &
セキュリティエンジニア
2018/12/06 M3 Tech Meetup #5 #m3tech
#crazy-js?
- JavaScriptの一見おかしな挙動をするコードが自然と集ま
る社内のSlackチャンネル
- 業務内外で見つけた・考えたJSの変態コードが貼られます
- 過去に貼られたコードの中で質の良いものをクイズ形式で出
題します(いわゆるPuzzlerというやつです)
2018/12/06 M3 Tech Meetup #5 #m3tech
Q&A
Q. 全問正解したら何かもらえる?
A. 考えときます
Q. JS知らないんだけど💢
A. JS知ってても多分わからないので大丈夫👍
2018/12/06 M3 Tech Meetup #5 #m3tech
実行環境について
- strictモードではありません
- node.js v10.10.0のREPLモードの実行結果です
- console.log(...)は長ったらしいので、問題文中では
c.log(...)と書きます
Q1
2018/12/06 M3 Tech Meetup #5 #m3tech
Q. 実行結果は?
const getHoge = () => {hoge: 50};
c.log(getHoge().hoge);
50 が出力される 文法エラー
実行時例外 その他
2018/12/06 M3 Tech Meetup #5 #m3tech
A. 実行時例外
const getHoge = () => {hoge: 50};
c.log(getHoge().hoge);
> Uncaught TypeError: Cannot read
property 'hoge' of undefined
2018/12/06 M3 Tech Meetup #5 #m3tech
ラムダ式の右側の{}はBlockStatement
const getHoge = () => {hoge: 50};
BlockStatement
2018/12/06 M3 Tech Meetup #5 #m3tech
BlockStatementの中のhoge:はラベル
const getHoge = () => {hoge: 50};
LabeledStatement
2018/12/06 M3 Tech Meetup #5 #m3tech
ラベル文とは
loop: for (let i = 0; i < 5; i++) {
for (let j = 0; j < 3; j++) {
if (someState) {
break loop;
}
}
}
2018/12/06 M3 Tech Meetup #5 #m3tech
ブロックにしたくなければ括弧で括る
const getHoge = () => ({hoge: 50});
c.log(getHoge().hoge);
> 50
2018/12/06 M3 Tech Meetup #5 #m3tech
関連リンク
MDNのアロー式に関するドキュメント
https://developer.mozilla.org/ja/docs/Web/JavaScript
/Reference/arrow_functions#Returning_object_literals
2018/12/06 M3 Tech Meetup #5 #m3tech
教訓
MDNを読みましょう。
Q2
2018/12/06 M3 Tech Meetup #5 #m3tech
c.log(1000000000000000000000);
c.log(parseInt(1000000000000000000000));
c.log(1000000000000000000000|0);
Q. それぞれ何が出力されるでしょう?
1000000000000000000000 1e+21
1 その他
2018/12/06 M3 Tech Meetup #5 #m3tech
c.log(1000000000000000000000);
> 1e+21
c.log(parseInt(1000000000000000000000));
> 1
c.log(1000000000000000000000|0);
> -559939584
A. それぞれの出力↓↓
2018/12/06 M3 Tech Meetup #5 #m3tech
解説
1. JSでは、32bit整数の範囲を超えると自動的に64bit浮動
小数点数になる
浮動小数点数では丸め誤差・情報欠落が生じるので一見変な
ことがいろいろ起こる
2018/12/06 M3 Tech Meetup #5 #m3tech
境界値
ソース上の値 丸められた値
9007199254740993 9007199254740992
… …
~ 999999999999999803392 999999999999999700000
999999999999999803393
~ 999999999999999934463
999999999999999900000
999999999999999934464 ~ 1e+21
2018/12/06 M3 Tech Meetup #5 #m3tech
丸め誤差・情報欠落による一見変な挙動
9007199254740992 + 1 == 9007199254740992
> true
parseInt(1000000000000000000000)
> 1
(1000000000000000000000).toString()
> "1e+21"
parseInt("1e+21")
> 1
2018/12/06 M3 Tech Meetup #5 #m3tech
解説
3. ビット演算をすると32bit signed intになるためこうな
る。
シフト演算もほぼ全てで32bit signed intになるが、
>>>の場合のみ32bit unsigned intになる
2018/12/06 M3 Tech Meetup #5 #m3tech
教訓
仕様を理解して
書きましょう。
Q3
2018/12/06 M3 Tech Meetup #5 #m3tech
["512", "a", "0", "2", "3", "34"].map(parseInt)
> [512, NaN, 0, 2, 3, ??]
Q. ??には何が入るでしょう?
2018/12/06 M3 Tech Meetup #5 #m3tech
["512", "a", "0", "2", "3", "34"].map(parseInt)
> [512, NaN, 0, 2, 3, 17]
A. 17
※ @kusano_kさん提供
2018/12/06 M3 Tech Meetup #5 #m3tech
Array.prototype.mapの仕様
2018/12/06 M3 Tech Meetup #5 #m3tech
Array.prototype.mapの仕様
2018/12/06 M3 Tech Meetup #5 #m3tech
parseIntの仕様
2018/12/06 M3 Tech Meetup #5 #m3tech
parseIntの仕様
2018/12/06 M3 Tech Meetup #5 #m3tech
つまり……
["512", "a", "0", "2", "3", "34"].map(parseInt)
2018/12/06 M3 Tech Meetup #5 #m3tech
こう!
["512", "a", "0", "2", "3", "34"]
.map((value, idx) => parseInt(value, idx))
2018/12/06 M3 Tech Meetup #5 #m3tech
こう!
parseInt("512", 0) → parseInt("512") → 512
parseInt("a", 1) → NaN (1の場合何を入れてもNaN)
["512", "a", "0", "2", "3", "34"]
.map((value, idx) => parseInt(value, idx))
0 1 2 3 4 5
2018/12/06 M3 Tech Meetup #5 #m3tech
こう!
parseInt("0", 2) → 0 (2進法で0は10進法でも0)
parseInt("2", 3) → 2 (3進法で2は10進法でも2)
parseInt("3", 4) → 3 (4進法で3は10進法でも3)
["512", "a", "0", "2", "3", "34"]
.map((value, idx) => parseInt(value, idx))
0 1 2 3 4 5
2018/12/06 M3 Tech Meetup #5 #m3tech
こう!
parseInt("34", 5) → 17 (5進法で34は10進法で17)
["512", "a", "0", "2", "3", "34"]
.map((value, idx) => parseInt(value, idx))
0 1 2 3 4 5
2018/12/06 M3 Tech Meetup #5 #m3tech
教訓
引数の個数が異なるメソッドを
コールバックに用いるのは
避けましょう。
Q4
2018/12/06 M3 Tech Meetup #5 #m3tech
const fun = function() {
return function() { console.log("a") }
}
(function() {
c.log("b")
fun()
})()
Q. 何がどう出力されるでしょうか?
a, bの順 b, aの順
aだけ bだけ
2018/12/06 M3 Tech Meetup #5 #m3tech
const fun = function() {
return function() { c.log("a") }
}
(function() {
c.log("b")
fun()
})()
> a
A. aだけ
2018/12/06 M3 Tech Meetup #5 #m3tech
セミコロンがないので、1つの式になる
const fun = function() {
return function() { c.log("a") }
}
(function() {
c.log("b")
fun()
})()
CallExpression
2018/12/06 M3 Tech Meetup #5 #m3tech
セミコロンがないので、1つの式になる
const fun = function() {
return function() { c.log("a") }
}
(function() {
c.log("b")
fun()
})()
CallExpression
argument
2018/12/06 M3 Tech Meetup #5 #m3tech
つまり、こういうこと
const fun = function() {
return function() { c.log("a") }
}(argument)()
2018/12/06 M3 Tech Meetup #5 #m3tech
つまり、こういうこと
const fun = function() { c.log("a") }()
2018/12/06 M3 Tech Meetup #5 #m3tech
つまり、こういうこと
const fun = c.log("a")
2018/12/06 M3 Tech Meetup #5 #m3tech
const fun = function() {
return function() { c.log("a"); };
};
(function() {
c.log("b");
fun();
})();
> b
> a
セミコロンがあれば防げる
2018/12/06 M3 Tech Meetup #5 #m3tech
関連リンク
AST explorer
https://astexplorer.net/
2018/12/06 M3 Tech Meetup #5 #m3tech
教訓
セミコロンをつけましょう。
Q5
2018/12/06 M3 Tech Meetup #5 #m3tech
void + 1 + 1
Q5. 実行結果は?
1) 2 2) undefined
3) NaN 4) エラー
2018/12/06 M3 Tech Meetup #5 #m3tech
> void + 1 + 1
NaN
Q5. 実行結果は?
1) 2 2) undefined
3) NaN 4) エラー
2018/12/06 M3 Tech Meetup #5 #m3tech
解説
(void +1) + 1
↓
undefined + 1
↓
NaN
2018/12/06 M3 Tech Meetup #5 #m3tech
参考
演算子の優先順位
https://developer.mozilla.org/ja/docs/Web/JavaSc
ript/Reference/Operators/Operator_Precedence
2018/12/06 M3 Tech Meetup #5 #m3tech
教訓
結合則のドキュメント
見て実装してください。
Q6
2018/12/06 M3 Tech Meetup #5 #m3tech
typeof 1 + new String("str") instanceof String
Q6. 実行結果は?
1) 'number' 2) false
3) 'numbertrue' 4) 'boolean'
2018/12/06 M3 Tech Meetup #5 #m3tech
> typeof 1 + new String("str") instanceof String
false
Q6. 実行結果は?
1) 'number' 2) false
3) 'numbertrue' 4) 'boolean'
2018/12/06 M3 Tech Meetup #5 #m3tech
解説
演算子の優先順位
typeof > + > instanceof
2018/12/06 M3 Tech Meetup #5 #m3tech
解説
typeof 1 + new String("str") instanceof String
'number' + new String("str") instanceof String
'numberstr' instanceof String
false
2018/12/06 M3 Tech Meetup #5 #m3tech
教訓
そもそも誰も
こんな実装せんわ。
Q7
2018/12/06 M3 Tech Meetup #5 #m3tech
// A
let in = ['in']; for (in in in) c.log(in);
// B
let of = ['of']; for (of of of) c.log(of);
Q7. 実行できるのは?
1) A, B両方 2) Aのみ
3) Bのみ 4) どちらもできない
2018/12/06 M3 Tech Meetup #5 #m3tech
// A
> let in = ['in']; for (in in in) c.log(in);
SyntaxError: Unexpected token =
// B
> let of = ['of']; for (of of of) c.log(of);
of
Q7. 実行できるのは?
1) A, B両方 2) Aのみ
3) Bのみ 4) どちらもできない
2018/12/06 M3 Tech Meetup #5 #m3tech
解説
in は予約語
of は予約語ではない
2018/12/06 M3 Tech Meetup #5 #m3tech
教訓
予約語だろうが
予約語じゃなかろうが
変数名にofは使うな。
Q8
(最後だよ)
2018/12/06 M3 Tech Meetup #5 #m3tech
Q8. この中で実行できるものを全て選べ
// 1
({ true })
// 2
({ undefined })
// 3
({ null })
// 4
({ this })
// 5
({ function() {} })
// 6
({ for(;;) {} })
// 7
({ while(...some) {} })
2018/12/06 M3 Tech Meetup #5 #m3tech
Q8. この中で実行できるものを全て選べ
// 1
({ true })
// 2
({ undefined })
// 3
({ null })
// 4
({ this })
// 5
({ function() {} })
// 6
({ for(;;) {} })
// 7
({ while(...some) {} })
2018/12/06 M3 Tech Meetup #5 #m3tech
解説
Object Literal Shorthand Syntax
// properties
let foo = {
x: x,
y: y,
z: z,
};
// methods
let foo = {
a: function() {},
b: function() {}
};
2018/12/06 M3 Tech Meetup #5 #m3tech
解説
Object Literal Shorthand Syntax
// properties
let foo = { x, y, z };
// methods
let foo = {
a() {},
b() {}
};
2018/12/06 M3 Tech Meetup #5 #m3tech
解説
undefinedは変数(定数)扱い
その他は変数ではないので不可
// 1
({ true })
// 2
({ undefined })
// 3
({ null })
// 4
({ this })
2018/12/06 M3 Tech Meetup #5 #m3tech
解説
5はfunctionという名前の関数定義
7もwhileという名前の関数定義
(...someはrest parameters)
6は含まれてはいけないセミコロンが
あるのでエラー
// 5
({ function() {} })
// 6
({ for(;;) {} })
// 7
({ while(...some) {} })
2018/12/06 M3 Tech Meetup #5 #m3tech
解説
https://developer.mozilla.org/ja/docs/Web/JavaSc
ript/Reference/Operators/Object_initializer
2018/12/06 M3 Tech Meetup #5 #m3tech
教訓
ES2015の
オブジェクト初期化子を
知ってあげて。
2018/12/06 M3 Tech Meetup #5 #m3tech
よくある質問
Q. どうやって見つけてるの?
A. ショートコーディングしてて気づいたり、新機能を知る時に
いろいろやったり

More Related Content

Similar to #crazy-js Quiz

第6回 社内プログラミングコンテスト 結果発表会 量子リバーシ
第6回 社内プログラミングコンテスト 結果発表会 量子リバーシ第6回 社内プログラミングコンテスト 結果発表会 量子リバーシ
第6回 社内プログラミングコンテスト 結果発表会 量子リバーシFixstars Corporation
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 Hiroshi Ito
 
MySQLerの7つ道具
MySQLerの7つ道具MySQLerの7つ道具
MySQLerの7つ道具yoku0825
 
2017年3月版データマエショリスト入門(誤植修正版)
2017年3月版データマエショリスト入門(誤植修正版)2017年3月版データマエショリスト入門(誤植修正版)
2017年3月版データマエショリスト入門(誤植修正版)Yuya Matsumura
 
Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7Sea Mountain
 
クラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccampクラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccampMasahiro NAKAYAMA
 
G検定傾向と対策_pythonguild#3LT
G検定傾向と対策_pythonguild#3LTG検定傾向と対策_pythonguild#3LT
G検定傾向と対策_pythonguild#3LTHide Fukano
 
ゲームとモデル検査ワークショップ#1
ゲームとモデル検査ワークショップ#1ゲームとモデル検査ワークショップ#1
ゲームとモデル検査ワークショップ#1Masaru Nagaku
 
Rancher と GitLab を使う3つの理由
Rancher と GitLab を使う3つの理由Rancher と GitLab を使う3つの理由
Rancher と GitLab を使う3つの理由Tetsurou Yano
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0Yuta Matsumura
 
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
SageMaker Neoの可能性について- 第3回 Amazon SageMaker 事例祭り+体験ハンズオンSageMaker Neoの可能性について- 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオンtomohiro kato
 
2017年3月版データマエショリスト入門
2017年3月版データマエショリスト入門2017年3月版データマエショリスト入門
2017年3月版データマエショリスト入門Yuya Matsumura
 
D3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーションD3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーションKohei Kadowaki
 
第8回 社内プログラミングコンテスト 結果発表会
第8回社内プログラミングコンテスト 結果発表会第8回社内プログラミングコンテスト 結果発表会
第8回 社内プログラミングコンテスト 結果発表会Fixstars Corporation
 
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
(beta)アプリを成長させるためのログ取りとログ解析に必要なことTakao Sumitomo
 
スケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考えるスケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考えるYusaku Watanabe
 
Pact言語によるセキュアなスマートコントラクト開発
Pact言語によるセキュアなスマートコントラクト開発Pact言語によるセキュアなスマートコントラクト開発
Pact言語によるセキュアなスマートコントラクト開発Nagato Kasaki
 
4 Colors Othello’s Algorithm
4 Colors Othello’s Algorithm4 Colors Othello’s Algorithm
4 Colors Othello’s AlgorithmTakaaki Suzuki
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„和弘 井之上
 
アプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことアプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことTakao Sumitomo
 

Similar to #crazy-js Quiz (20)

第6回 社内プログラミングコンテスト 結果発表会 量子リバーシ
第6回 社内プログラミングコンテスト 結果発表会 量子リバーシ第6回 社内プログラミングコンテスト 結果発表会 量子リバーシ
第6回 社内プログラミングコンテスト 結果発表会 量子リバーシ
 
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3 データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
 
MySQLerの7つ道具
MySQLerの7つ道具MySQLerの7つ道具
MySQLerの7つ道具
 
2017年3月版データマエショリスト入門(誤植修正版)
2017年3月版データマエショリスト入門(誤植修正版)2017年3月版データマエショリスト入門(誤植修正版)
2017年3月版データマエショリスト入門(誤植修正版)
 
Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7Ruby on Rails Tutorial Chapter5-7
Ruby on Rails Tutorial Chapter5-7
 
クラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccampクラウドではじめるリアルタイムデータ分析 #seccamp
クラウドではじめるリアルタイムデータ分析 #seccamp
 
G検定傾向と対策_pythonguild#3LT
G検定傾向と対策_pythonguild#3LTG検定傾向と対策_pythonguild#3LT
G検定傾向と対策_pythonguild#3LT
 
ゲームとモデル検査ワークショップ#1
ゲームとモデル検査ワークショップ#1ゲームとモデル検査ワークショップ#1
ゲームとモデル検査ワークショップ#1
 
Rancher と GitLab を使う3つの理由
Rancher と GitLab を使う3つの理由Rancher と GitLab を使う3つの理由
Rancher と GitLab を使う3つの理由
 
復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0復習も兼ねて!C#6.0-7.0
復習も兼ねて!C#6.0-7.0
 
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
SageMaker Neoの可能性について- 第3回 Amazon SageMaker 事例祭り+体験ハンズオンSageMaker Neoの可能性について- 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
SageMaker Neoの可能性について - 第3回 Amazon SageMaker 事例祭り+体験ハンズオン
 
2017年3月版データマエショリスト入門
2017年3月版データマエショリスト入門2017年3月版データマエショリスト入門
2017年3月版データマエショリスト入門
 
D3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーションD3.js と SVG によるデータビジュアライゼーション
D3.js と SVG によるデータビジュアライゼーション
 
第8回 社内プログラミングコンテスト 結果発表会
第8回社内プログラミングコンテスト 結果発表会第8回社内プログラミングコンテスト 結果発表会
第8回 社内プログラミングコンテスト 結果発表会
 
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
(beta)アプリを成長させるためのログ取りとログ解析に必要なこと
 
スケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考えるスケーラブルなアプリケーション開発を考える
スケーラブルなアプリケーション開発を考える
 
Pact言語によるセキュアなスマートコントラクト開発
Pact言語によるセキュアなスマートコントラクト開発Pact言語によるセキュアなスマートコントラクト開発
Pact言語によるセキュアなスマートコントラクト開発
 
4 Colors Othello’s Algorithm
4 Colors Othello’s Algorithm4 Colors Othello’s Algorithm
4 Colors Othello’s Algorithm
 
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第5回 ‟配列と構造体„
 
アプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なことアプリを成長させるためのログ取りとログ解析に必要なこと
アプリを成長させるためのログ取りとログ解析に必要なこと
 

#crazy-js Quiz

  • 2. 2018/12/06 M3 Tech Meetup #5 #m3tech 自己紹介 - 星川 貴樹 (@oboenikui) - 新卒2年目 - Androidエンジニア & セキュリティエンジニア
  • 3. 2018/12/06 M3 Tech Meetup #5 #m3tech #crazy-js? - JavaScriptの一見おかしな挙動をするコードが自然と集ま る社内のSlackチャンネル - 業務内外で見つけた・考えたJSの変態コードが貼られます - 過去に貼られたコードの中で質の良いものをクイズ形式で出 題します(いわゆるPuzzlerというやつです)
  • 4. 2018/12/06 M3 Tech Meetup #5 #m3tech Q&A Q. 全問正解したら何かもらえる? A. 考えときます Q. JS知らないんだけど💢 A. JS知ってても多分わからないので大丈夫👍
  • 5. 2018/12/06 M3 Tech Meetup #5 #m3tech 実行環境について - strictモードではありません - node.js v10.10.0のREPLモードの実行結果です - console.log(...)は長ったらしいので、問題文中では c.log(...)と書きます
  • 6. Q1
  • 7. 2018/12/06 M3 Tech Meetup #5 #m3tech Q. 実行結果は? const getHoge = () => {hoge: 50}; c.log(getHoge().hoge); 50 が出力される 文法エラー 実行時例外 その他
  • 8. 2018/12/06 M3 Tech Meetup #5 #m3tech A. 実行時例外 const getHoge = () => {hoge: 50}; c.log(getHoge().hoge); > Uncaught TypeError: Cannot read property 'hoge' of undefined
  • 9. 2018/12/06 M3 Tech Meetup #5 #m3tech ラムダ式の右側の{}はBlockStatement const getHoge = () => {hoge: 50}; BlockStatement
  • 10. 2018/12/06 M3 Tech Meetup #5 #m3tech BlockStatementの中のhoge:はラベル const getHoge = () => {hoge: 50}; LabeledStatement
  • 11. 2018/12/06 M3 Tech Meetup #5 #m3tech ラベル文とは loop: for (let i = 0; i < 5; i++) { for (let j = 0; j < 3; j++) { if (someState) { break loop; } } }
  • 12. 2018/12/06 M3 Tech Meetup #5 #m3tech ブロックにしたくなければ括弧で括る const getHoge = () => ({hoge: 50}); c.log(getHoge().hoge); > 50
  • 13. 2018/12/06 M3 Tech Meetup #5 #m3tech 関連リンク MDNのアロー式に関するドキュメント https://developer.mozilla.org/ja/docs/Web/JavaScript /Reference/arrow_functions#Returning_object_literals
  • 14. 2018/12/06 M3 Tech Meetup #5 #m3tech 教訓 MDNを読みましょう。
  • 15. Q2
  • 16. 2018/12/06 M3 Tech Meetup #5 #m3tech c.log(1000000000000000000000); c.log(parseInt(1000000000000000000000)); c.log(1000000000000000000000|0); Q. それぞれ何が出力されるでしょう? 1000000000000000000000 1e+21 1 その他
  • 17. 2018/12/06 M3 Tech Meetup #5 #m3tech c.log(1000000000000000000000); > 1e+21 c.log(parseInt(1000000000000000000000)); > 1 c.log(1000000000000000000000|0); > -559939584 A. それぞれの出力↓↓
  • 18. 2018/12/06 M3 Tech Meetup #5 #m3tech 解説 1. JSでは、32bit整数の範囲を超えると自動的に64bit浮動 小数点数になる 浮動小数点数では丸め誤差・情報欠落が生じるので一見変な ことがいろいろ起こる
  • 19. 2018/12/06 M3 Tech Meetup #5 #m3tech 境界値 ソース上の値 丸められた値 9007199254740993 9007199254740992 … … ~ 999999999999999803392 999999999999999700000 999999999999999803393 ~ 999999999999999934463 999999999999999900000 999999999999999934464 ~ 1e+21
  • 20. 2018/12/06 M3 Tech Meetup #5 #m3tech 丸め誤差・情報欠落による一見変な挙動 9007199254740992 + 1 == 9007199254740992 > true parseInt(1000000000000000000000) > 1 (1000000000000000000000).toString() > "1e+21" parseInt("1e+21") > 1
  • 21. 2018/12/06 M3 Tech Meetup #5 #m3tech 解説 3. ビット演算をすると32bit signed intになるためこうな る。 シフト演算もほぼ全てで32bit signed intになるが、 >>>の場合のみ32bit unsigned intになる
  • 22. 2018/12/06 M3 Tech Meetup #5 #m3tech 教訓 仕様を理解して 書きましょう。
  • 23. Q3
  • 24. 2018/12/06 M3 Tech Meetup #5 #m3tech ["512", "a", "0", "2", "3", "34"].map(parseInt) > [512, NaN, 0, 2, 3, ??] Q. ??には何が入るでしょう?
  • 25. 2018/12/06 M3 Tech Meetup #5 #m3tech ["512", "a", "0", "2", "3", "34"].map(parseInt) > [512, NaN, 0, 2, 3, 17] A. 17 ※ @kusano_kさん提供
  • 26. 2018/12/06 M3 Tech Meetup #5 #m3tech Array.prototype.mapの仕様
  • 27. 2018/12/06 M3 Tech Meetup #5 #m3tech Array.prototype.mapの仕様
  • 28. 2018/12/06 M3 Tech Meetup #5 #m3tech parseIntの仕様
  • 29. 2018/12/06 M3 Tech Meetup #5 #m3tech parseIntの仕様
  • 30. 2018/12/06 M3 Tech Meetup #5 #m3tech つまり…… ["512", "a", "0", "2", "3", "34"].map(parseInt)
  • 31. 2018/12/06 M3 Tech Meetup #5 #m3tech こう! ["512", "a", "0", "2", "3", "34"] .map((value, idx) => parseInt(value, idx))
  • 32. 2018/12/06 M3 Tech Meetup #5 #m3tech こう! parseInt("512", 0) → parseInt("512") → 512 parseInt("a", 1) → NaN (1の場合何を入れてもNaN) ["512", "a", "0", "2", "3", "34"] .map((value, idx) => parseInt(value, idx)) 0 1 2 3 4 5
  • 33. 2018/12/06 M3 Tech Meetup #5 #m3tech こう! parseInt("0", 2) → 0 (2進法で0は10進法でも0) parseInt("2", 3) → 2 (3進法で2は10進法でも2) parseInt("3", 4) → 3 (4進法で3は10進法でも3) ["512", "a", "0", "2", "3", "34"] .map((value, idx) => parseInt(value, idx)) 0 1 2 3 4 5
  • 34. 2018/12/06 M3 Tech Meetup #5 #m3tech こう! parseInt("34", 5) → 17 (5進法で34は10進法で17) ["512", "a", "0", "2", "3", "34"] .map((value, idx) => parseInt(value, idx)) 0 1 2 3 4 5
  • 35. 2018/12/06 M3 Tech Meetup #5 #m3tech 教訓 引数の個数が異なるメソッドを コールバックに用いるのは 避けましょう。
  • 36. Q4
  • 37. 2018/12/06 M3 Tech Meetup #5 #m3tech const fun = function() { return function() { console.log("a") } } (function() { c.log("b") fun() })() Q. 何がどう出力されるでしょうか? a, bの順 b, aの順 aだけ bだけ
  • 38. 2018/12/06 M3 Tech Meetup #5 #m3tech const fun = function() { return function() { c.log("a") } } (function() { c.log("b") fun() })() > a A. aだけ
  • 39. 2018/12/06 M3 Tech Meetup #5 #m3tech セミコロンがないので、1つの式になる const fun = function() { return function() { c.log("a") } } (function() { c.log("b") fun() })() CallExpression
  • 40. 2018/12/06 M3 Tech Meetup #5 #m3tech セミコロンがないので、1つの式になる const fun = function() { return function() { c.log("a") } } (function() { c.log("b") fun() })() CallExpression argument
  • 41. 2018/12/06 M3 Tech Meetup #5 #m3tech つまり、こういうこと const fun = function() { return function() { c.log("a") } }(argument)()
  • 42. 2018/12/06 M3 Tech Meetup #5 #m3tech つまり、こういうこと const fun = function() { c.log("a") }()
  • 43. 2018/12/06 M3 Tech Meetup #5 #m3tech つまり、こういうこと const fun = c.log("a")
  • 44. 2018/12/06 M3 Tech Meetup #5 #m3tech const fun = function() { return function() { c.log("a"); }; }; (function() { c.log("b"); fun(); })(); > b > a セミコロンがあれば防げる
  • 45. 2018/12/06 M3 Tech Meetup #5 #m3tech 関連リンク AST explorer https://astexplorer.net/
  • 46. 2018/12/06 M3 Tech Meetup #5 #m3tech 教訓 セミコロンをつけましょう。
  • 47. Q5
  • 48. 2018/12/06 M3 Tech Meetup #5 #m3tech void + 1 + 1 Q5. 実行結果は? 1) 2 2) undefined 3) NaN 4) エラー
  • 49. 2018/12/06 M3 Tech Meetup #5 #m3tech > void + 1 + 1 NaN Q5. 実行結果は? 1) 2 2) undefined 3) NaN 4) エラー
  • 50. 2018/12/06 M3 Tech Meetup #5 #m3tech 解説 (void +1) + 1 ↓ undefined + 1 ↓ NaN
  • 51. 2018/12/06 M3 Tech Meetup #5 #m3tech 参考 演算子の優先順位 https://developer.mozilla.org/ja/docs/Web/JavaSc ript/Reference/Operators/Operator_Precedence
  • 52. 2018/12/06 M3 Tech Meetup #5 #m3tech 教訓 結合則のドキュメント 見て実装してください。
  • 53. Q6
  • 54. 2018/12/06 M3 Tech Meetup #5 #m3tech typeof 1 + new String("str") instanceof String Q6. 実行結果は? 1) 'number' 2) false 3) 'numbertrue' 4) 'boolean'
  • 55. 2018/12/06 M3 Tech Meetup #5 #m3tech > typeof 1 + new String("str") instanceof String false Q6. 実行結果は? 1) 'number' 2) false 3) 'numbertrue' 4) 'boolean'
  • 56. 2018/12/06 M3 Tech Meetup #5 #m3tech 解説 演算子の優先順位 typeof > + > instanceof
  • 57. 2018/12/06 M3 Tech Meetup #5 #m3tech 解説 typeof 1 + new String("str") instanceof String 'number' + new String("str") instanceof String 'numberstr' instanceof String false
  • 58. 2018/12/06 M3 Tech Meetup #5 #m3tech 教訓 そもそも誰も こんな実装せんわ。
  • 59. Q7
  • 60. 2018/12/06 M3 Tech Meetup #5 #m3tech // A let in = ['in']; for (in in in) c.log(in); // B let of = ['of']; for (of of of) c.log(of); Q7. 実行できるのは? 1) A, B両方 2) Aのみ 3) Bのみ 4) どちらもできない
  • 61. 2018/12/06 M3 Tech Meetup #5 #m3tech // A > let in = ['in']; for (in in in) c.log(in); SyntaxError: Unexpected token = // B > let of = ['of']; for (of of of) c.log(of); of Q7. 実行できるのは? 1) A, B両方 2) Aのみ 3) Bのみ 4) どちらもできない
  • 62. 2018/12/06 M3 Tech Meetup #5 #m3tech 解説 in は予約語 of は予約語ではない
  • 63. 2018/12/06 M3 Tech Meetup #5 #m3tech 教訓 予約語だろうが 予約語じゃなかろうが 変数名にofは使うな。
  • 65. 2018/12/06 M3 Tech Meetup #5 #m3tech Q8. この中で実行できるものを全て選べ // 1 ({ true }) // 2 ({ undefined }) // 3 ({ null }) // 4 ({ this }) // 5 ({ function() {} }) // 6 ({ for(;;) {} }) // 7 ({ while(...some) {} })
  • 66. 2018/12/06 M3 Tech Meetup #5 #m3tech Q8. この中で実行できるものを全て選べ // 1 ({ true }) // 2 ({ undefined }) // 3 ({ null }) // 4 ({ this }) // 5 ({ function() {} }) // 6 ({ for(;;) {} }) // 7 ({ while(...some) {} })
  • 67. 2018/12/06 M3 Tech Meetup #5 #m3tech 解説 Object Literal Shorthand Syntax // properties let foo = { x: x, y: y, z: z, }; // methods let foo = { a: function() {}, b: function() {} };
  • 68. 2018/12/06 M3 Tech Meetup #5 #m3tech 解説 Object Literal Shorthand Syntax // properties let foo = { x, y, z }; // methods let foo = { a() {}, b() {} };
  • 69. 2018/12/06 M3 Tech Meetup #5 #m3tech 解説 undefinedは変数(定数)扱い その他は変数ではないので不可 // 1 ({ true }) // 2 ({ undefined }) // 3 ({ null }) // 4 ({ this })
  • 70. 2018/12/06 M3 Tech Meetup #5 #m3tech 解説 5はfunctionという名前の関数定義 7もwhileという名前の関数定義 (...someはrest parameters) 6は含まれてはいけないセミコロンが あるのでエラー // 5 ({ function() {} }) // 6 ({ for(;;) {} }) // 7 ({ while(...some) {} })
  • 71. 2018/12/06 M3 Tech Meetup #5 #m3tech 解説 https://developer.mozilla.org/ja/docs/Web/JavaSc ript/Reference/Operators/Object_initializer
  • 72. 2018/12/06 M3 Tech Meetup #5 #m3tech 教訓 ES2015の オブジェクト初期化子を 知ってあげて。
  • 73. 2018/12/06 M3 Tech Meetup #5 #m3tech よくある質問 Q. どうやって見つけてるの? A. ショートコーディングしてて気づいたり、新機能を知る時に いろいろやったり