3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

javascript の不思議な比較、または比較演算子

Last updated at Posted at 2020-07-18

javascript の Syntax で不思議なところをまとめ直してみました。文末に参照元のサイト列挙しています。
参照元の情報をもとに、手元で動かしながらいくつか検証を追加しています。

また、今回ついでの deno でも同様の挙動か確認しました。 deno でも同じ挙動であることが確認できています。JavaScript エンジンに、 Node.js と同じ V8 を採用をしているので当然といえば当然のことなんですが‥

改行位置が違うと別ものとして判定される


function foo(){
  return
  {
    foo: 'bar'
  }
}

function bar(){
  return
  {
    foo: 'bar'
  }
}

typeof foo() === typeof bar()

// true

function foo(){
  return
  {
    foo: 'bar'
  }
}

function bar(){
  return {
    foo: 'bar'
  }
}

typeof foo() === typeof bar()

// false

なぜなら、return のあと改行があるので undefined が返されるから。
こんな感じで()を入れてあげると同様になります。

function foo(){
  return (
  	{
    	foo: 'bar'
  	}
  )
}

function bar(){
  return {
    foo: 'bar'
  }
}

typeof foo() === typeof bar()

配列は参照

1 == 1; //true
'foo' == 'foo'; //true
[1,2,3] == [1,2,3]; //false

ちなみに === でも同様です。

1 === 1; //true
'foo' === 'foo'; //true
[1,2,3] === [1,2,3]; //false

理由は配列は参照なので。javasciript においてArray は Object。 Objectは 参照によって複製されます。

let array1 = [1];
let array2 = array1;
array1.push(2)

array1 // [1, 2]
array2 // [1. 2]

なので

let array1 = [1, 2, 3]
let array2 = array1

array1 === array2 // true

だけど

let array1 = [1, 2, 3]
let array2 = [1, 2, 3]

array1 === array2 // false

は false ということです。

const array1String = JSON.stringify(array1)
const array1String = JSON.stringify(array2)

array1String === array2String // true

無理に比較するのであればこういう感じですね。

余談ですが、javascript ではオブジェクト型でないデータ構造のことをプリミティブデータ型と呼び、
6 種類のプリミティブデータ型があります。文字列、数値、BigInt、真偽値、undefined、そしてシンボルです。

== と === の違い 1

これは true。

new Array(3) == ",,"; //true

なぜなら

new Array(3).toString(); //",,"

なので、こちらは === で区別できます。

new Array(3) === ",,"; //false

== と === の違い 2


[] == ![]; // -> true
[] === ![]; // -> false

これは、[] を ==で比較するときに数字の0に置き換えられるからです。

false == 0; // -> true
false === 0; // -> false

も成立するので…

true == []; // -> false
true == ![]; // -> false

false == []; // -> true
false == ![]; // -> true

こんな事になったりします。

== と === の違い 3

!!"false" == !!"true"; // -> true
!!"false" === !!"true"; // -> true
!!false == !!true; // -> false
!!false === !!true; // -> false

これは両方文字列が変換されるためです。引っ掛け問題みたいですが。

!'true' // false
!'false' // false

ということです。

オブジェクトの比較

const o1 = {};
const o2 = {};

o1 == o2 //false
o1 === o2 //false

ここまでは、オブジェクトデータ型の比較でやりましたが、比較演算子では全て true になります。

o1 >= o2 //true
o1 <= o2 //true
o1 != o2 //true
o1 !== o2 //true

ref. https://blog.mgechev.com/2013/02/22/javascript-the-weird-parts/
ref. https://github.com/denysdovhan/wtfjs

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?