Comparing value in JavaScript

Lattapon Yodsuwan
Nov 13, 2016 · 2 min read

การเปรียบเทียบค่า เป็นสิ่งที่โปรแกรมเมอร์ทำกันเสมอ อาจใช้เพื่อดูว่าค่าในตัวแปรเป็นค่าที่เราต้องการหรือเปล่า หรืออาจใช้เพื่อดูว่าค่าที่รับเข้ามาเข้าเงื่อนไขใตในโปรแกรมหรือไม่

==, ===

การเปรียบเทียบอย่างหนึ่งที่ใช้บ่อยก็คือเท่ากับ (Equality) นี่แหละ แต่มันสามารถเขียนได้สองแบบคือ == และ === แล้วทั้งสองแบบนี้มันต่างกันอย่างไรล่ะ

หลายคนอาจบอกว่า == จะสนใจแค่ value เท่านั้น โดยไม่สนใจ type และ === จะสนใจทั้ง value และ type

เป็นคำอธิบายที่ใช่แต่ยังไม่ทั้งหมด (ผมก็เพิ่งรู้นี่แหละ) เพราะความจริงแล้ว การเปรียบเทียบด้วย == มันบังคับให้เปลี่ยน type ของ value ให้เหมือนกันเพื่อให้เปรียบเทียนได้ต่างห่างล่ะ (Coercion)

ลองดูตัวอย่างกันหน่อย

var a = 10
var b = "10"
a == b // true
a === b // false

จากตัวอย่างข้างบน จะเห็น type ของ a เป็น Number และ type ของ b เป็น String เมื่อเปรียบเทียบด้วย === (strict equality) จะได้ false เพราะว่า type ต่างกัน แต่เมื่อเปรียบเทียบด้วย == จะได้เป็น true เพราะมีการเปลี่ยน type ของ value ตัวหนึ่งให้เหมือนกับอีกตัวหนึ่ง

ใครเปลี่ยน?

คำถามเล็กๆ คือ แล้ว value ไหนล่ะ ที่ถูกบังคับให้เปลี่ยน type เพื่อให้เหมือนอีกตัวหนึ่ง คำตอบนี้มีอยู่ใน spec ของ EcmaScript เวอร์ชัน 5.1 ข้อ 11.9.3 ข้อย่อยที่ 4 และ 5 ครับ

เมื่อเราเปรียบเทียบ Number และ String ด้วย == value ที่เป็น string จะถูกบังคับ (coerced) ให้เปลี่ยน type เป็น Number แล้วค่อยนำมาเปรียบเทียบอีกทีครับ

ลองดูอีกตัวอย่างกัน

var a = [1,2,3]
var b = [1,2,3]
var c = "1,2,3"
a === b // false
a == b // false
a == c // true
b == c // true

ทำไม a == b ถึงเป็น false

เพราะ Array ใน JavaScript เป็น object ชนิดหนึ่งครับซึ่ง object เมื่อถูกสร้างมันจะเก็บค่าจริงแยกไว้แล้ว assign reference ให้ variable แทน และการเปรียบเทียบด้วย == หรือ === เมื่อเอามาเปรียบเทียบ object มันจะเปรียบเทียบแค่ว่า reference ไปที่เดียวกันหรือเปล่า ไม่ได้เปรียบเทียบ value ที่ reference ไปแต่อย่างใด

ทำไม a == c และ b == c ถึงเป็น true

เพราะ Array เมื่อนำมาเปรียบเทียบกับ String จะถูกบังคับให้แปลงเป็น String ในแบบของ Array.join(“,”) ครับ ซึ่งแปลงแล้วได้ค่าเดียวกับ c เมื่อเปรียบเทียบกันจึงได้เป็น true

>, >=, <, <=

ทำนองเดียวกันกับ == และ === การเปรียบเทียบด้ว >, >=, <, <= ก็ทำงานไม่ต่างกันครับ

ลองมาดูตัวอย่างกันอีกที

var a = 42
var b = "FOO"
a < b // false
a > b // false
a == b // false

จากตัวอย่าง เมื่อนำ a และ b มาเปรียบเทียบ b จะถูกบังคับเปลี่ยน type เป็น Number ซึ่งจะได้ค่าเป็น NaN ซึ่งพอนำมาเปรียบเทียบกับ a จึงเป็น false

หวังว่าจะเป็นประโยชน์กับหลายๆ คนครับ :D

Wisesight Engineering

Articles from Wisesight Development Team

Lattapon Yodsuwan

Written by

Programmer.

Wisesight Engineering

Articles from Wisesight Development Team