[{"data":1,"prerenderedAt":332},["ShallowReactive",2],{"$ft6jtkd6xhw3c":3,"$f2orkvnqhfz4ur":263},{"featured":4,"latest":129,"categories":227},[5,14,27,37,48,56,66,76,86,96,106,114,122],{"slug":6,"title":7,"date":8,"excerpt":9,"image":10,"categories":11},"custom-database-tables","Custom DataBase Tables","2015-11-24T02:29:34","You can create the new own table freely in the your WordPress database via this plugin. Then, you can make the management of table or (as view or entry or edit) data in a simple user interface.\\nAlso,","\u002Fassets\u002Fuploads\u002F2016\u002F02\u002Fcdbt-overview.png",[12],{"slug":13,"name":7},"cdbt",{"slug":15,"title":16,"date":17,"excerpt":18,"image":19,"categories":20},"10_php_tips_for_developers","PHP開発者が心得ておくべき10の鉄則","2016-01-11T18:38:09","PHPだけに限った話ではないが、プログラミングを行うに当たって、心得て、準備しておくと失敗が劇的に減る事柄をまとめてある良い記事を見つけたので、私なりの解釈で意訳しつつ、経験則を踏まえてあらためてまとめてみた。 オリジナ…","\u002Fassets\u002Fuploads\u002F2016\u002F01\u002Feyecatch-php-10-tips.jpg",[21,24],{"slug":22,"name":23},"column","コラム",{"slug":25,"name":26},"development","開発関連",{"slug":28,"title":29,"date":30,"excerpt":31,"image":32,"categories":33},"jquery-timeline-v1","2種類の横型タイムラインを簡単に作成できる「jQuery.Timeline」をリリース","2017-05-29T14:55:46","現在開発しているサービスで利用するべく、横型タイムラインを生成できるjQueryプラグインを自作したので、そこだけ単独でリリースしてみた。 ソースコード等はGitHubの方にリリースしてあるので、興味のある方は、そち…","\u002Fassets\u002Fuploads\u002F2017\u002F05\u002Fjquery_timeline_image.png",[34],{"slug":35,"name":36},"jqtl","jQuery.Timeline",{"slug":38,"title":39,"date":40,"excerpt":41,"image":42,"categories":43},"optimize-browser-cache-of-static-resources","更新されたJS、CSS、画像のみブラウザキャッシュを破棄して読み込ませる","2018-01-31T15:47:47","WEBサービスの保守や開発をやっていると、JavaScriptやスタイルシート、画像などの静的リソースを更新した際、しばしば「確認したけど、更新されてないよ」とか云われて、「ブラウザのキャッシュを消してからもう一度見て…",null,[44,47],{"slug":45,"name":46},"codes","コード集",{"slug":25,"name":26},{"slug":49,"title":50,"date":51,"excerpt":52,"image":53,"categories":54},"jquery-timeline","jQuery.Timeline version2 – full documentation","2019-03-04T20:40:48","Plugin Overview The jQuery.Timeline plugin provides you two types of the horizontal timeline. You can create a…","\u002Fassets\u002Fuploads\u002F2019\u002F03\u002Fjquery.timeline_v2.jpg",[55],{"slug":35,"name":36},{"slug":57,"title":58,"date":59,"excerpt":60,"image":61,"categories":62},"released-the-sloth","Released the Sloth of mobile-first CSS micro framework!","2019-04-16T18:04:25","I released the “Sloth” that is mobile-first CSS micro framework. I have long used frontend framewo…","\u002Fassets\u002Fuploads\u002F2019\u002F04\u002Fsloth_doc_head.png",[63],{"slug":64,"name":65},"sloth","Sloth",{"slug":67,"title":68,"date":69,"excerpt":70,"image":71,"categories":72},"challenge-to-conceal-the-wordpress-site","WordPressサイトを徹底的に秘匿化する","2020-02-02T23:59:58","私は自分の個人サイトをはじめ、仕事でもWordPressサイトを運用している。WordPressは気軽にサイトを立ち上げられてカスタマイズも簡単な、素晴らしいオープンソースなのだが、世界中で使われまくっているその知名度…","\u002Fassets\u002Fuploads\u002F2020\u002F02\u002Fshutterstock_1878005929.jpg",[73],{"slug":74,"name":75},"wordpress","WordPress関連",{"slug":77,"title":78,"date":79,"excerpt":80,"image":81,"categories":82},"what-is-forkor","Made a shortened URL app called Forkor","2020-07-07T22:27:01","What’s Forkor? Forkor is a service that provides a shortened URL feature that allows you to redirect any…","\u002Fassets\u002Fuploads\u002F2020\u002F07\u002Fforkor.png",[83],{"slug":84,"name":85},"forkor","Forkor",{"slug":87,"title":88,"date":89,"excerpt":90,"image":91,"categories":92},"manual-about-svg-japan","インタラクティブな日本地図を生成するJSプラグイン「SVG Japan」","2020-11-16T21:19:58","各都道府県をそれぞれ選択・クリック可能なインタラクティブな日本地図を生成するネイティブJavaScript建てのプラグイン「SVG Japan」を作ったので、その紹介と使い方をまとめておく。ちなみにソースコードはgit…","\u002Fassets\u002Fuploads\u002F2020\u002F11\u002Fsvg-japan.png",[93],{"slug":94,"name":95},"svg-japan","SVG Japan",{"slug":97,"title":98,"date":99,"excerpt":100,"image":101,"categories":102},"wp-ignitor-plugin-to-conceal-wordpress-site","WordPressサイトを秘匿化するプラグイン「WP Ignitor」","2021-01-19T15:28:21","以前「WordPressサイトを徹底的に秘匿化する」という記事で、WordPress建てのサイトを秘匿化する方法を取り上げたのだが、あれをサイト構築時に毎度実施するとなるととても労力が必要であった。そこで、もっとお手軽…","\u002Fassets\u002Fuploads\u002F2021\u002F01\u002Fbanner-1554x500-1.png",[103],{"slug":104,"name":105},"wp-ignitor","WPイグナイタ",{"slug":107,"title":108,"date":109,"excerpt":110,"image":111,"categories":112},"tastewp","無料でWordPressサイトを複数作成できるWEBサービス「TasteWP」","2021-03-25T20:21:59","私が日本語翻訳に協力しているWEBサービス「TasteWP」について紹介しようと思う。 https:\u002F\u002Ftastewp.com このサービス、サインアップすることなく無料で自分用のWordPressサイトを作れるとい…","\u002Fassets\u002Fuploads\u002F2021\u002F03\u002FTasteWP_screenshot.png",[113],{"slug":74,"name":75},{"slug":115,"title":116,"date":117,"excerpt":118,"image":119,"categories":120},"monster-hunter-rise-skill-simulator","モンハンライズのスキルシミュレータを作ってみた！","2021-06-28T20:24:52","コラムで連載していたNintendo Switch版『モンスターハンターライズ』のスキルシミュレータ開発がやっと一段落して一通り完了した。いやぁ、記事書きながら同時並行で開発すると思っていた以上に時間がかかるもんだなぁ…","\u002Fassets\u002Fuploads\u002F2021\u002F06\u002Fmhrss_v100.png",[121],{"slug":25,"name":26},{"slug":123,"title":124,"date":125,"excerpt":126,"image":42,"categories":127},"comparison-of-javascript-date-libraries","JavaScriptの日時ライブラリを比較してみた","2021-07-28T22:39:19","ネイティブJavaScriptで日時を取り扱う場合、ビルトインされているDateオブジェクトを使うことになるのだが、このDateオブジェクトは取り扱いにクセが多く、直感的に日時を操作できない点でも有名である。そこで、専…",[128],{"slug":25,"name":26},[130,141,153,165,175,184,192,195,198,206,213,220],{"slug":131,"title":132,"date":133,"excerpt":134,"image":135,"categories":136},"pulllog_launched","ガチャ履歴を記録・分析できるWebサービス「PullLog」","2025-08-22T13:05:30","このたび、新しい個人開発サービスとして 「PullLog（プルログ）」 をリリースした。 URLはこちら https:\u002F\u002Fpulllog.net PullLogとは？ PullLogは、ソーシャルゲームのガチャ履歴を記録…","\u002Fassets\u002Fuploads\u002F2025\u002F08\u002Fpulllog_stats_jp.png",[137,140],{"slug":138,"name":139},"industries","プロダクト",{"slug":25,"name":26},{"slug":142,"title":143,"date":144,"excerpt":145,"image":146,"categories":147},"mockapi-php-openapi-schema-generation","モックAPIのレスポンスから OpenAPI 3.0 スキーマを自動生成するPHPツール","2025-04-17T09:31:52","私自身がそうなのですが、OpenAPI仕様書を毎回手作業で書いていて「面倒だな」と思ったことはありませんか？ そんな（私と）あなたにぴったりのツールがあります。 レスポンスの例さえ用意すれば、OpenAPI 3.0 スキ…","\u002Fassets\u002Fuploads\u002F2025\u002F04\u002Fswaggerui-preview.png",[148,151,152],{"slug":149,"name":150},"mockapi-php","MockAPI-PHP",{"slug":138,"name":139},{"slug":25,"name":26},{"slug":154,"title":155,"date":156,"excerpt":157,"image":158,"categories":159},"ambient_playlist_customize","Ambientでメメントモリのラメントプレイヤーを作る","2023-11-30T17:32:39","「Ambient」の最新バージョン 1.2.0で実装した「疑似フェーダー」機能を使って、ソーシャルゲーム「メメントモリ」のYouTube公式チャンネルで公開されているMVを集約したラメント専用プレイヤーを作ってみた。 ラ…","\u002Fassets\u002Fuploads\u002F2023\u002F11\u002Fambient_mememori_1.png",[160,163,164],{"slug":161,"name":162},"ambient","Ambient",{"slug":138,"name":139},{"slug":25,"name":26},{"slug":166,"title":167,"date":168,"excerpt":169,"image":170,"categories":171},"released_ambient_demo_version","Ambientメディアプレイヤーのクラウド版デモを公開","2023-11-22T13:47:36","つい先日「Ambient」の最新バージョン 1.1.0をリリースして、それに合わせてクラウド版デモサイトも公開してみた。 なお、クラウド版デモでローカルのホストコンピュータのメディアを再生するには、そのメディアファイルも…","\u002Fassets\u002Fuploads\u002F2023\u002F10\u002FAmbientMediaPlayer-typologo.png",[172,173,174],{"slug":161,"name":162},{"slug":138,"name":139},{"slug":25,"name":26},{"slug":176,"title":177,"date":178,"excerpt":179,"image":170,"categories":180},"ambient-media-player","YouTubeと自分のPC内メディアを同時に再生できるメディアプレイヤーを作ってみた","2023-10-20T00:00:25","私はよくPCで何か作業をするときには音楽を垂れ流していることが多い。 そういう時にかける曲は、手持ちのアルバムCD等からPCに取り込んだ音源だったり、さらにはYouTubeの動画だったりとメディアや再生環境がバラバラだ。…",[181,182,183],{"slug":161,"name":162},{"slug":138,"name":139},{"slug":25,"name":26},{"slug":185,"title":186,"date":187,"excerpt":188,"image":189,"categories":190},"what-is-the-sunorhc","Sunorhc is a date-time library for JavaScript","2021-08-25T22:55:55","Sunorhc is a lightweight library for handling dates and times for JavaScript. The library wraps a native JavaS…","\u002Fassets\u002Fuploads\u002F2021\u002F08\u002Fshutterstock_1091212919_resized.jpg",[191],{"slug":25,"name":26},{"slug":123,"title":124,"date":125,"excerpt":126,"image":42,"categories":193},[194],{"slug":25,"name":26},{"slug":115,"title":116,"date":117,"excerpt":118,"image":119,"categories":196},[197],{"slug":25,"name":26},{"slug":199,"title":200,"date":201,"excerpt":202,"image":203,"categories":204},"mhrise-skill-simulator-creation-chapter-12","モンスターハンターライズのスキルシミュレータを作ってみる！ 第12回","2021-06-21T13:11:46","今回は「マイセット登録」と護石データの「エクスポート／インポート」機能の追加をしていく。折り良く（悪く？）「FF7リメイク・インターグレード」や「FORTNITEシーズン7」が出たこともあって、そっちをプレイしてたらこ…","\u002Fassets\u002Fuploads\u002F2021\u002F04\u002Fb6ca09e9a7f6faf27641f62dabe64c6ff97b4f326aa478379e3c112aa28eb9ab.jpg",[205],{"slug":22,"name":23},{"slug":207,"title":208,"date":209,"excerpt":210,"image":203,"categories":211},"mhrise-skill-simulator-creation-chapter-11","モンスターハンターライズのスキルシミュレータを作ってみる！ 第11回","2021-06-07T14:52:31","さて、今回はユーザー個別データの管理部分を開発していく予定だが、まずその前にやっておくことがある。 新スキル「風雷合一」に対応する Ver.3.0の大型無料アップデートで追加された新スキルに「風雷合一」というのがある…",[212],{"slug":22,"name":23},{"slug":214,"title":215,"date":216,"excerpt":217,"image":203,"categories":218},"mhrise-skill-simulator-creation-chapter-10","モンスターハンターライズのスキルシミュレータを作ってみる！ 第10回","2021-06-02T00:29:10","今回は、護石管理画面の作成だ。この護石管理では、ユーザーごとに護石の登録を行う機能と、登録した護石を削除する機能を持つ仕様になる。この画面から登録した護石データはデータベースに格納するので、フロントエンド側からのリクエス…",[219],{"slug":22,"name":23},{"slug":221,"title":222,"date":223,"excerpt":224,"image":203,"categories":225},"mhrise-skill-simulator-creation-chapter-9","モンスターハンターライズのスキルシミュレータを作ってみる！ 第9回","2021-05-22T23:56:27","さて、今回はVuexによるデータ・キャッシュの実装だ。一度データベースから読み込んだデータをフロントエンド側で再利用可能なストアに格納することで、データベースへの接続回数を減らしてシステム負荷を下げるとともに、UX的な…",[226],{"slug":22,"name":23},[228,230,232,236,238,239,240,241,242,244,247,248,250,252,254,258,261],{"slug":161,"name":162,"count":229},3,{"slug":13,"name":7,"count":231},7,{"slug":233,"name":234,"count":235},"csnp","Custom Sticky Notes",2,{"slug":84,"name":85,"count":237},1,{"slug":35,"name":36,"count":229},{"slug":149,"name":150,"count":237},{"slug":64,"name":65,"count":237},{"slug":94,"name":95,"count":237},{"slug":74,"name":75,"count":243},37,{"slug":245,"name":246,"count":237},"wpqt","WP Qiita",{"slug":104,"name":105,"count":237},{"slug":22,"name":23,"count":249},29,{"slug":45,"name":46,"count":251},16,{"slug":138,"name":139,"count":253},5,{"slug":255,"name":256,"count":257},"lifelog","ライフログ",64,{"slug":259,"name":260,"count":235},"uncategorized","未分類",{"slug":25,"name":26,"count":262},45,{"type":264,"post":265},"post",{"slug":266,"title":267,"date":268,"excerpt":269,"image":270,"categories":271,"modified":274,"html":275,"tags":276,"related":288,"prev":315,"next":323},"javascript-function-that-can-determine-whether-specific-value-is-empty","JavaScriptでPHPのempty()のように空判定ができる関数","2017-10-13T20:18:47","JavaScriptにはオブジェクトや配列などの引数に与えた変数（値）が「空」かどうかを判定する関数がない。つまり、PHPで云うところの empty() や、Railsで云うところの blank? といったビルトインメ…","\u002Fassets\u002Fuploads\u002F2016\u002F06\u002Ftools.png",[272,273],{"slug":45,"name":46},{"slug":25,"name":26},"2021-02-03T20:31:54","\u003Cp>　JavaScriptにはオブジェクトや配列などの引数に与えた変数（値）が「\u003Cstrong>空\u003C\u002Fstrong>」かどうかを判定する関数がない。つまり、PHPで云うところの \u003Ccode>empty()\u003C\u002Fcode> や、Railsで云うところの \u003Ccode>blank?\u003C\u002Fcode> といったビルトインメソッドがないのだ。\u003Cbr \u002F>\n　ある変数について値が空かどうかという条件式は結構多用するので、ないならば作ってしまおう、ということでPHPの \u003Ccode>empty()\u003C\u002Fcode> 的な関数を自作してみた（\u003Ca href=\"#is-empty\">実際のソースは後述\u003C\u002Fa>）。その際、JavaScriptでの様々な「型」における「空」の判定について調査して、色々と気づいたことも多かったので、この記事にまとめてみた次第。\u003C\u002Fp>\n\u003Ch2>JavaScriptにおける「型」別の「空」について\u003C\u002Fh2>\n\u003Cp>　まず、JavaScriptにおいて変数が「空」であるという定義にはブレがある、というか一意な解釈がないという方が正しいのかもしれない。それが「空」を判定するようなビルトインメソッドがないことに繋がっているのだろう。変数型ごとの「空」の解釈が利用者に依存しているような状況なうえ、さらにECMAScript6で追加された「\u003Cstrong>シンボル\u003C\u002Fstrong>」型がその定義をさらに混沌とさせている（ような気がする）。\u003Cbr \u002F>\n　理論だけだといまいちピンとこないので、有名どころのライブラリである「\u003Ca href=\"http:\u002F\u002Fis.js.org\u002F\">is.js\u003C\u002Fa>」と「\u003Ca href=\"http:\u002F\u002Funderscorejs.org\u002F\">underscore.js\u003C\u002Fa>」を引き合いにして、実際に値の「空」がどのように判定されているかを例示してみよう。\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth align=\"left\">判定する値\u003C\u002Fth>\n\u003Cth align=\"left\">値の説明\u003C\u002Fth>\n\u003Cth align=\"center\">is.js: is.empty()\u003C\u002Fth>\n\u003Cth align=\"center\">underscore.js: _.isEmpty()\u003C\u002Fth>\n\u003Cth align=\"left\">期待値としての判定結果\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>{}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">空のオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>sym = Symbol(); Object(sym)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">プリミティブ値がシンボルのオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">プリミティブ値が存在しているオブジェクトなので \u003Cstrong>false\u003C\u002Fstrong> であるべき\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>obj = {}; a = Symbol('a'); obj[a] = 'foo'\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">シンボルのプロパティを持つオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">プロパティが存在するので \u003Cstrong>false\u003C\u002Fstrong> であるべき\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>{ constant: [], method: function(){} }\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">メソッドを持つクラスオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>Symbol()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">シンボル\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">暗黙的にプリミティブデータをラップしているため \u003Cstrong>false\u003C\u002Fstrong> であるべき\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>Symbol(\"Foo\")\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">descriptionを持つシンボル\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">同上\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>Symbol.for(\"foo\")\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">キーを持つシンボル\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">同上\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new String()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">空のStringオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">値がないオブジェクトのため \u003Cstrong>true\u003C\u002Fstrong> であるべき\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new String(\"Bar\")\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">プリミティブ値を持つStringオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">値を持つオブジェクトのため \u003Cstrong>false\u003C\u002Fstrong> であるべき\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>\"bar\"\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">文字列\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>\"\"\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">空の文字列\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>\"0\"\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">文字列の0\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">文字列として値があるので \u003Cstrong>false\u003C\u002Fstrong> であるべき\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new Number()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">空のNumberオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">値がないオブジェクトのため \u003Cstrong>true\u003C\u002Fstrong> であるべき\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new Number(0)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">プリミティブ値が0のNumberオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">数値の0として判定し \u003Cstrong>true\u003C\u002Fstrong> が理想\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new Number(1)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">プリミティブ値が1のNumberオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">数値の1として判定し \u003Cstrong>false\u003C\u002Fstrong> が理想\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>1\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">数値の1\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">真偽値解釈として0以外の数値は \u003Cstrong>false\u003C\u002Fstrong> が理想\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>-1\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">数値の―1\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">同上\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">数値の0\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">真偽値解釈として0はfalseと同等に扱い \u003Cstrong>true\u003C\u002Fstrong> が理想\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>3.14\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">（浮動小数点を含む）数値の3.14\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>NaN\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">非数のグローバルプロパティ\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">数値でない値が存在するという意味から \u003Cstrong>false\u003C\u002Fstrong> が理想\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>[]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">空の配列\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>[1,2,3]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">配列\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>arr = [a,b,c]; arr[Symbol.iterator]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">ウェルノウンシンボルのイテレータ\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">実体はfunction型であるため \u003Cstrong>false\u003C\u002Fstrong> であるべき\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new Boolean()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">空のBooleanオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">値がないオブジェクトのため \u003Cstrong>true\u003C\u002Fstrong> であるべき\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new Boolean(true)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">プリミティブ値がtrueのBooleanオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">真偽値のtrueとして判定し \u003Cstrong>false\u003C\u002Fstrong> が理想\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new Boolean(false)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">プリミティブ値がfalseのBooleanオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">真偽値のfalseとして判定し \u003Cstrong>true\u003C\u002Fstrong> が理想\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">真偽値のtrue\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">真偽値解釈として有効な値という判定から \u003Cstrong>false\u003C\u002Fstrong> が理想\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">真偽値のfalse\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">真偽値解釈として無効な値という判定から \u003Cstrong>true\u003C\u002Fstrong> が理想\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>undefined\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">undefiend型オブジェクトのプリミティブ値\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">値が未定義なので \u003Cstrong>true\u003C\u002Fstrong> であるべき\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">null値（リテラル）\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">値がないので \u003Cstrong>true\u003C\u002Fstrong> であるべき\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>　期待値についての解釈には個人差があるかもしれない。それこそが、JavaScriptにおける「空」判定の難しさであり、混沌の深淵でもある。私が期待値として解釈のベースとしたのは、PHPの \u003Ccode>empty()\u003C\u002Fcode> 関数である。そのPHPの \u003Ccode>empty()\u003C\u002Fcode> による判定結果は下記の通りだ。\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth align=\"left\">判定する値\u003C\u002Fth>\n\u003Cth align=\"left\">型\u003C\u002Fth>\n\u003Cth align=\"left\">値の説明\u003C\u002Fth>\n\u003Cth align=\"center\">PHP: empty()\u003C\u002Fth>\n\u003Cth align=\"left\">補足\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new stdClass()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">object(stdClass)\u003C\u002Ftd>\n\u003Ctd align=\"left\">空のオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">オブジェクトの空判定には \u003Ccode>get_object_vars\u003C\u002Fcode> などを使うべき\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>(object) \"ciao\"\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">object(stdClass)\u003C\u002Ftd>\n\u003Ctd align=\"left\">スカラー値のみを持つオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">同上\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new Class{}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">object(class@anonymous)\u003C\u002Ftd>\n\u003Ctd align=\"left\">空のクラス\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">同上\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>$closure = function(){ return; }\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">object(Closure)\u003C\u002Ftd>\n\u003Ctd align=\"left\">クロージャ\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">同上\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>\"foo\"\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">string(3)\u003C\u002Ftd>\n\u003Ctd align=\"left\">文字列\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>\"\"\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">string(0)\u003C\u002Ftd>\n\u003Ctd align=\"left\">空の文字列\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>\"0\"\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">string(1)\u003C\u002Ftd>\n\u003Ctd align=\"left\">文字列の0\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">文字列として値があるので \u003Cstrong>false\u003C\u002Fstrong> であるべき\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>1\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">int(1)\u003C\u002Ftd>\n\u003Ctd align=\"left\">整数値\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>-1\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">int(-1)\u003C\u002Ftd>\n\u003Ctd align=\"left\">整数値の-1\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">int(0)\u003C\u002Ftd>\n\u003Ctd align=\"left\">整数値の0\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>0.0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">float(0)\u003C\u002Ftd>\n\u003Ctd align=\"left\">浮動小数点値の0\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>array()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">array(0)\u003C\u002Ftd>\n\u003Ctd align=\"left\">空の配列\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>array(1,2,3)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">array(3)\u003C\u002Ftd>\n\u003Ctd align=\"left\">配列\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">bool(true)\u003C\u002Ftd>\n\u003Ctd align=\"left\">真偽値のtrue\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">bool(false)\u003C\u002Ftd>\n\u003Ctd align=\"left\">真偽値のfalse\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>global $glob_var\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">NULL\u003C\u002Ftd>\n\u003Ctd align=\"left\">定義済みグローバル変数\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">対象スコープ上に変数が定義されたのみで値はない\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>static $stat_var\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">NULL\u003C\u002Ftd>\n\u003Ctd align=\"left\">定義済みローカル変数\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">同上\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">NULL\u003C\u002Ftd>\n\u003Ctd align=\"left\">null値\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new SimpleXMLElement('&lt;div&gt;&lt;\u002Fdiv&gt;')\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">object(SimpleXMLElement)\u003C\u002Ftd>\n\u003Ctd align=\"left\">空要素のみのSimpleXMLElementオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new SimpleXMLElement('&lt;div class=\"clearfix\"&gt;&lt;\u002Fdiv&gt;')\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">object(SimpleXMLElement)\u003C\u002Ftd>\n\u003Ctd align=\"left\">属性あり空要素のSimpleXMLElementオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>tmpfile()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">resource of type (stream)\u003C\u002Ftd>\n\u003Ctd align=\"left\">ストリーム参照リソース（いわゆるファイルハンドル）\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">リソースの空判定には別途 \u003Ccode>fread\u003C\u002Fcode> などで実データを取得する必要がある\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>$fh = fopen(\"\u002F\u002Fgoogle.com\", \"r\"); fclose( $fh )\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">resource of type (Unknown)\u003C\u002Ftd>\n\u003Ctd align=\"left\">参照を破棄されたリソース\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">リソースの開放を判定するには \u003Ccode>is_resource\u003C\u002Fcode> を使う\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>　何気に、PHPの「空」判定も十分にカオスなのだが、判定指針がユーザー任せのJavaScriptよりはだいぶマシであり、参考にできるのではないかと。\u003Cbr \u002F>\n　PHPの「空」判定については、下記の記事が抜群にわかりやすい。\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>\n  \u003Ca href=\"https:\u002F\u002Fqiita.com\u002Fmpyw\u002Fitems\u002F51bf42fe1ad8a7e535aa\">isset, empty, is&#95;null の動作まとめ\u003C\u002Fa>\n\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>JavaScript の typeof には罠がある\u003C\u002Fh2>\n\u003Cp>　前述した通り、JavaScriptで「空」判定を行うにあたっては変数の「型」の識別が重要になってくる。まず、変数の型を判定して、それぞれの型に沿って値が「空」かどうかを調べるという手順になるからだ。\u003Cbr \u002F>\n　そこで、JavaScriptにおける型について簡単におさらいしておこう。下記の記事が非常に参考になる。\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cul>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fqiita.com\u002Famamamaou\u002Fitems\u002Fef0b797156b324bb4ef3\">JavaScriptの型などの判定いろいろ\u003C\u002Fa>\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fqiita.com\u002Fsouth37\u002Fitems\u002Fc8d20a069fcbfe4fce85\">JavaScriptの「型」の判定について\u003C\u002Fa>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fblockquote>\n\u003Cp>　上記の記事で云われているように、JavaScriptにおけるオブジェクト型には内包される要素が非常に多い。さらに、ECMAScript6から新たに追加された \u003Cstrong>シンボル型\u003C\u002Fstrong> にも注意が必要になる。\u003Cbr \u002F>\n──ということを踏まえて、JavaScriptでの型を一覧化してみると次のようになる。\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth align=\"left\">型\u003C\u002Fth>\n\u003Cth align=\"left\">型の概要\u003C\u002Fth>\n\u003Cth align=\"left\">typeof の結果\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd align=\"left\">String\u003C\u002Ftd>\n\u003Ctd align=\"left\">「文字列」型\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Ccode>string\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">Number\u003C\u002Ftd>\n\u003Ctd align=\"left\">「数値」型。非数である \u003Ccode>NaN\u003C\u002Fcode> もこの型に属する\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Ccode>number\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">Boolean\u003C\u002Ftd>\n\u003Ctd align=\"left\">「真偽値」型\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Ccode>boolean\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">Undefined\u003C\u002Ftd>\n\u003Ctd align=\"left\">「未定義」型\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Ccode>undefined\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">Null\u003C\u002Ftd>\n\u003Ctd align=\"left\">本来は「Null」型に分類されるべきところだが、実際にはオブジェクト型と判定される。\u003Ca href=\"https:\u002F\u002Fdeveloper.mozilla.org\u002Fja\u002Fdocs\u002FWeb\u002FJavaScript\u002FReference\u002FOperators\u002Ftypeof\">ECMAScriptのバグ\u003C\u002Fa>と云われている\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Ccode>object\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">Symbol\u003C\u002Ftd>\n\u003Ctd align=\"left\">「シンボル」型。ECMAScript6 で新規追加された\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Ccode>symbol\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">Function\u003C\u002Ftd>\n\u003Ctd align=\"left\">「関数オブジェクト」型\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Ccode>function\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">XML\u003C\u002Ftd>\n\u003Ctd align=\"left\">「E4X XML オブジェクト」型。私は今までお目にかかったことがない稀少な型\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Ccode>xml\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">Object\u003C\u002Ftd>\n\u003Ctd align=\"left\">「オブジェクト」型。前出の型以外はすべてこの型となる\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Ccode>object\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>　JavaScriptで型を判定する際に使われる \u003Ccode>typeof\u003C\u002Fcode> に依存してしまうと、Nullがオブジェクト型と認識されてしまい、値の「空」判定においては致命的になりかねない。また、プリミティブ値として文字列や数値、真偽値を持ちながらオブジェクトとして判定される \u003Ccode>new String(\"bar\")\u003C\u002Fcode> のようなラッパーオブジェクトにも注意が必要だ。\u003C\u002Fp>\n\u003Cp>──では、注意点をおさえながら、実際に「空」判定のコードを書いてみる。\u003C\u002Fp>\n\u003Cp>\u003Ca id=\"is-empty\">\u003C\u002Fa>\u003C\u002Fp>\n\u003Ch2>値の「空」判定関数\u003C\u002Fh2>\n\u003Cp>　判定処理の期待値として、私が考える値の「空」の解釈の特筆すべき点は下記の通りだ。\u003C\u002Fp>\n\u003Cul>\n\u003Cli>オブジェクト型については、プロパティがシンボルなどのプリミティブ値であっても、それを値をみなして「空」とはしない。\u003C\u002Fli>\n\u003Cli>ラッパーオブジェクトのオブジェクト型は、変換されるプリミティブ値にもとづいて「空」判定を行う。\u003C\u002Fli>\n\u003Cli>ネストするオブジェクトについては最終的なプリミティブ値まで再帰的に「空」判定を行う。\u003C\u002Fli>\n\u003Cli>真偽値型の「空」判定はPHPの \u003Ccode>empty()\u003C\u002Fcode> 関数の解釈に準じる。\u003C\u002Fli>\n\u003Cli>シンボル型や関数オブジェクト型は、一律で「空」とはしない。\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>──これらの「空」判定ルールに沿って作った関数がこれである。\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"js:\">var is_empty = function( _var ) {\n  if ( _var == null ) {\n    \u002F\u002F typeof null -&gt; object : for hack a bug of ECMAScript\n    return true;\n  }\n  switch( typeof _var ) {\n    case 'object':\n      if ( Array.isArray( _var ) ) {\n        \u002F\u002F When object is array:\n        return ( _var.length === 0 );\n      } else {\n        \u002F\u002F When object is not array:\n        if ( Object.keys( _var ).length &gt; 0 || Object.getOwnPropertySymbols(_var).length &gt; 0 ) {\n          return false;\n        } else\n        if ( _var.valueOf().length !== undefined ) {\n          return ( _var.valueOf().length === 0 );\n        } else\n        if ( typeof _var.valueOf() !== 'object' ) {\n          return is_empty( _var.valueOf() );\n        } else {\n          return true;\n        }\n      }\n      break;\n    case 'string':\n      return ( _var === '' );\n      break;\n    case 'number':\n      return ( _var == 0 );\n      break;\n    case 'boolean':\n      return ! _var;\n      break;\n    case 'undefined':\n    case 'null':\n      return true;\n      break;\n    case 'symbol':\n      \u002F\u002F Since ECMAScript6\n    case 'function':\n    default:\n      return false;\n      break;\n  }\n}; \u002F\u002F End of is_empty()\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>　この例では「is_empty」を無名関数として定義しているが、この場合、関数の巻き上げが行われないため、実際に「空」判定を行いたい処理より前にコードを書いておかないと実行できない。JavaScriptの読み込み順序などを気にせずに使いたい場合は、通常の関数宣言として記述しておくとよいだろう。\u003C\u002Fp>\n\u003Ch3>判定結果\u003C\u002Fh3>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth align=\"left\">判定する値\u003C\u002Fth>\n\u003Cth align=\"left\">値の説明\u003C\u002Fth>\n\u003Cth align=\"center\">is.js: is.empty()\u003C\u002Fth>\n\u003Cth align=\"center\">underscore.js: &#95;.isEmpty()\u003C\u002Fth>\n\u003Cth align=\"left\">is_empty()\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>{}\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">空のオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>sym = Symbol(); Object(sym)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">プリミティブ値がシンボルのオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>obj = {}; a = Symbol('a'); obj[a] = 'foo'\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">シンボルのプロパティを持つオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>{ constant: [], method: function(){} }\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">メソッドを持つクラスオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>Symbol()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">シンボル\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>Symbol(\"Foo\")\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">descriptionを持つシンボル\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>Symbol.for(\"foo\")\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">キーを持つシンボル\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new String()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">空のStringオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new String(\"Bar\")\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">プリミティブ値を持つStringオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>\"bar\"\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">文字列\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>\"\"\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">空の文字列\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>\"0\"\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">文字列の0\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new Number()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">空のNumberオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new Number(0)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">プリミティブ値が0のNumberオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new Number(1)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">プリミティブ値が1のNumberオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>1\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">数値の1\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>-1\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">数値の―1\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>0\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">数値の0\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>3.14\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">（浮動小数点を含む）数値の3.14\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>NaN\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">非数のグローバルプロパティ\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>[]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">空の配列\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>[1,2,3]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">配列\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>arr = [a,b,c]; arr[Symbol.iterator]\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">ウェルノウンシンボルのイテレータ\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new Boolean()\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">空のBooleanオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new Boolean(true)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">プリミティブ値がtrueのBooleanオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>new Boolean(false)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">プリミティブ値がfalseのBooleanオブジェクト\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>true\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">真偽値のtrue\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>false\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>false\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">真偽値のfalse\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>undefined\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">undefiend型オブジェクトのプリミティブ値\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd align=\"left\">\u003Ccode>null\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd align=\"left\">null値（リテラル）\u003C\u002Ftd>\n\u003Ctd align=\"center\">false\u003C\u002Ftd>\n\u003Ctd align=\"center\">true\u003C\u002Ftd>\n\u003Ctd align=\"left\">\u003Cstrong>true\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>　期待値通りの判定が行われている。\u003Cbr \u002F>\n　参考までに、判定結果のテスト用コードも紹介しておく。\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"js:\">\u002F\u002F TEST\nvar lib = [ \"is\", \"underscore\", \"my_func\" ],\n    useLib = lib[2], \u002F\u002F Which library to test\n    obj = {},\n    sym = Symbol(),\n    a   = Symbol('a'),\n    arr = [1,2,3],\n    obj2 = { constant: [], init: function(){}, method: function(){} };\nobj[a] = 'foo';\nvar _chk = [ {}, Object(sym), obj, obj2, sym, Symbol(\"Foo\"), Symbol.for(\"foo\"), new String(), new String(\"Bar\"), \"bar\", \"\", \"0\", new Number(), new Number(0), new Number(1), 1, -1, 0, 3.14, NaN, [], arr, arr[Symbol.iterator], new Boolean(), new Boolean(true), new Boolean(false), true, false, undefined, null ];\n_chk.forEach(function( v ){\n  var res, use;\n  if ( useLib === \"my_func\" ) {\n    use = \"is_empty()\";\n    res = is_empty( v );\n  } else\n  if ( useLib === \"is\" ) {\n    use = \"is.js:is.empty()\";\n    res = is.empty( v );\n  } else\n  if ( useLib === \"underscore\" ) {\n    use = \"underscore.js:_.isEmpty()\";\n    res = _.isEmpty( v );\n  }\n  console.log({ lib: use, arg: v, typeOf: typeof v, result: res });\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>まとめ\u003C\u002Fh2>\n\u003Cp>　JavaScriptにおける値の「空」判定は、結局のところ各ユーザーの「空」の解釈によってブレがあるため、横断的に変数が「空」かどうかを判定するビルトインメソッドのようなものがないのだろう。\u003Cbr \u002F>\n　それをユーザー関数でカバーしようとすると、JavaScriptの大雑把な「型」判定に悩まされることが分かった。特に、実際には様々な型を有するオブジェクト型をどこまで切り出して「空」判定をするのかというポリシー的なものが大きいのではないだろうか。\u003Cbr \u002F>\n　今回の「空」判定では、対象とするオブジェクト型を配列とオブジェクトとラッパーオブジェクトに限定してあるが、他にもDateやJSON、Error、RegExpなどのオブジェクトも存在するため、それらの「空」判定も行うとなるとその分関数処理が肥大化していくことになるだろう。\u003Cbr \u002F>\n　\u003Cbr \u002F>\n　結果的には、実用に耐えられそうな「空」判定関数が作成できたので、収穫は大きかったと云える。　\u003C\u002Fp>\n",[277,280,283,286],{"slug":278,"name":279},"javascript","JavaScript",{"slug":281,"name":282},"php","PHP",{"slug":284,"name":285},"symbol","Symbol",{"slug":287,"name":287},"typeof",[289,293,301,308],{"slug":38,"title":39,"date":40,"excerpt":41,"image":42,"categories":290},[291,292],{"slug":45,"name":46},{"slug":25,"name":26},{"slug":294,"title":295,"date":296,"excerpt":297,"image":270,"categories":298},"ready-to-usable-the-7-javascript-utility-functions","JavaScriptのすぐ使える7つのユーティリティ関数","2016-06-02T15:05:03","私が「Custom DataBase Tables」プラグインのJavaScriptで使っている関数で、すぐに使えて、わざわざ外部ライブラリを読み込むまでもないユーティリティ関数がいくつかあるので、それらを紹介してみたい…",[299,300],{"slug":45,"name":46},{"slug":25,"name":26},{"slug":302,"title":303,"date":304,"excerpt":305,"image":42,"categories":306},"may-be-satisfactorily-on-the-web-if-has-skill-set-of-javascript-and-php","PHP+JavaScriptのスキルセットがあればWebの世界では順風満帆かもしれない","2014-08-27T09:59:54","先日、2014年8月度のプログラミング言語のトレンド状況の統計が示された。話題としては、今年春先頃から騒がれていて先月にはTOP20入りしたAppleの新しいプログラミング言語「Swift」が再びTOP20から下落したと…",[307],{"slug":22,"name":23},{"slug":309,"title":310,"date":311,"excerpt":312,"image":42,"categories":313},"compare-php-and-ruby-and-javascript","RubyとPHPとJavaScriptの狭間で","2014-08-04T16:02:58","ここ1ヶ月ほど、会社の仕事でRubyを使った開発業務をしている。同時に、プライベートでは、WordPressのテーマ開発やプラグイン開発を進めてもいるため、RubyとPHPとJavaScriptのコーディングを同時並行で…",[314],{"slug":22,"name":23},{"slug":316,"title":317,"date":318,"excerpt":319,"image":320,"categories":321},"make-icon-font-of-tribal-of-yo-kai-watch","妖怪ウォッチの種族アイコンのフォントを作ってみた","2017-10-10T18:58:05","私が最近プレイしている唯一のゲームは「妖怪ウォッチぷにぷに」だ。 スマホのゲームはいつでもどこでも片手間にやれるので、お手軽で良い。さらに「ぷにぷに」の場合は、無課金プレイでも地道に続けていれば十分強くなれるのが魅力でも…","\u002Fassets\u002Fuploads\u002F2017\u002F10\u002Fyokai-watch-fonts.png",[322],{"slug":25,"name":26},{"slug":324,"title":325,"date":326,"excerpt":327,"image":328,"categories":329},"yokai-watch-punipuni-gacha-tool","[妖怪ウォッチぷにぷに]Yマネーガチャ集計ツール","2017-10-24T12:26:03","スマホゲーム「妖怪ウォッチぷにぷに」のYマネーガチャの現在の状況を集計するツールを作ってみた。 「ぷにぷに」のYマネーガチャは、パズルで稼いだゲーム内通貨を使って回すガチャで、ガチャから出る妖怪をわざレベルを最大まで…","\u002Fassets\u002Fuploads\u002F2017\u002F10\u002FIMG_0095.jpg",[330,331],{"slug":45,"name":46},{"slug":255,"name":256},1793391397572]