การเปรียบเทียบแบบตื้นคือเมื่อทำการเปรียบเทียบคุณสมบัติของวัตถุโดยใช้ "===" หรือความเสมอภาคที่เข้มงวดและจะไม่ทำการเปรียบเทียบที่ลึกลงไปในคุณสมบัติ เช่น
function shallowCompare(newObj, prevObj){
for (key in newObj){
if(newObj[key] !== prevObj[key]) return true;
}
return false;
}
var game_item = {
game: "football",
first_world_cup: "1930",
teams: {
North_America: 1,
South_America: 4,
Europe: 8
}
}
var updated_game_item1 = {
game: "football",
first_world_cup: "1930",
teams: {
North_America: 1,
South_America: 4,
Europe: 8
}
}
shallowCompare(updated_game_item1, game_item);
แม้ว่าทั้งสองวัตถุที่ดูเหมือนจะเป็นเดียวกันไม่ได้เป็นเช่นเดียวกับการอ้างอิงgame_item.teams
updated_game_item.teams
เพื่อให้วัตถุ 2 ชิ้นเหมือนกันควรชี้ไปที่วัตถุเดียวกัน ด้วยเหตุนี้จึงส่งผลให้สถานะได้รับการประเมินให้อัปเดต
var updated_game_item2 = {
game: "football",
first_world_cup: "1930",
teams: game_item.teams
}
shallowCompare(updated_game_item2, game_item);
คราวนี้ทุกคุณสมบัติจะคืนค่าจริงสำหรับการเปรียบเทียบที่เข้มงวดเนื่องจากคุณสมบัติของทีมในวัตถุใหม่และเก่าชี้ไปที่วัตถุเดียวกัน
var updated_game_item3 = {
first_world_cup: 1930
}
shallowCompare(updated_game_item3, game_item);
updated_game_item3.first_world_cup
คุณสมบัติไม่ผ่านการประเมินผลอย่างเข้มงวดเป็น 1930 เป็นจำนวนในขณะที่game_item.first_world_cup
เป็นสตริง หากการเปรียบเทียบหลวม (==) สิ่งนี้จะผ่านไป อย่างไรก็ตามสิ่งนี้จะส่งผลให้มีการอัปเดตสถานะด้วย
หมายเหตุเพิ่มเติม:
- การเปรียบเทียบเชิงลึกจะไม่มีจุดหมายเนื่องจากจะส่งผลอย่างมากต่อประสิทธิภาพหากออบเจ็กต์สถานะซ้อนกันอยู่ลึก ๆ แต่ถ้ามันไม่ซ้อนกันเกินไปและคุณยังต้องการการเปรียบเทียบอย่างลึกซึ้งให้นำไปใช้ใน shouldComponentUpdate และตรวจสอบว่าเพียงพอหรือไม่
- คุณสามารถเปลี่ยนสถานะวัตถุได้โดยตรง แต่สถานะของส่วนประกอบจะไม่ได้รับผลกระทบเนื่องจากอยู่ในโฟลว์เมธอด setState ที่ตอบสนองจะใช้ hooks รอบการอัปเดตส่วนประกอบ หากคุณอัปเดตออบเจ็กต์สถานะโดยตรงเพื่อหลีกเลี่ยง hooks วงจรชีวิตของส่วนประกอบโดยเจตนาคุณอาจใช้ตัวแปรหรืออ็อบเจกต์ธรรมดาเพื่อเก็บข้อมูลไม่ใช่ออบเจ็กต์สถานะ