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