بیایید بگوییم که من یک متغیر گزینه دارم و می خواهم مقدار پیش فرض را تنظیم کنم.
فایده / اشکال این دو گزینه چیست؟
با استفاده از گسترش شیء
یا با استفاده از Object. assign
این تعهدی است که باعث تعجب من شد.
همچنین می تواند در صورتی که در محیط های بدون پشتیبانی بومی اجرا کنید ، چگونه می خواهید از آن پشتیبانی کنید. نحو ممکن است فقط بتوانید کامپایل کنید. یک شی یا روشی که ممکن است به آن نیاز داشته باشید.
جدا از مسائل سازگاری ، Object. Assign می تواند شیء اصلی را که مفید است جهش دهد. گسترش نمی تواند.
برای روشن شدن نظر @Pstanteon - Object. Assign می تواند یک هدف هدف موجود را اصلاح کند (خصوصیات رونویسی از منبع ، در حالی که سایر خواص را دست نخورده می گذارد). این موضوع منبع را لمس نمی کند. من ابتدا "شیء اصلی" او را به عنوان "منبع منبع" خواندم ، بنابراین نوشتن این یادداشت برای هر کس دیگری که به طور مشابه آن را اشتباه خوانده است.:)
16 پاسخ 16
این لزوماً جامع نیست.
نحو گسترش
مزایای:
اگر نویسنده کد برای اجرای در محیط های بدون پشتیبانی بومی است ، ممکن است بتوانید این نحو را فقط کامپایل کنید (بر خلاف استفاده از پلی پیل).(به عنوان مثال با بابل.)
مضرات:
وقتی این پاسخ در ابتدا نوشته شد ، این یک پیشنهاد بود ، استاندارد نشده بود. هنگام استفاده از پیشنهادات ، اگر اکنون با آن کد می نویسید ، چه کاری انجام می دهید و با حرکت به سمت استاندارد سازی ، استاندارد نمی شود یا تغییر نمی کند. این از آن زمان در ES2018 استاندارد شده است.
تحت اللفظی ، پویا نیست.
Object. Assign ()
مزایای:
مضرات:
- بیشتر لفظی
- در صورت ارسال کد برای اجرای در محیط های بدون پشتیبانی بومی ، نیاز به Polyfill دارید.
این تعهدی است که باعث تعجب من شد.
این به طور مستقیم با آنچه می پرسید مرتبط نیست. این کد از Object. assign () استفاده نمی کرد ، از کد کاربر (Assign-Assign) استفاده می کرد که همین کار را می کند. به نظر می رسد آنها در حال تهیه آن کد با بابل هستند (و آن را با صفحه وب همراه می کنند) ، این همان چیزی است که من در مورد آن صحبت می کردم: نحوی که فقط می توانید کامپایل کنید. آنها ظاهراً ترجیح می دهند که این امر را به عنوان وابستگی به عنوان وابستگی که به ساخت آنها می رود ، درج کنند.
شاید شایان ذکر باشد که گسترش اشیاء به مرحله 3 منتقل شده است ، بنابراین احتمالاً در آینده توییتر. com. com/sebmarkbage/status/781564713750573056 استاندارد خواهد شد
omar خوب من حدس می زنم که شما فقط ثابت کرده اید که این یک نظر است :) اگر کسی آن مزیت را تشخیص نداد ، بله ، همه چیز برابر است که فقط می توانند از Object. assign () استفاده کنند. یا می توانید به صورت دستی بیش از یک مجموعه از اشیاء و غرفه های خودشان به صورت دستی آنها را به یک هدف اختصاص دهید و آن را حتی بیشتر به صورت شفابخشی کنید.
برای مرجع استراحت/گسترش در ECMAScript 2018 به عنوان مرحله 4 نهایی شده است. این پیشنهاد را می توان در اینجا یافت.
در بیشتر قسمت ها ، شیء شیء را به همان روش اختصاص و گسترش می دهد ، تفاوت اصلی این است که PRESPALL ویژگی ها را تعریف می کند ، در حالی که Object. assign () آنها را تنظیم می کند. این به معنای شیء است.
لازم به یادآوری است که غیر از این ، نقشه های استراحت/پخش 1: 1 به Object. assign () و متفاوت با آرایه (قابل تکرار) عمل می کند. به عنوان مثال ، هنگام پخش مقادیر تهی آرایه گسترش می یابد. با این حال با استفاده از مقادیر تهی گسترش شیء ، سکوت به هیچ چیز پخش نمی شود.
نمونه پخش آرایه (قابل تکرار)
مثال گسترش شیء
این مطابق با نحوه عملکرد شیء است.
This is the right answer. The main different is Object.assign will use setters. Object.assign(, b:2>،) ؛// در مقابل.<. , b:2>, . >; //
تظاهرات تهی متفاوت "سیب و پرتقال" است - یک مقایسه معنی دار نیست. در مورد آرایه ، تهی عنصر آرایه است. در مورد گسترش ، تهی کل شی است. مقایسه صحیح برای X وجود دارد که یک خاصیت تهی داشته باشد: const x = ؛بشردر این صورت ، AFAIK ، ما رفتار را دقیقاً مانند آرایه می بینیم: //.
با تشکر - با این تغییر ، من نکته ای را که شما بیان می کنید می بینم. گسترش شیء از یک شیء تهی شکایت نمی کند ، به سادگی از آن می پرید ، اما در صورت تلاش برای پخش یک شیء تهی ، گسترش آرایه به TypeError می دهد.
من فکر می کنم یک تفاوت بزرگ بین اپراتور گسترش و شیء. Assign که به نظر نمی رسد در پاسخ های فعلی ذکر شود این است که اپراتور گسترش نمونه اولیه منبع منبع را در شی هدف کپی نمی کند. اگر می خواهید خواص خود را به یک شی اضافه کنید و نمی خواهید از چه نمونه ای تغییر دهید ، پس باید از Object. Assign استفاده کنید.
ویرایش: من واقعاً فهمیدم که مثال من گمراه کننده است. اپراتور گسترش به Object. assigars با اولین پارامتر تنظیم شده روی یک شی خالی. در مثال کد من در زیر ، من خطا را به عنوان اولین پارامتر Object. Assign تماس می گیرم تا این دو معادل نباشند. اولین پارامتر Object. Assign در واقع اصلاح شده و سپس برگردانده می شود به همین دلیل نمونه اولیه خود را حفظ می کند. من مثال دیگری را در زیر اضافه کرده ام:
"نمونه اولیه را دست نخورده نگه نمی دارد" - مطمئناً این کار را تغییر نمی دهد. در مثال شما ، ErrorextendedUsingAssign === خطا ، اما ErrorextendedUsingSpread یک شیء جدید است (و نمونه اولیه کپی نشده است).
maaartinus شما درست است ، من احتمالاً این حرف را بد کردم. منظورم این بود که نمونه اولیه روی شیء کپی نشده نیست. من ممکن است آن را ویرایش کنم تا واضح تر باشد.
آیا روش زیر برای "کلون کم عمق" یک شی با کلاس خود است؟اجازه دهید Target = Object. Create (منبع) ؛Object. Assign (هدف ، منبع) ؛
toolmakersteve بله ، تمام "خصوصیات خود" شیء را کپی می کند که در آن به طور مؤثر یک کلون کم عمق خواهد بود. نگاه کنید به: stackoverflow. com/questions/33692912/…
wortwart من فکر می کنم تفاوت در واقع این است که اپراتور گسترش بر شی منبع (خطا در این مورد) تأثیر نمی گذارد که به عنوان شیء. Assign شیء منبع را تغییر داده و آن را برگرداند. اپراتور پخش واقعاً فقط قند برای Object است. با اولین پارامتر تنظیم شده به Object Object (github. com/tc39/proposal-object-rest-spread/blob/master/led) تنظیم کنید.
توجه: گسترش فقط قند نحوی در اطراف شی نیست. آنها در پشت صحنه بسیار متفاوت عمل می کنند.
Object. Assign تنظیم کننده ها را به یک شیء جدید اعمال می کند ، گسترش نمی یابد. علاوه بر این ، شی باید قابل تکرار باشد.
در صورت نیاز به مقدار شیء همانطور که در این لحظه به مقدار شی نیاز دارید ، از این کپی کنید و نمی خواهید این مقدار هرگونه تغییراتی را که توسط سایر صاحبان شی ایجاد شده است ، منعکس کند.
از آن برای ایجاد یک کپی کم عمق از شیء خوب استفاده کنید تا همیشه ویژگی های تغییر ناپذیر را برای کپی کردن تنظیم کنید - زیرا نسخه های قابل تغییر را می توان به خصوصیات تغییر ناپذیر منتقل کرد ، کپی اطمینان می دهد که شما همیشه با یک شی تغییر ناپذیر برخورد خواهید کرد
Assign Assign تا حدودی برعکس برای کپی کردن است. Assign یک تنظیم کننده ایجاد می کند که مقدار آن را مستقیماً به متغیر نمونه اختصاص می دهد ، نه اینکه کپی یا حفظ آن باشد. هنگام تماس با گیرنده یک ویژگی اختصاصی ، مرجع داده های واقعی را برمی گرداند.
چرا می گوید "کپی"؟این عناوین جسورانه چیست؟احساس می کنم وقتی این مطلب را خواندم ، زمینه را از دست داده ام.
دیوانه است که فقط این پاسخ به این واقعیت می پردازد که از دست دادن برابری مرجع در هنگام استفاده از اپراتور گسترش وجود دارد و این دومین پاسخ کم ارزش در اینجا است.
تفاوت زیادی بین این دو وجود دارد ، با عواقب بسیار جدی. بیشترین سؤالات حتی این موضوع را لمس نمی کند ، و اطلاعات مربوط به گسترش شیء یک پیشنهاد دیگر در سال 2022 مهم نیست.
تفاوت این است که Object. Assign شیء را در محل تغییر می دهد ، در حالی که اپراتور پخش (.) یک شیء کاملاً جدید ایجاد می کند ، و این برابری مرجع شی را می شکند.
اول ، بیایید اثر را ببینیم ، و سپس نمونه ای از دنیای واقعی را درک می کنم که درک این تفاوت اساسی چقدر مهم است.
ابتدا بیایید از Object. assign استفاده کنیم:
اکنون همان تمرین با اپراتور پخش:
آسان است که ببینید چه اتفاقی می افتد ، زیرا در ParentObject. ChildObject =<. >ما پاک می کنیم که ارزش کلید childobject را در ParentObject به یک شیء کاملاً جدید واگذار می کنیم ، و این واقعیت که توسط محتوای قدیمی ChildObject ساخته شده است بی ربط است. این یک شی جدید است.
و اگر فرض می کنید که این امر در عمل بی ربط است ، بگذارید سناریوی دنیای واقعی را نشان دهم که درک این موضوع چقدر مهم است.
در یک برنامه بسیار بزرگ vue. js ، ما هنگام تایپ نام مشتری در یک قسمت ورودی ، شاهد لاغری زیادی هستیم.
پس از اشکال زدایی زیاد ، فهمیدیم که هر کاراکتر در آن ورودی تایپ می کند ، یک دسته از خصوصیات محاسبه شده را برای ارزیابی مجدد ایجاد می کند.
این پیش بینی نشده بود ، زیرا نام مشتری به هیچ وجه در آن توابع محاسباتی استفاده نشده است. فقط از داده های دیگر مشتری (مانند سن ، رابطه جنسی) استفاده می شد. شروع چه بود؟چرا وقتی نام مشتری تغییر کرد ، Vue دوباره همه آن عملکردهای محاسبه شده را ارزیابی کرد؟
خوب ، ما یک فروشگاه Vuex داشتیم که این کار را انجام داد:
و محاسبه ما مانند این بود:
بنابراین ، voilá! هنگامی که نام مشتری تغییر کرد ، جهش Vuex در واقع آن را به طور کامل به یک شیء جدید تغییر می داد. و از آنجا که محاسبه شده به آن شیء برای به دست آوردن سن مشتری اعتماد کرد ، VUE روی آن نمونه بسیار خاص به عنوان یک وابستگی حساب شد و هنگامی که به یک شیء جدید تغییر یافت (در صورت عدم تست برابری شیء ===) ، VUE تصمیم گرفت که این بودزمان اجرای مجدد عملکرد محاسبه شده.
رفع؟از Object. Assign استفاده کنید تا شیء قبلی را دور نکشید ، بلکه آن را در جای خود تغییر دهید.
BTW ، اگر در VUE2 هستید ، نباید از Object. assign استفاده کنید زیرا Vue 2 نمی تواند آن شیء را مستقیماً ردیابی کند ، اما همان منطق اعمال می شود ، فقط با استفاده از Vue. set به جای Object. assign:
تحليلات الفوركس...
ما را در سایت تحليلات الفوركس دنبال می کنید
برچسب :
نویسنده : یکتا ناصر
بازدید : <-PostHit->
تاريخ : جمعه
26 اسفند
1401 ساعت: 17:25