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

無からniboshiを生み出す

Avatar for pastak pastak
October 14, 2025
2

 無から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()でくっつける。 セミコロン禁止なので、文を ||や&&でつなぐ