If you want to stay in touch with the latest developments in any field, you should be aware of the conferences and events regarding those topics. Thanks to the pandemic, all the conferences and events have taken the online route. Well, the best part is that it has become accessible to everyone. You do not even have to apply for official leaves to attend them.
CREATE TABLE Employees ( EmployeeId INT IDENTITY PRIMARY KEY, Name VARCHAR(50), HireDate DATE NOT NULL, Salary INT NOT NULL ) GO INSERT INTO Employees (Name, HireDate, Salary) VALUES ('Alice', '2011-01-01', 20000), ('Brent', '2011-01-15', 19000), ('Carlos', '2011-02-01', 22000), ('Donna', '2011-03-01', 25000), ('Evan', '2011-04-01', 18500) GO
Select EmployeeId,Name,Salary,HireDate, First_VALUE(HireDate) OVER(ORDER BY Salary RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS First, Min(HireDate) OVER(ORDER BY Salary RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS Min FROM Employees ORDER BY EmployeeId GO
Type Safety
string text = “String value”; int textLength = text.Length; int textMonth = text.Month; // won’t compile
public interface IGeometricShape { double Circumference { get; } double Area { get; } } public class Square : IGeometricShape { public double Side { get; set; } public double Circumference => 4 * Side; public double Area => Side * Side; } public class Circle : IGeometricShape { public double Radius { get; set; } public double Circumference => 2 * Math.PI * Radius; public double Area => Math.PI * Radius * Radius; } IGeometricShape circle = new Circle { Radius = 1 }; Square square = ((Square)circle); // no compiler error var side = square.Side;
Dynamic Binding
dynamic text = “String value”; int textLength = text.Length; int textMonth = text.Month; // throws exception at runtime
public dynamic GetAnonymousType() { return new { Name = “John”, Surname = “Doe”, Age = 42 }; } dynamic value = GetAnonymousType(); Console.WriteLine($”{value.Name} {value.Surname}, {value.Age}”);
string json = @" { ""name"": ""John"", ""surname"": ""Doe"", ""age"": 42 }"; dynamic value = JObject.Parse(json); Console.WriteLine($"{ value.name} { value.surname}, { value.age}");
ExpandoObject
dynamic person = new ExpandoObject(); person.Name = "John"; person.Surname = "Doe"; person.Age = 42; person.ToString = (Func<string>)(() => $”{person.Name} {person.Surname}, {person. Age}”); Console.WriteLine($"{ person.Name}{ person.Surname}, { person.Age}");
برای اینکه ببینیم در زمان اجرا چه اعضایی به این شی اضافه شده، میتوان نمونه ساخته شده از آن را به نوع <IDictionary<string, object تبدیل و در یک حلقه به آنها دسترسی پیدا کرد. از همین طریق هم میشود عضوی را حذف کرد.
var dictionary = (IDictionary<string, object>)person; foreach (var member in dictionary) { Console.WriteLine($”{member.Key} = {member.Value}”); } dictionary.Remove(“ToString”);
DynamicObject
از آنجایی که ExpandoObject برای سناریوهای ساده کاربرد دارد و کنترل کمتری بر روی اعضا و نمونههای ایجاد شدهی توسط آن داریم، میتوان از شیء DynamicObject استفاده کرد؛ البته نیاز به کدنویسی بیشتری دارد. پیادهسازی اعضا برای شیء DynamicObject در یک کلاس صورت میگیرد که در زیر آورده شدهاست:
class MyDynamicObject : DynamicObject { private readonly Dictionary<string, object> members = new Dictionary<string, object>(); public override bool TryGetMember(GetMemberBinder binder, out object result) { if (members.ContainsKey(binder.Name)) { result = members[binder.Name]; return true; } else { result = null; return false; } } public override bool TrySetMember(SetMemberBinder binder, object value) { members[binder.Name] = value; return true; } public bool RemoveMember(string name) { return members.Remove(name); } } dynamic person = new MyDynamicObject(); person.Name = “John”; person.Surname = “Doe”; person.Age = 42; person.AsString = (Func<string>)(() => $”{person.Name} {person.Surname}, {person. Age}”);
امکان ساخت قالب برای پروژههای NET Core.
dotnet new -i %~dp0
C:\Projects\DNTIdentity-master>dotnet new -i %~dp0 Restoring packages for C:\Users\Marjani\.templateengine\dotnetcli\v2.1.300\scratch\restore.csproj... C:\Users\Marjani\.templateengine\dotnetcli\v2.1.300\scratch\restore.csproj : error NU1101: Unable to find package %~dp0. No packages exist with this id in source(s): C:\Program Files\dotnet\sdk\NuGetFallbackFolder, Microsoft Visual Studio Offline Packages, nuget.org Generating MSBuild file C:\Users\Marjani\.templateengine\dotnetcli\v2.1.300\scratch\obj\restore.csproj.nuget.g.props. Generating MSBuild file C:\Users\Marjani\.templateengine\dotnetcli\v2.1.300\scratch\obj\restore.csproj.nuget.g.targets. Restore failed in 1.95 sec for C:\Users\Marjani\.templateengine\dotnetcli\v2.1.300\scratch\restore.csproj.
<script> let src = 'https://svelte.dev/tutorial/image.gif'; let name = 'Rick Astley'; </script> <img src={src} alt="{name} dancing">
- نکته اول : اگر در تگ img مقدار alt را وارد نکنیم و یا alt در این تگ وجود نداشته باشد، یک هشدار توسط کامپایلر svelte برای ما با عنوان <img> element should have an alt attribute> ایجاد میشود. زمان ساخت یک برنامه بسیار مهم است تا قوانین نوشتن یک کد html خوب را رعایت کنیم تا برای تمامی کاربران احتمالی برنامه قابل استفاده باشد. در همین مثال با ایجاد یک هشدار Svelte تلاش میکند که ما را از اشتباه در نوشتن کد html مطلع سازد.
- نکته دوم : اگر نام یک آبجکت تعریف شده و یک attribute، برابر باشد میتوانیم از نسخه کوتاه شده یا Shorthand attributes در svelte استفاده کنیم. به طور مثال در مثال بالا میتوانیم از کد زیر در خط 6 استفاده کنیم.
<img {src} alt="{name} dancing">
<script> export let siteName = "dotnettips"; </script> <p>this is a nested component for third tutorial on {siteName}</p>
<script> import Nested from "./Nested.svelte"; export let name; </script> <h1>Hello {name}!</h1> <Nested siteName="dotnettips.info" />
Hello world! this is a nested component for third tutorial on dotnettips.info
در مثال بالا ما یک کامپوننت جدید را ایجاد کرده و از طریق دستور import به App.svelte اضافه کردیم. نکتهای که در اینجا وجود دارد، نحوه مقدار دهی props در کامپوننتها است. اگر به خط 9 دقت کنیم، کامپوننت ما از طریق تگ جدیدی با نام (Nested) به بدنه html برنامه اضافه شده است که یک attribute به نام siteName دارد. siteName متغیر export شده در کامپوننت Nested.svelte است که در کامپوننتها به این صورت مقدار دهی میشود. قبلا نحوه مقدار دهی این خصیصهها را در فایلهای جاوا اسکریپت مشاهده کرده بودیم. نکته دیگری که باید به آن دقت داشت این است که خصیصه siteName مقدار پیش فرض dotnettips را در Nested.svelte به خود اختصاص داده بود. به همین جهت اگر ما siteName را هنگام استفاده از کامپوننت مقدار دهی نکنیم، از مقدار پیش فرض خود استفاده خواهد کرد. ولی اینجا ما با مقدار دهی آن، siteName را به dotnettips.info تغییر دادهایم.
نکته مهم : دقت داشته باشید کامپوننتهای شما همیشه باید با حروف بزرگ شروع شوند؛ به طور مثال در صورت نوشتن <nested/> محتوای کامپوننت نمایش داده نخواهد شد. svelte، از طریق زیر نظر گرفتن حروف کوچک و بزرگ در ابتدای تگها، بین تگهای html و کامپوننتها تمایز قائل میشود.
Spread props :
تا اینجا به صورت خلاصه با props یا خصیصهها آشنا شدهاید و دیدیم که با export کردن یک متغیر در یک کامپوننت، میتوانیم آن را هنگام استفاده مقدار دهی نماییم. برای اینکه تمرینی هم باشد با توجه به مطالبی که تاکنون گفته شده، پروژهی جدیدی را ایجاد کنید و محتوای App.svelte را مانند کد زیر تغییر دهید.
<script> import Info from './Info.svelte'; const pkg = { name: 'svelte', version: 3, speed: 'blazing', website: 'https://svelte.dev' }; </script> <Info name={pkg.name} version={pkg.version} speed={pkg.speed} website={pkg.website}/>
همانطور که در خط دوم کد میبینید، کامپوننتی به نام Info.svelte به این بخش اضافه شدهاست. این کامپوننت را با محتوای زیر ایجاد نمایید:
<script> export let name; export let version; export let speed; export let website; </script> <p> The <code>{name}</code> package is {speed} fast. Download version {version} from <a href="https://www.npmjs.com/package/{name}">npm</a> and <a href={website}>learn more here</a> </p>
اگر برنامه را اجرا کنید یک چنین خروجی را مشاهده خواهید کرد:
The svelte package is blazing fast. Download version 3 from npm and learn more here
<Info {...pkg}/>
<script> let count = 0; function handleClick() { count += 1; } </script> <p>Count : {count}</p> <button on:click={handleClick}> Clicked {count} {count === 1 ? 'time' : 'times'} </button>
<script> let count = 0; let doubled = count * 2; function handleClick() { count += 1; } </script> <button on:click={handleClick}> Clicked {count} {count === 1 ? 'time' : 'times'} </button> <p>{count} doubled is {doubled}</p>
$: doubled = count * 2;
$: console.log(`the count is ${count}`);
$: { console.log(`the count is ${count}`); alert(`I SAID THE COUNT IS ${count}`); }
$: if (count >= 10) { alert(`count is dangerously high!`); count = 9; }
<script> let numbers = [1, 2, 3, 4]; function addNumber() { let newNumber = numbers.length + 1; numbers.push(newNumber); } $: sum = numbers.reduce((t, n) => t + n, 0); </script> <p>{numbers.join(' + ')} = {sum}</p> <button on:click={addNumber}>Add a number</button>
function addNumber() { let newNumber = numbers.length + 1; numbers.push(newNumber); numbers = numbers; }
function addNumber() { let newNumber = numbers.length + 1; numbers = [...numbers, newNumber]; }
مروری بر Two way bindings :
<script> let name = ""; function updateName(event) { name = event.target.value; } </script> <h4>My Name Is {name}</h4> <input value={name} on:input={updateName} />
<script> let name = ""; </script> <h4>My Name Is {name}</h4> <input bind:value={name} />
{#if condition} <!-- you html codes ... --> {/if}
<script> let user = { loggedIn: false }; function toggle() { user.loggedIn = !user.loggedIn; } </script> {#if user.loggedIn} <button on:click={toggle}> Log out </button> {/if} {#if !user.loggedIn} <button on:click={toggle}> Log in </button> {/if}
{#if condition} <!-- you html code when condition is true --> {:else} <!-- you html code when condition is false --> {/if}
{#if user.loggedIn} <button on:click={toggle}> Log out </button> {:else} <button on:click={toggle}> Log in </button> {/if}
{#if condition} <!-- you html code when condition is true --> {:else if condition2} <!-- you html code when condition2 is true --> {:else} <!-- you html code when condition and condition2 are false --> {/if}
{#each list as item} <!-- you html code per each item in list --> {/each}
<script> let cats = [ { id: 'J---aiyznGQ', name: 'Keyboard Cat' }, { id: 'z_AbfPXTKms', name: 'Maru' }, { id: 'OUtn3pvWmpg', name: 'Henri The Existential Cat' } ]; </script> <h1>The Famous Cats of YouTube</h1> <ul> {#each cats as cat} <li><a target="_blank" href="https://www.youtube.com/watch?v={cat.id}"> {cat.name} </a></li> {/each} </ul>
<ul> {#each cats as {id,name}} <li><a target="_blank" href="https://www.youtube.com/watch?v={id}"> {name} </a></li> {/each} </ul>
<ul> {#each cats as { id, name }, i} <li><a target="_blank" href="https://www.youtube.com/watch?v={id}"> {i + 1}: {name} </a></li> {/each} </ul>
نکته : در این بخش من سعی کردم تا حدودی به ترتیب بخش آموزشی خود وبسایت Svelte، موارد را بیان کنم؛ ولی با توجه به اینکه شاید دوستان ترجیح بدهند روش آموزشی خود آن وبسایت که امکان تغییر و نوشتن کد را هم محیا کرده است، امتحان کنند لینک آن را به اشتراک میگذارم.
سیستمهای توزیع شده در NET. - بخش دوم - چرا یک سخت افزار به تنهایی پاسخگوی نیازمندیهای ما نیست؟
چرا یک سخت افزار به تنهایی پاسخگوی همه نیازهای ما نیست؟
همه میدانیم که در یک هستهی از پردازنده، چیزی بعنوان پردازش موازی وجود ندارد. هر هسته در هر لحظه میتواند یک پردازش را انجام دهد و این سرعت بالای در پردازش عملیات جاری و سوئیچ کردن بین دیگر عملیات است که حس موازی اجرا شدن آنها را به ما میدهد. یعنی در صورتیکه بخواهیم در یک سخت افزار با پردازندهی تک هستهای، برنامه نویسی موازی انجام بدهیم، در واقع هیچیک از عملیات ما بصورت موازی انجام نمیشوند. زمان پردازشی پردازنده، بر اساس تعداد عملیات و اولویت آنها، بین آنها تقسیم میشود. هر لحظه یکی از آنها اجرا میشود و با اتمام زمان اجرایش، نوبت به بعدی میرسد تا جاییکه تمام آنها به اتمام برسند. در این حالت پردازنده تک هستهای، برای 2 کار زمان صرف میکند؛ اول اجرای عملیات جاری و دوم سوئیچ کردن به عملیات بعدی.
حال در صورتیکه تعداد عملیاتی که باید در سیستم بصورت همزمان انجام شوند بیشتر شود، زمانیکه پردازنده باید برای سوئیچ صرف کند نیز بیشتر شده و در نتیجه زمان اجرای عملیات بیشتر میشود و آنها دیرتر به اتمام میرسند. با بیشتر شدن تعداد این عملیات، کار به جایی میرسد که دیگر پردازنده هیچ زمانی را برای پردازش یک عملیات ندارد و باید تمام وقت خود را با سوئیچ کردن بین آنها صرف کند. بله؛ ما سیستمی را طراحی کردهایم که شامل مجموعهای از عملیات است که هیچ یک اجرا نمیشوند!
راه حل چیست؟
ساده است. با افزایش تعداد هستههای پردازنده، سیستم ما قادر است تعداد عملیات بیشتری را بصورت همزمان انجام دهد که این عملیات به تعداد هستههای پردازنده، واقعا بصورت همزمان انجام میشوند. یعنی هر هسته در هر لحظه یک پردازش را میتواند بصورت جداگانه از سایر هستهها انجام دهد.
اینجا بود که نیازمندیهای ما باعث شدند سخت افزارها پیچیدهتر شوند. البته پیچیدگی بود که باعث تکامل آنها شد. تا اینجا برای انجام تعداد عملیات بیشتر میتوانیم سخت افزار را ارتقاء دهیم. همچنین در اینجا بود که مفهوم Parallel Systems تکامل پیدا کرد؛ سیستمهایی که توانایی اجرای همزمان چند عملیات را داشتند که همه آنها از یک حافظه، بصورت مشترک استفاده میکردند.
مشکل سیستمهای Parallel مشخص است. کارآیی این نوع سیستم، کاملا به سخت افزار و نوع پیاده سازی آنها وابسته است. یعنی در صورت نیاز به کارآیی بیشتر، تنها راه ارتقاء سخت افزار و بهینه کردن کدهاست. اما این روال را تا کجا میتوانیم انجام دهیم؟
برای روشن شدن مشکل بالا بیایید یک Web Application را بر روی یک سخت افزار اجرا کنیم. در یک Web Application یک Thread Pool شامل مجموعهای از Threadها میباشد که هر Thread وظیفه اجرای یک درخواست را بر عهده دارد. یعنی با دریافت یک درخواست، یک Thread از این مجموعه کم میشود و وظیفه پاسخ دهی به آن در خواست را بر عهده میگیرد. تعداد Thread هایی که در یک Thread Pool میباشند نیز وابسته به تعداد هستههای پردازنده میباشد. برای این تعداد بصورت پیشفرض مقداری در نظر گرفته میشود که بیشترین کارآیی را در یک هسته داشته باشد؛ مثلا در ASP.NET بصورت پیشفرض به ازای هر هستهی از CPU، تعداد 20 Thread به این مجموعه اضافه میشود. یعنی ما در یک پردازنده 2 هستهای تنها میتوانیم تعداد 40 درخواست را بصورت همزمان دریافت کنیم. در صورتیکه تعداد در خواستها در یک لحظه بیشتر از این تعداد باشد، تمام درخواستهای اضافی در صف دریافت قرار میگیرند تا یکی از این Threadها به درخواست خودش پاسخ دهد و به Thread Pool بازگردد و آماده اجرای درخواست بعدی باشد.
حال با فرض اینکه بصورت میانگین به هر درخواست در مدت 2 ثانیه پاسخ داده شود و در طول هر 2 ثانیه ما تعداد 200 درخواست جدید دریافت کنیم، یعنی در هر 2 ثانیه تعداد 160 درخواست در صف پردازش درخواست باقی میمانند. یعنی در مدت 10 ثانیه تعداد 800 درخواست پردازش نشده در این صف وجود دارند. در صورتیکه این روال ادامه پیدا کند، صف پردازش بزرگتر و بزرگتر میشود؛ تا جایی که دیگر حافظهای برای دریافت درخواستهای جدید نباشد. اینجاست که سیستم ما از دسترس خارج میشود. پس تصمیم میگیریم سخت افزار خود را ارتقاء دهیم و کدهای خود را نیز بهینه کنیم. مثلا جاییکه عملیات I/O را انجام میدهیم، برای استفادهی بهینه از Threadهای موجود، کدهای خود را بصورت Async اجرا کنیم.
تا حدودی مشکل ما فعلا حل شدهاست. بعد از مدتی بدلیل اضافه شدن نیازمندیهای جدید، تعدادکاربران فعال سیستم زیاد میشود و دوباره مشکل پوشش دادن تعداد بیشتر درخواست بوجود میآید. مجبوریم دوباره عملیات Scale-up یا Vertical scaling را انجام دهیم. بله؛ عملیاتی که ما در این سیستمها برای مقیاسپذیری انجام میدهیم، اصطلاحا Vertical scaling یا Scale-up نام دارد. یعنی با افزایش تعداد کاربران یا تعداد درخواست، کدها بهینهتر و سخت افزار ارتقاء پیدا میکند.
البته مثالی که ذکر شد به هیچ وجه با دنیای واقعی قابل مقایسه نیست. ممکن است شما سرویسی بسیار حیاتی را پیاده سازی کرده باشید که در شرایط خاص، هزاران یا میلیونها کاربر بصورت همزمان بخواهند درخواستهای خود را برای شما ارسال کنند. در این حالت شما دو راه دارید؛ اول اینکه مرتبا سرویس بسیار حیاتی خود را از دسترس خارج کنید و منتظر بمانید تا حجم تعداد درخواستهای کاربران کاهش یابد و یا مجبورید سخت افزار سرور خود را آنقدر ارتقاء دهید، تا این تعداد درخواست را بصورت همزمان پوشش دهد. واقعا هزینه تهیه کردن این سرور چقدر است؟
فرض کنید از سمت پایگاه داده نیز با مشکل روبرو شدهایم. حجم دادههای ما روبه افزایش است. فضای حافظهی آزاد تنها Server ی که دادههای ما را ذخیره میکند، رو به اتمام است. چاره چیست؟ آن را ارتقا دهیم؟ بله برای مدتی سرور را از دسترس خارج کرده و فضای آزاد را افزایش میدهیم. در این بین تمام سرویسهای ما که وابسته به این سرور هستند، از دسترس خارج میشوند. این کار برای دادههایی که ذاتا همیشه رو به افزایش هستند، چقدر باید تکرار شوند؟ چقدر باید هزینه کنیم تا این دادهها که تمام سرویسهای ما به آنها وابسته هستند، با مشکل مواجه نشوند، یا کارآیی بازیابی آنها پایین نیاید؟
حال بیاید از زاویه دیگری به ماجرا نگاه کنیم ما یک سرویس بسیار حساس با تعداد کاربران زیادی را داریم. از دسترس خارج شدن این سرویس برای ما بسیار هزینه بر است. اما تنها سرور بسیار قوی ما که برای آن هزینهی بسیار زیادی را پرداخت کردهایم، با مشکلی مواجه شده که ممکن است زمان زیادی برای رفع مشکل آن صرف شود. بله باز سرویس از دسترس خارج شده و ما با مشکل بسیار جدی مواجه شدهایم که ممکن است آیندهی سرویس بسیار مهم را به خطر بیاندازد. چاره چیست؟ مثلا تعدادی سرور مشابه سرور اصلی را خریداری کنیم و در صورتیکه سرور اصلی با مشکل جدی مواجه شد از آنها استفاده کنیم. بله هزینه چند برابر شد. فرض کنید به هر دلیل، برق قسمتی که شما این سرورها را نگهداری میکنید، قطع شد! چه راهکاری را دارید؟ واقعیتی که باید بپذیریم این است که چون ما یک سرور را برای اجرای Application خودمان داریم، در هرصورت اگر این سرور با مشکلی مواجه شود، تمام سرویسهای ما با خطری جدی مواجه میشوند و ما نیز در صورتیکه بخواهیم این چرخهی معیوب را ادامه دهیم، تنها هر بار صورت مسئله را پاک میکنیم. بهتر است روش جدیدی را برای این مشکل بیابیم.
اینجاست که مفهوم سیستمهای توزیع شده به کمک سیستمهای Parallel میآید و مفهوم Scale-up یا Vertical scaling با مفهموم Horizontal Scaling یا Scale-out ادغام میشود. در قسمت بعدی، با مفاهیم، خصوصیات و اصطلاحات موجود در این سیستمها آشنا میشویم.
زمانه angular 2
I’ve been avoiding even thinking about the latest rev of Angular as every time I did look at it, I came away with a headache. It was weird and the docs were even weirder. I saw plenty of blog posts on the topic, but in general they dealt with one small slice of Angular 2 and were too confusing for me to grok.
تغییرات Web API در دات نت 8
Preview 3 of .NET 8 includes a new project templates to create an API with a TODO service instead of the weather forecast . Looking into the generated code of this template, there are a lot more changes going on such as a slim builder and using a JSON source generator which helps when using AOT to create native .NET binaries. This article looks into the changes coming.
let names = ["Jack", "Jecci", "Ram", "Tom"]; let upperCaseNames = []; for(let i=0, totalNames = names.length; i< totalNames ; i= i +1) { upperCaseNames = names[i].toUpperCase(); }
let names = ["Jack", "Jecci", "Ram", "Tom"]; let upperCaseNames = names.map(name => name.toUpperCase());
function print(name) { console.log(name); } let names = ["Jack", "Jecci", "Ram", "Tom"]; for(let i=0, totalNames = names.length; i< totalNames ; i= i +1) { print(names[i]) }
function print(name) { console.log(name); } let names = ["Jack", "Jecci", "Ram", "Tom"]; names.forEach(name=> print(name)); // اگر صرفا چاپ در کنسول مد نظر هست let names = ["Jack", "Jecci", "Ram", "Tom"]; names.forEach(name=> console.log(name));
function isOdd(n) { return n %2; } let numbers = [1,2,3,4,5]; let odd = []; for(let i=0, total = numbers.length; i< total ; i= i +1) { let number = numbers[i]; if( isOdd(number) ) { odd.push(number); } }
let numbers = [1,2,3,4,5, 6, 7] let odd = numbers.filter(n => n%2);
let numbers = [1,2,3,4,5] let result = 0; for(let i=0, total = numbers.length; i< total ; i= i +1) { result = result + numbers[i]; }
let numbers = [1,2,3,4,5,6,7]; function sum(accumulator, currentValue){ return accumulator + currentValue; } let initialVal = 0; let result = numbers.reduce(sum, initialVal); // یا بصورت زیر کد را خلاصه نمود let numbers = [1,2,3,4,5,6,7, 10]; let result = numbers.reduce((acc, val)=> acc+val, 0);
let names = ["ram",, "rahul", "raj", "rahul"]; for(let i=0, totalNames = names.length; i< totalNames ; i= i +1) { if(names[i] === "rahul") { console.log(" found rahul"); break; } }
let names = ["ram",, "rahul", "raj", "rahul"]; let isRahulPresent = names.some(name => name==="rahul"); if(isRahulPresent) { console.log("found rahul"); }
let numbers = [1,2,3,4,5, 0]; for(let i=0, total = numbers.length; i< total ; i= i +1) { if(numbers[i] <= 0) { console.log("0 present in array"); break; } }
let numbers = [1,2,3,4,5,0]; let isZeroFree = numbers.every(e => e > 0); if(!isZeroFree) { console.log("0 present in array"); }
- خوانایی بهتر
- فهم راحت
- خطایابی آسانتر