ProGraphs
822 subscribers
216 photos
6 videos
11 files
377 links
مجموعه مطالبی از برنامه‌نویسی وب و گرافیک

ProGraphs = Programming + Graphics
Download Telegram
🔺کمتر از سه ساعت دیگه تا شروع Google I/O 2019


امروز ۱۷ اردی‌بهشت، ساعت ۲۱:۱۵

🔸از طریق لینک زیر لایو ببینید:

https://youtu.be/lyRPyRKHO8M
🔺fontain = a font-collection (and a font-collection-system)

https://www.fontain.org/

#link #font

@ProGraphs
ProGraphs
با اجرا کردن این دو خط کد به صورت مستقیم در کنسول مرورگر، متوجه می‌شویم که خروجی آن‌ها دو مقدار متفاوت است! دلیل این موضوع را توضیح دهید #interviewquestion #js @ProGraphs
جواب:

یادآوری:
در مطلب قبلی دیدیم که عملگر‌ + دو کار می‌تواند انجام دهد: یکی concat کردن stringها، و دیگری عملیات جمع ریاضی.
اگر یکی از مقادیری که عملگر + روی آن‌ها اعمال می‌شود string باشد، یا حتی آبجکتی باشد که بتواند به string تبدیل شود، عملیات concat اتفاق می‌افتد. در غیر اینصورت، عملیات جمع ریاضی.

❗️ابتدا خط اول را بررسی می‌کنیم:
در خط اول یک آبجکت خالی داریم و یک آرایه خالی (که یک نوع آبجکت است). پس قبل از هر چیز باید هر دو مقدار به primitive تبدیل شوند:
1- برای تبدیل آرایه به primitive متد toString صدا می‌شود. می‌دانیم که متد toString که برای آرایه‌ها تعریف شده است، همه‌ی آیتم‌های آرایه را به صورت string برمی‌گرداند:
[1, 2].toString(); // "1,2"
اما چون آرایه خالی است، تبدیل به string خالی می‌شود.
تا اینجا آرایه خالی به string خالی تبدیل شد.

2- برای تبدیل آبجکت به primitive هم متد toString صدا می‌شود. اما متد toString که برای آبجکت‌های معمولی تعریف شده است، این string را برمی‌گرداند (در مطالب بررسی دقیق‌تر بررسی می‌کنیم که کابرد این string خاص چیست):
let b = {};
b.toString(); // "[object Object]"
پس آبجکت خالی هم به یک string تبدیل شد.

حالا چون دو string داریم، عملیات ‌concat انجام می‌شود:
"" + "[object Object]"

❗️اما چرا نتیجه‌ی خط دوم با خط اول متفاوت است؟
در خط دوم، عبارت را با {} را شروع کرده‌ایم. به همین دلیل جاوااسکریپت {} را به عنوان یک بلاک خالی می‌بیند و نه یک آبجکت!
پس خط دوم در واقع فقط یک آرایه خالی و عملگر + unary است (و نه عملگر جمع):
+[]

عملگر + unary روی یک مقدار اعمال می‌شود و آن را به عدد تبدیل می‌کند. پس باید آرایه خالی را به عدد تبدیل کنیم:
برای تبدیل آرایه به عدد ابتدا آرایه به صورت خودکار به primitive تبدیل می‌شود. در بالا به صورت کامل مراحل تبدیل آرایه خالی به primitive را دیدیم، پس می‌دانیم که آرایه خالی به string خالی تبدیل می‌شود. حالا string خالی به عدد تبدیل می‌شود:
[] -> "" -> 0
پس در خط دوم عدد 0 چاپ می‌شود.
ProGraphs
جواب: یادآوری: در مطلب قبلی دیدیم که عملگر‌ + دو کار می‌تواند انجام دهد: یکی concat کردن stringها، و دیگری عملیات جمع ریاضی. اگر یکی از مقادیری که عملگر + روی آن‌ها اعمال می‌شود string باشد، یا حتی آبجکتی باشد که بتواند به string تبدیل شود، عملیات concat…
تا حالا 6 مطلب راجع به coercion در جاوااسکریپت منتشر کردیم و سعی کردیم خیلی کامل و دقیق مکانیزم coercion رو بررسی کنیم.

اگر این سوال رو کامل متوجه نشدید، حتما یه نگاه به 6 مطلب قبلی راجع به coercion بندازید 😉
This media is not supported in your browser
VIEW IN TELEGRAM
با استفاده از قابلیت workspaces در گوگل کروم می‌توانیم کاری کنیم که تغییراتی که در devtools انجام می‌دهیم،‌ در فایل‌های پروژه اعمال شوند.

#quicktip #devtools

