最近生のJSをきちんと勉強し始めて、知らなかったことがちょこちょこ出てきたのでRubyと比較しながら書いていきます。
JavaScriptの型変換
文字列に変換
String()関数を使用
String(1); // => "1" String([1, 2, 3]); // => "1,2,3" String(true); // => "true" String(null); // => "null"
Rubyの場合
to_sメソッドを使用
1.to_s => "1" [1,2,3].to_s => "[1, 2, 3]" true.to_s => "true" null.to_s NameError: undefined local variable or method `null' for main:Object
Rubyはnullにメソッドを使うことはできないからエラーになる
真偽値に変換
Boolean()関数を使用
Boolean("string"); // => true Boolean(1); // => true Boolean(0); // => false Boolean({}); // => true Boolean([]); // => true Boolean(""); // => false Boolean(null); // => false
なお、JSでは以下のfalsyな値がfalseと判定される
- false
- undefind
- null
- 0
- NaN
- ""
空の配列やハッシュはtrueで空文字はfalseというのがいまいちよく分からない...
Rubyの場合
Rubyには真偽値に変換するメソッドがないようなので、比較対象としてはちょっと微妙な気もするけどRailsのキャストで表現してみる
ActiveRecord::Type::Boolean.new.cast("string") => true ActiveRecord::Type::Boolean.new.cast(1) => true ActiveRecord::Type::Boolean.new.cast(0) => false ActiveRecord::Type::Boolean.new.cast({}) => true ActiveRecord::Type::Boolean.new.cast([]) => true ActiveRecord::Type::Boolean.new.cast("") => nil ActiveRecord::Type::Boolean.new.cast(nil) => nil
ここでも空の配列やハッシュはtrueで、空文字はfalseではなくnilになるみたい。
暗黙的な型変換
JSの暗黙的な型変換とは
等価演算子を使用した場合に勝手に型を変換してくれちゃう現象。
???
JSでは等しいかどうかを検証する時に二通りの検証の仕方があって
==
(等価演算子)===
(厳密等価演算子)
等価演算子で比較をすると、比較対象の型が違った場合に型を統一させた上で比較してくれてしまう。
Rubyの場合
1 == "1" => false
intとstringを比べているので当然falseになる。
JSの場合
1 === "1" => false 1 == "1" => true
厳密等価演算子だとその型のまま双方を比べるので当然falseになるのだけど、等価演算子だと暗黙的に型変換をした上で比較するので、intの1と文字列の1が等しいと判定されてしまう。
JSでは===
を使うことは知っていたけど、たまに癖で==
と書いてしまうことがあるから気をつけよう...
間違って==
で書いてしまってもエラーを吐かないし、何なら期待とは違う検証がされてしまうので、気がつかず進んでしまうと危険だなと思いました。