javascript - מה המשמעות של `void 0`?


קראתי דרך קוד המקור של Backbone.js, וראיתי את זה:

validObj[attr] = void 0;

מה זה void 0? מה המטרה של שימוש בזה כאן?

תשובה #1

מה המשמעות של void 0?

void[MDN] הוא מילת מפתח קידמית שלוקחת ארגומנט אחד ותמיד מחזירה undefined.

דוגמאות

console.log(void 0);
console.log(void (0));
console.log(void "hello");
console.log(void (new Date()));
//all will return undefined

מה הטעם בזה?

זה נראה די חסר תועלת, לא כן? אם זה תמיד מחזיר undefined, מה רע פשוט להשתמש ב-undefined?

בעולם מושלם היינו מסוגלים להשתמש בבטחה ב-undefined: זה הרבה יותר פשוט וקל להבנה מאשר void 0. אבל במקרה שמעולם לא שמת לב לכך קודם, זה לא עולם מושלם, במיוחד כשזה מגיע ל-JavaScript.

הבעיה בשימוש ב-undefined הייתה ש-undefined אינו מילה שמורה (בעצם היא תכונה של האובייקט הגלובלי [wtfjs]). כלומר, undefined הוא שם משתנה מותר, ולכן אפשר להקצות לו ערך חדש לפי רצונך.

(function () {

console.log(undefined); // logs "undefined"
var undefined = "new value";
console.log(undefined); // logs "new value"

})();

הערה: זו כבר לא בעיה בסביבה שתומכת ב-ECMAScript 5 או גרסה חדשה יותר (כלומר, למעשה בכל מקום חוץ מ-IE 8), אשר מגדירה את התכונה undefined של האובייקט הגלובלי כקריאה בלבד (כך שניתן רק להסתיר את המשתנה בטווח המקומי שלך). עם זאת, מידע זה עדיין שימושי למטרות תאימות לאחור.

(function () {

console.log(window.hasOwnProperty('undefined')); // logs "true"
console.log(window.undefined); // logs "undefined"
console.log(undefined === window.undefined); // logs "true"
var undefined = "new value";
console.log(undefined); // logs "new value"
console.log(undefined === window.undefined); // logs "false"

})();

void, מצד שני, לא ניתן להקצות לו מחדש. void 0 תמיד יחזיר undefined. undefined, מצד שני, יכול להיות כל מה שמר JavaScript מחליט שהוא רוצה שהוא יהיה.

למה בדיוק void 0?

למה כדאי לנו להשתמש ב-void 0? מה כזה מיוחד ב-0? לא נוכל פשוט להשתמש ב-1, או ב-42, או ב-1000000 או ב-"Hello, world!"?

והתשובה היא, כן, אנחנו יכולים, וזה יעבוד באותה מידה טוב. היתרון היחיד של העברת 0 במקום ארגומנט אחר הוא ש-0 קצר ואידיאומטי.

למה זה עדיין רלוונטי?

למרות ש-undefined ניתן בדרך כלל לסמוך עליו בסביבות JavaScript מודרניות, יש יתרון טריוויאלי אחד ל-void 0: הוא קצר יותר. ההבדל אינו מספיק כדי לדאוג בעת כתיבת קוד, אך הוא יכול להצטבר במידה מספקת בבסיסי קוד גדולים עד שרוב המיניפיירים של קוד מחליפים את undefined ב-void 0 כדי להפחית את מספר הבייטים שנשלחים לדפדפן.

תשובה #2

void 0 מחזיר undefined ולא ניתן לכתוב עליו מחדש בעוד ש-undefined ניתן לכתיבה מחדש.

var undefined = "HAHA";

תשובה #3

void הוא מילה שמורה ב-JavaScript. היא מעריכה את הביטוי ותמיד מחזירה undefined.