@ProGraphs
​​​​تبدیل نوع داده‌ها (coercion) در جاوااسکریپت (قسمت هفتم):

یکی دیگر از عملگرهایی که باعث می‌شود نوع داده‌ها به صورت خودکار تغییر کنند، عملگر مقایسه‌ای ">" است.
این عملگر می‌تواند به دو صورت مختلف مقایسه را انجام دهد:
1- مقایسه‌ی ریاضی:
1 < 2; // true

2- مقایسه‌ی alphabetic:
"aa" < "ab"; // true
"1" < "02"; // false
همانطور که می‌بینید در این حالت تک تک حروف string به صورت alphabetic مقایسه می‌شوند. یعنی 'a' از 'b' کوچک‌تر است.

❗️اما عملگر ">" چطور تشخیص می‌دهد که به کدام روش مقایسه را انجام دهد و چه زمانی نوع داده‌ها را تغییر می‌دهد (implicit coercion)؟
طبق spec اکمااسکریپت، این عملگر برای انجام مقایسه این مراحل را طی می‌کند:

1- برای انجام مقایسه هر دو مقدار باید primitive باشند. بنابراین اگر مقادیری که مقایسه می‌شوند از نوع آبجکت باشد، باید به primitive تبدیل شود (به مطلبی که راجع به تبدیل آبجکت به primitive منتشر کردیم مراجعه کنید)

2- حالا که مطمئنیم هر دو مقدار primitive هستند، اگر هر دو مقدار string باشند، مقایسه به صورت alphabetic انجام می‌شود.

3- اگر حتی یکی از دو مقدار از نوع string نباشد، هر دو مقدار به صورت خودکار به عدد تبدیل می‌شوند و مقایسه‌ی عددی انجام می‌شود (به کد داخل تصویر دقت کنید).

#quicktip #js #coercion

@ProGraphs
This media is not supported in your browser
VIEW IN TELEGRAM
در گوگل کروم می‌توانیم داخل یک پنجره‌ی devtools، یک devtools دیگر باز کنیم (یعنی devtools برای devtools)!

در این ویدیو با استفاده از این قابلیت فریم‌های کند برنامه را پیدا می‌کنیم.

#quicktip #devtools #trick

@ProGraphs
🔺از سایت Color Designer در ساخت پالت‌های رنگی برای محصول کمک بگیرید.

https://colordesigner.io/

#link #color #palette #generator

@ProGraphs
با اجرای این کد چه مقادیری در کنسول چاپ می‌شود؟
(به ترتیب از چپ به راست)

#interviewquestion #js

@ProGraphs
ProGraphs
با اجرای این کد چه مقادیری در کنسول چاپ می‌شود؟ (به ترتیب از چپ به راست) #interviewquestion #js @ProGraphs
جواب: 'false-false'

زمانی که دو طرف تساوی از یک نوع داده هستند، عملگرهای == و === دقیقا یکسان عمل می‌کنند.
بنابراین با توجه به اینکه هر دو مقدار از نوع آبجکت هستند. جواب نمی‌تواند true-false یا false-true باشد!

از طرفی وقتی دو آبجکت را مقایسه می‌کنیم، صرفا reference آن‌ها مقایسه می‌شود. و نه تک تک پراپرتی‌های آن‌ها.

به کد سوال دقت کنید:
دو آبجکت متفاوت داریم (referenceهای متفاوت دارند) که پراپرتی‌های آن‌ها دقیقا یکسان است.
اما گفتیم که پراپرتی‌های دو آبجکت اصلا مقایسه نمی‌شوند و برای برابر بودن دو آبجکت باید reference آن‌ها یکسان باشد.

بنابراین دو بار عبارت 'false' در کنسول چاپ می‌شود.
🔺نتایج نظرسنجی برنامه‌نویسان در سایت StackOverflow (سال 2019)

https://kutt.it/dHsOax

#link #survey

@ProGraphs
​تبدیل نوع داده‌ها (coercion) در جاوااسکریپت (قسمت هشتم):

در انتهای مطالب coercion، عملگر "==" را بررسی می‌کنیم. همانطور که در مطالب قبلی دیدیم، اگر دو مقداری که با استفاده از عملگر "==" مقایسه می‌کنیم، از یک نوع داده نباشند، به صورت خودکار نوع داده‌ی مقادیر تغییر می‌کند تا مقایسه بین دو مقدار با نوع داده‌ی یکسان انجام شود.

❗️این موضوع در بعضی موارد نتایج کاملا گیج کننده‌ای را رقم می‌زند.
برای مثال:
20 == true; // false

در این کد یک مقدار از نوع boolean است و مقدار دیگر از نوع عدد. طبیعتاً انتظار داریم عدد 20، به مقدار true تبدیل شود و نتیجه‌ی مقایسه true شود.

