箱のプログラミング日記。

えんじにあ奮闘記

JavaScriptの型変換〜Rubyと比較〜

f:id:y_hakoiri:20191102134313j:plain

最近生の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では===を使うことは知っていたけど、たまに癖で==と書いてしまうことがあるから気をつけよう...

間違って==で書いてしまってもエラーを吐かないし、何なら期待とは違う検証がされてしまうので、気がつかず進んでしまうと危険だなと思いました。

参考

暗黙的な型変換 · JavaScript Primer #jsprimer