javascript で string 型と boolean 型を相互に変換

string 型を boolean 型に変換する

parseInt() のように parseBool() があるかと思ったけど、
なさそうなので自分でコードを書いて実装する必要がある。

if で簡潔に実装

これだと文字列が true 以外だと全て false になる。
期待通りに動かない。

var t = 'true';
var f = 'false';
var i = '1';

// string 型から boolean 型に変換
console.log((t == 'true')); // true
console.log((f == 'true')); // false
console.log((i == 'true')); // false

Boolean クラスを試す

これも期待通りに動かない。

var t = 'true';
var f = 'false';

console.log(Boolean(t)); // true
console.log(Boolean(f)); // true

parseBool() を自作する

仕様上 true, false 判定となる値以外をどう扱うべきか、
どういう実装がベターなのかは正直分からない。

function parseBool(v) {
	switch (v) {
	case true:
	case 'true':
	case 1:
	case '1':
		return true
	case false:
	case 'false':
	case '':
	case 0:
	case -1:
	case '0':
	case '-1':
	case null:
	case undefined:
		return false
	default:
		// String
		// WARN: 色々パターンがあると思うので、怪しい挙動だったらコメントアウトする。
		if (typeof v == 'string') {
			if (Number.isNaN(Number(v))) {
				return true
			}
		}
		// NaN
		if (Number.isNaN(v)) {
			return false
		}
		return null
	}
}

function check(v) {
	console.log(`${v} is ${parseBool(v)}.`)
}

check(true) // true is true.
check('true') // true is true.
check(false) // false is false.
check('false') // false is false.
check('test') // test is true.
check(NaN) // NaN is false.
check(Number('test')) // NaN is false.
check() // undefined is false.
check(undefined) // undefined is false.
check(null) // null is false.
check(1) // 1 is true.
check(2) // 2 is null.
check(-1) // -1 is false.
check(-2) // -2 is null.
check('') //  is false.
check('-1') // -1 is false.
check('-2') // -2 is null.
check(1n) // 1 is null.

boolean 型を string 型に変換する

Boolean オブジェクトは toString() を持っている。

var t = true;
var f = false;

console.log(t.toString());
console.log(f.toString());