【JavaScript】JavaScriptでは全てがオブジェクト?
JavaScriptでは全てがオブジェクトである
と捉えるべきなのです。
そうすると色々な疑問がスッキリします。
その理由について、今日はメモしていこうと思います。
JavaScriptにはプリミティブ型があります。
プリミティブ型:
オブジェクトではなく、値のみを持ち、プロパティやメソッドを持たないデータのこと。
文字列、数値、真偽値、null、undefined、symbol(ES6で追加)がそれに当てはまります。
というものです。
オブジェクトではなく、プロパティも持たないとはっきり言われているプリミティブ型ですが、以下のコードをみてみると
コンソールログで2と出力されました。
プリミティブ型なのにどうしてStringオブジェクトがもつlengthプロパティを使えているのかという疑問が出て来ます。
これがJavaScriptでは全てがオブジェクトであると捉えるべきという理由です。
実は暗黙的な型変換でオブジェクト型に変換されています。
では、なぜこのような動作を起こしたかというと、はっきりと言える意図があるわけではなさそうで
JavaScriptのクセのようなものみたいです。
注意ですが、暗黙的な型変換でエラーも吐かずプロパティを使えたので、これで良いのですが、明示的に行なっていないため後々問題が起こるかもしれません。
厳格にはやはりプリミティブ型は存在するので、JavaScript勉強中っていう自分レベルの人はJavaScriptでは全てがオブジェクトであるという考え方でとりあえずいいのかなと思いました。
正確にはJavaScriptでは全てがオブジェクトになり得るなのかな。
【JavaScript】値渡し, 参照渡し
JavaScriptの基礎編。
値渡し
プリミティブ型(基本型)だと値渡しになります。
このようにプリミティブ型を渡した変数aを
変数bに代入すると、変数aの内容が変数bにコピーされます。
コピーされるため、メモリ番地は違う場所になります。
参照渡し
オブジェクト型だと参照渡しになります。
aには空の配列を代入しています。
bにはそのaを代入しています。
bの配列に文字列'ほげ'を入れます。
そうすると
bの配列に入れた'ほげ'がaの配列にも入っています。
値を比較すると、aとbは全く同じと出力されます。
bはaのメモリ番地を見ている(参照している)ことになります。
オブジェクト型だと、メモリ番地は同じ場所を差すことになります。
何でもかんでも入れられるオブジェクト型をコピーで複製するとなると、
メモリがたくさん使われて、処理が重くなっていくため
このようにオブジェクト型は参照渡しという仕組みになってるらしいです。
WEBセキュリティ
メモしてたことのメモ。
WEBセキュリティで、「WEB制作してるのに知らないのはちょっと...」って感じの4つになります。
SQLインジェクション
SQLインジェクションは有名で被害も多い。
入力フォームなどからSQL文で個人情報をデータベースにリクエストし、
情報を盗む攻撃。
簡単に盗まれてしまうので、対策は必須。
バインド機構や文字コードの指定などで対策ができる。
XSS(クロスサイトスクリプティング)
XSSは入力フォームなどにWEBページを操作するスクリプトを入力して送信する攻撃。
ページの見え方や動作を書き換えられてしまう。
HTMLエンコードなどで対策できる。
HTMLでシングルクォーテーションはセキュアのためにも使わない。
CSRF(クロスサイトリクエストフォージェリー)
CSRFはショッピングサイトなどの最終確定処理のリクエストを外部ページから行う攻撃。
リクエスト送信のボタンが公開されていて誰でも押せる状態になってたとすれば、ショッピングサイト側には大量の注文が入ってくることに。
対策としては、正規のユーザーかどうかをチェックすることが必要になる。
あるタイミングでトークンを発行し、確定処理されるタイミングでトークンを照合するという機能を作るなどで対策できる。
クリックジャッキング
クリックジャッキングは攻撃者自らのサイトの上にCSSの透過指定で透明な標的のサイトを被せ、標的のサイトをユーザーに不正操作させる攻撃。
ユーザーは意図していないが、ユーザー自らが正しい手続きを踏んでることになるので、ユーザーにはなんらかの被害が発生することになる。
WEBサイトから返されるHTTPレスポンスヘッダにX-Frame-Options HTTP レスポンスヘッダの指定で対策ができる。