اما با مراجعه به spec اکمااسکریپت، متوجه می‌شویم که اگر یک مقدار دیگر را با true یا false مقایسه کنیم، به جای اینکه مقدار مورد نظر به boolean تبدیل شود، مقدار boolean به عدد تبدیل می‌شود!
پس در این کد ابتدا مقدار true به عدد 1 تبدیل می‌شود و سپس عدد 1 و 20 مقایسه می‌شوند و نتیجه‌ی مقایسه false می‌شود.

❗️اما گاهی این کارکرد عملگر "=="، منطقی و مفید است.
برای مثال:
null == undefined; // true
همانطور که در این کد می‌بینید، وقتی با استفاده از عملگر "==" مقایسه را انجام می‌دهیم، دو مقدار null و undefined می‌توانند به یکدیگر تبدیل شوند.
به این ترتیب لازم نیست برابر بودن یک مقدار را هم با null و هم با undefined چک کنیم (به کد داخل تصویر دقت کنید)

#quicktip #js #coercion

@ProGraphs
در این کد می‌دانیم که پراپرتی width در یک transition تغییر خواهد کرد.
بنابراین از will-change استفاده کرده‌ایم تا مرورگر را از این موضوع با خبر کنیم.

آیا این کار تاثیری در عملکرد transition دارد؟

#interviewquestion #css #performance

@ProGraphs
🔺هر روز خفن‌تر از قبل، خودتون برید و ببینید. 😏

https://undraw.co/illustrations

#link #illustration

@ProGraphs
ProGraphs
در این کد می‌دانیم که پراپرتی width در یک transition تغییر خواهد کرد. بنابراین از will-change استفاده کرده‌ایم تا مرورگر را از این موضوع با خبر کنیم. آیا این کار تاثیری در عملکرد transition دارد؟ #interviewquestion #css #performance @ProGraphs
جواب:

یادآوری: در یکی از مطالب قبلی دیدیم که مرورگر برای نمایش صفحه، چهار مرحله‌ی style calculation و layout و paint و compositing را انجام می‌دهد.

همچنین دیدیم که تغییر پراپرتی‌هایی مثل left, top, width, ... مرورگر را مجبور به تکرار مراحل layout و paint و compositing می‌کند.
در حالی که تغییر پراپرتی transform مرورگر را تنها مجبور به تکرار مرحله‌ی compositing می‌کند.

فرض کنید در یک انیمیشن، پراپرتی transform یک عنصر را تغییر می‌دهیم. با توجه به اینکه این انیمیشن باعث repaint شدن عنصر نمی‌شود، مرورگر می‌تواند این عنصر را در یک لایه‌ی جداگانه نمایش دهد و صرفا لایه‌ی مورد نظر را جابه جا کند (در مطالب بعدی بیشتر راجع به لایه‌ها و تاثیر آن‌ها در performance صحبت می‌کنیم).

همچنین ما به عنوان دولوپر می‌توانیم با استفاده از will-change به مرورگر اطلاع دهیم که پراپرتی transform قرار است تغییر کند. به این ترتیب مرورگر می‌تواند عنصر مورد نظر را از قبل در یک لایه‌ی جداگانه نمایش دهد و مجبور نباشد دقیقا قبل از انیمیشن این کار را انجام دهد:
will-change: transform;

❗️حالا دوباره به کد سوال دقت کنید:
گفتیم که تغییر پراپرتی width مرورگر را مجبور به repaint کردن عنصر می‌کند. بنابراین مرورگر این عنصر را در یک لایه‌ی جداگانه نمایش نمی‌دهد. و "احتمالا" استفاده از پراپرتی will-change تاثیری در performance نخواهد داشت و بی معنی است.
ProGraphs
جواب: یادآوری: در یکی از مطالب قبلی دیدیم که مرورگر برای نمایش صفحه، چهار مرحله‌ی style calculation و layout و paint و compositing را انجام می‌دهد. همچنین دیدیم که تغییر پراپرتی‌هایی مثل left, top, width, ... مرورگر را مجبور به تکرار مراحل layout و paint…
به کلمه‌ی "احتمالا" در جمله‌ی آخر دقت کنید!
در CSS Specification دقیقا مشخص نشده که استفاده کردن از کدوم مقادیر برای will-change بی‌تاثیر هست. و بعید نیست تو نسخه‌های بعدی مرورگرها چیزی که تو این مطلب دیدیم درست نباشه.

اما نکته سوال اینجاست که باید دقیقا بدونیم برای چی از will-change استفاده می‌کنیم. و بدون علت از تکنیک‌های بهبود performance مثل will-change استفاده نکنیم.