Upgrade to Pro — share decks privately, control downloads, hide ads and more …

無からniboshiを生み出す

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for pastak pastak
October 14, 2025
15

 無からniboshiを生み出す

Avatar for pastak

pastak

October 14, 2025
Tweet

More Decks by pastak

Transcript

  1. About me 2 • Pasta-K ◦ よく呼ばれる呼び⽅: /^ぱすた(けー?)?(くん|さん)*$/ ◦ https://x.com/pastak

    ◦ https://blog.pastak.net/ • 株式会社 Helpfeel Gyazoチーム エンジニア ◦ 主にフロントエンドを中⼼に担当 ◦ 最近はReact v17のFlux脱出などをしている • 趣味 ◦ サッカー観戦 ▪ J1 京都サンガF.C.のほぼ全試合を現地観戦 ◦ クラフトビール ◦ マンガ
  2. • nullは値、undefinedは変数 • 存在しない変数や要素にアクセスすると undefined が帰ってくる ◦ const obj =

    {}; console.log(obj.foo) // undefined ◦ ↑のconsole.logような返り値のない関数の返り値も undefined • console.log(typeof null) // “object” • console.log(typeof undefined) // “undefined” > Use undefined. Do not use null. ◦ https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines#n ull-and-undefined undefined vs null 9
  3. • undefinedの中からniboshiを感じ取る ◦ niはある: undefined ◦ niboshi: 末尾のhとiはアルファベットが1つ違い ◦ undefined:

    末尾のeとdはアルファベットが1つ違い ◦ 残りの部分も⼤体⽂字数が同じ undefinedの中のniboshi 19
  4. Challenge: undefinedをniboshiにしてみよう ③ 27 • コードの冒頭でundefinedが⼊っている変数を定義して、その値を操作して ⽂字列 “niboshi” を出⼒ 禁⽌事項

    • セミコロン禁⽌ • 数値‧undefind‧null を値として記述することは禁⽌ • 空⽂字列以外の⽂字列の記述禁⽌
  5. Challenge: undefinedをniboshiにしてみよう ③ 28 • コードの冒頭でundefinedが⼊っている変数を定義して、その値を操作して ⽂字列 “niboshi” を出⼒ 禁⽌事項

    • セミコロン禁⽌ • 数値‧undefind‧null を値として記述することは禁⽌ • 空⽂字列以外の⽂字列の記述禁⽌ • {}やnew Object()以外のオブジェクトの記述禁⽌ • 1つ以上の要素を持つ配列の記述禁⽌
  6. Challenge: undefinedをniboshiにしてみよう ③ 29 • コードの冒頭でundefinedが⼊っている変数を定義して、その値を操作して ⽂字列 “niboshi” を出⼒ 禁⽌事項

    • セミコロン禁⽌ • 数値‧undefind‧null を値として記述することは禁⽌ • 空⽂字列以外の⽂字列の記述禁⽌ • {}やnew Object()以外のオブジェクトの記述禁⽌ • 1つ以上の要素を持つ配列の記述禁⽌ • 当然⽂字列 “niboshi” や個別の⽂字として”n”などを記述するのも禁⽌
  7. こういうコードは禁⽌されています • const u = undefind ◦ undefinedを値として記述することの禁止 • console.log(“niboshi”)

    ◦ 空文字列以外の文字列禁止 • (function niboshi () {}).name ◦ 直接 niboshi を書くことの禁止 • Object.keys({niboshi: ‘’})[0] // “niboshi” ◦ {}以外のオブジェクトの禁止・数値記述禁止 やってみよう 30
  8. • nullは値、undefinedは変数 • 存在しない変数や要素にアクセスすると undefined が帰ってくる ◦ const obj =

    {}; console.log(obj.foo) // undefined ◦ ↑のconsole.logような返り値のない関数の返り値も undefined • console.log(typeof null) // “object” • console.log(typeof undefined) // “undefined” > Use undefined. Do not use null. ◦ https://github.com/Microsoft/TypeScript/wiki/Coding-guidelines#n ull-and-undefined 再掲: undefined vs null 34
  9. • そもそも変数宣⾔だけすれば良い ◦ const u; console.log(u) // undefined • 他の⽅法は?

    ◦ const u = console.log(); ◦ const u = {}.foo; ◦ const u = [][0] undefinedを⽣み出す⽅法⾊々 35
  10. • String.prototype.bold() ◦ ⽂字列を<b>タグで囲った⽂字列を返す ◦ “hello”.bold() // “<b>hello</b>” • 空⽂字からbを⽣み出す

    (2は頑張ってください) ◦ “”.bold()[2] // “b” • 亜種 ◦ String.prototype.italics() ▪ “hello”.italics() // “<i>hello</i>” ◦ String.prototype.fontsize() ▪ “hello”.fontsize(5) // “<font size=’5’>hello</font>” 空⽂字列からbやiを⽣み出す 36
  11. • オブジェクトを⽂字列にした結果は? ◦ Object.prototype.toString ◦ JSON.stringifyを 介した Object.prototype.toJSON • toStringが上書きされていない任意のオブジェクトのtoString()を呼び出した結

    果は常に同じ ◦ ({}).toString() // '[object Object]' • toString()は空⽂字列との連結に置き換え可能 ◦ ‘’+{} // '[object Object]' ⽂字を獲得するその他の⽅法について考える 38
  12. • オブジェクトを⽂字列にした結果は? ◦ Object.prototype.toString ◦ JSON.stringifyを 介した Object.prototype.toJSON • toStringが上書きされていない任意のオブジェクトのtoString()を呼び出した結

    果は常に同じ ◦ ({}).toString() // '[object Object]' • toString()は空⽂字列との連結に置き換え可能 ◦ ‘’+{} // '[object Object]' • 文字列に配列のようにアクセスするとその文字が取得できる ◦ (‘’+{})[2] // ‘b’ ⽂字を獲得するその他の⽅法について考える 39
  13. • エラーのメッセージにniboshi を⾒つける • 共通部分 ◦ Failed to execute 'querySelector'

    on 'Document': • 異なる部分 ◦ 1 argument required, but only 0 present. ▪ bはこっちにだけある ◦ The provided selector is empty. ▪ hはこっちにだけある ⽂字を獲得するその他の⽅法について考える 45
  14. • Number()で任意の値を数値に変換する ◦ 引数がtrue / false のときは 1 / 0

    ◦ 引数がオブジェクトの時は…… ▪ → LT: JavaScript / HTML カルトクイズ - Speaker Deck 数値を⽣み出す 48
  15. • Number()で任意の値を数値に変換する ◦ 空⽂字列はfalsy ◦ Number('') // 0 • ショートハンドとしての+

    ◦ +’’ // 0 • undefinedが作れたらそれを活⽤する ◦ undefinedはfalsy ◦ !undefinedはtruthy ◦ (+!undefind) // 0 数値を⽣み出す 49
  16. • undefindを⽂字列化 // ʻundefined’ • 配列にする // [ʻu’, ʻn’, ʻd’,

    ʻe’, ʻf’, ʻi’, ʻn’, ʻe’, ʻd’] • 末尾2つを捨てる // [ʻu’, ʻn’, ʻd’, ʻe’, ʻf’, ʻi’, ʻn’] • ひっくり返す // [ʻn’, ʻi’, ʻf’, ʻe’, ʻd’, ʻn’, ʻu’] ◦ ni 発⽣ • 2番⽬を ʻb’ に // [ʻn’, ʻi’, ʻb’, ʻe’, ʻd’, ʻn’, ʻu’] • 連番を利⽤して // [ʻn’, ʻi’, ʻb’, ʻo’, ʻs’, ʻn’, ʻu’] ◦ e → o コードポイント的には 101 → 111 差分は10 ◦ d→s コードポイント的には 100 → 115 差分は15 ◦ 元の⽂字のコードポイントに5*2と5*3を⾜す 作戦 51
  17. • エラーメッセージからhを取り出す // [ʻn’, ʻi’, ʻb’, ʻo’, ʻs’, ʻh’, ʻu’]

    ◦ document.querySelector(‘’)のエラーメッセージから • 2番⽬のiを流⽤ // [ʻn’, ʻi’, ʻb’, ʻo’, ʻs’, ʻh’, ʻi’] • この配列をjoin() // ‘niboshi’ そうして完成したのがこちら 作戦 52
  18. 58

  19. https://gist.github.com/pastak/c5e2400a3d6deee71259c07bc5e6263b 60 ![]はfalsyなので[][![]] は[][0]でundefinedを得 て、uに代入 undefinedから1を作って_に _+_で2。色々やって _i_に 5。$は’undefined’をsplit して置き換えた配列。

    ひっくり返して、 withで要素 を書き換えして iを流用。 map使って、indexを使ってo とsを生成。エラーメッセー ジからhを取り出して withで 要素置き換え。 最後にjoin()でくっつける。 セミコロン禁止なので、文を ||や&&でつなぐ