Gümrükten sorunsuzca geçmenize yardımcı olacak dokuz JavaScript mülakat sorusundan oluşan bir koleksiyon

Tam metin 6287 Kelimeler, tahmini öğrenme süresi 20 Dakika veya daha uzun

Resim kredisi: Irvan Smith / Unsplash

İnsanlar JavaScript'in yeni başlayanlar için en uygun dil olduğunu düşünüyor. Bunun bir nedeni, JavaScript'in İnternette yaygın olarak kullanılması ve bunun bir kısmı da, kendi özelliklerinin kod mükemmel olmasa bile çalışmasını sağlamasıdır: noktalı virgül veya bellek yönetimi sorunları eksik olsa da, diğer pek çok dil gibi değildir. Katı, ancak öğrenmeye başlamadan önce, otomatik olarak yapılabilecek şeyler ve "perde arkasında" işlemler dahil olmak üzere JavaScript'in tüm ayrıntılarını bildiğinizden emin olun.

Bu makale, röportajlar sırasında JavaScript hakkında bazı genel soruların yanı sıra bazı beklenmedik sorunları tanıtacaktır. Elbette her görüşme farklıdır ve bu tür sorunlarla karşılaşmayabilirsiniz. Ama ne kadar çok bilirseniz, o kadar hazırlıklı olursunuz.

Bölüm 1: Ani Sorunlar

Bir görüşme sırasında aşağıdaki sorular aniden sorulursa, cevaplanması zor görünüyor. Öyle olsa bile, bu sorular hala hazırlıkta bir rol oynamaktadır: JavaScript'in bazı ilginç özelliklerini ortaya çıkarır ve bir programlama dili önerirken alınması gereken ilk kararları vurgular.

JavaScript hakkında daha fazla bilgi edinmek için https://wtfjs.com adresini ziyaret etmeniz önerilir.

1. Math.max () neden Math.min () 'den küçüktür?

Math.max () > Math.min () 'in yanlış çıktı verdiği ifade sorunlu gibi görünse de aslında oldukça mantıklı.

Parametre belirtilmezse, Math.min () sonsuz (sonsuz) döndürür ve Math.max () -infinity (sonsuz) döndürür. Bu, max () ve min () yöntem özelliklerinin yalnızca bir parçasıdır, ancak seçimin arkasındaki mantık derin tartışmaya değerdir. Nedenini anlamak için aşağıdaki koda bakın:

Matematik.min (1) // 1 Math.min (1, sonsuz) // 1 Math.min (1, -sonsuz) // -sonsuz

Math.min () öğesinin varsayılan parametresi olarak -infinity kullanılıyorsa, her sonuç -sonsuz olur, bu da işe yaramaz! Bununla birlikte, varsayılan parametre sonsuz ise, hangi parametre eklenirse eklensin sayı döndürülecektir - çalıştırmak istediğimiz yol budur.

2. Neden 0.1 + 0.2, 0.3'e eşit değil

Kısacası, bunun JavaScript'in kayan nokta sayılarını ikili olarak ne kadar doğru sakladığıyla ilgisi var. Almak için Google Chrome konsoluna aşağıdaki formülü girin:

0.1 + 0.2 // 0.300000000000000040.1 + 0.2-0.2 // 0.100000000000000030.1 + 0.7 // 0.7999999999999999

Doğruluk gerektirmeyen basit bir denklem ise, bunun sorunlara yol açma olasılığı düşüktür. Ancak eşitliği test etmeniz gerekiyorsa, basit bir uygulama bile baş ağrısına neden olabilir. Bu sorunları çözmek için birkaç çözüm var.

Sabit nokta

Örneğin, gereken maksimum kesinliği biliyorsanız (örneğin, para birimiyle uğraşıyorsanız), değeri depolamak için tamsayı türünü kullanabilirsiniz. Bu nedenle, 4,99 $ yerine 499 depolayabilir ve bu temelde herhangi bir denklem gerçekleştirebilir ve ardından sonucu son kullanıcıya görüntülemek için result = (value / 100) .toFixed (2) gibi bir ifade kullanabilirsiniz ve ifade döner Dizi.

BCD kodu

Doğruluk çok önemliyse, başka bir yöntem de ikili kodlanmış ondalık (BCD) biçimini kullanmaktır. JavaScript'e erişmek için BCD kitaplığını (https://formats.kaitai.io/bcd/javascript.html) kullanabilirsiniz. Her ondalık değer bir baytta (8 bit) saklanır. Bir baytın 16 ayrı değeri saklayabildiği ve sistemin yalnızca 0-9 bit kullandığı göz önüne alındığında, bu yöntem verimsizdir. Bununla birlikte, doğruluğa çok dikkat ederseniz, hangi yöntemi dikkate almaya değer.

3. 018 eksi 017 neden 3'e eşittir?

018-017 dönüş 3, aslında sessiz tür dönüştürmenin sonucudur. Bu durumda, sekizlik sayıları tartışıyoruz.

Sekizlik sayılara giriş

Hesaplamalarda ikili (taban-2) ve onaltılık (taban-16) sayı sistemlerinin kullanıldığını biliyor olabilirsiniz, ancak sekizlik (taban-8) bilgisayar tarihinde çok önemli bir yere sahiptir: 1950'lerin sonlarında 1960'lar ve 1960'lar arasında, sekizlik ikili sistemi basitleştirmek ve pahalı imalat sistemlerindeki malzeme maliyetini düşürmek için kullanıldı.

Onaltılık (onaltılık) tarih sahnesine girmeye başladıktan kısa bir süre sonra:

1965'te piyasaya sürülen IBM360, sekizlikten onaltılıya kesin bir adım attı. Sekizli sisteme alışkın olanlarımız bu hamle karşısında şok oluyoruz! Vaughan Pratt

Bugün sekizlik sayılar

Peki modern programlama dillerinde sekizliğin rolü nedir? Bazı durumlarda, sekizlik onaltılıktan daha avantajlıdır çünkü herhangi bir rakam gerektirmez (0-F yerine 0-7 kullanın).

Yaygın bir kullanım, sekiz izin çeşidi bulunan Unix sistemlerindeki dosya izinleridir:

42 1

0 - izin yok

1 - x yalnızca çalıştır

Yalnızca 2 x yazma

3-x x yazma ve çalıştırma

4 x - sadece oku

5 x-x oku ve çalıştır

6 x x okuma ve yazma

7 x x x oku, yaz ve çalıştır

Benzer nedenlerle, sekizli dijital ekranlar için de kullanılır.

Soruna geri dön

JavaScript'te, 0 öneki tüm sayıları sekizlik biçime dönüştürür. Ancak, 8 sayısı sekizlik sistemde kullanılmaz ve 8 içeren herhangi bir sayı otomatik olarak normal bir ondalık sayıya dönüştürülür.

Bu nedenle, 018-017 aslında ondalık ifadeye eşdeğerdir: 18-15, çünkü 017 sekizlik, 018 ise ondalık kullanır.

Bölüm 2: Sık Sorulan Sorular

Resim kaynağı: pexels.com/@divinetechygirl

Bu bölümde, röportajlarda daha sık sorulan bazı JavaScript sorularını tanıtacağız. JavaScript'i ilk kez öğrenirken bu sorunlar kolayca gözden kaçabilir. Ancak en iyi kodu yazarken aşağıdaki konuları anlamakta fayda var.

4. İşlev ifadeleri ve işlev bildirimleri arasındaki farklar nelerdir?

İşlev bildirimi, anahtar sözcük işlevini ve ardından işlevin adını kullanır. Aksine, işlev ifadeleri var, let veya const ile başlar, ardından işlev adı ve atama operatörü = gelir. Aşağıdaki kodu göz önünde bulundurun:

// Fonksiyon Bildirimi function sum (x, y) { dönüş x + y; }; // Fonksiyon İfadesi: ES5 var sum = function (x, y) { dönüş x + y; }; // Fonksiyon İfadesi: ES6 + sabit toplam = (x, y) = > {x + y dönüş};

Pratikte, temel fark, işlev bildirimlerinin terfi ettirilmesi gerektiğidir, ancak işlev ifadeleri değildir. Bu, JavaScript yorumlayıcısının işlev bildirimini kapsamının en üstüne taşıdığı anlamına gelir, böylece işlev bildirimini tanımlamak ve kodun herhangi bir yerinde çağırmak mümkündür. Aksine, işlev ifadeleri yalnızca doğrusal sırada çağrılabilir: çağrılmadan önce yorumlanmaları gerekir.

Günümüzde birçok geliştirici, çeşitli nedenlerle işlev ifadelerini tercih etmektedir:

· İlk olarak, işlevsel ifadeler daha öngörülebilir yapılandırılmış bir kod tabanı uygular. Elbette, işlev bildirimleri yapılandırılmış kod kitaplıklarını da kullanabilir; dağınık koddan kurtulmanızı kolaylaştıran yalnızca işlev bildirimleridir.

İkinci olarak, işlev ifadeleri için ES6 sözdizimini kullanabilirsiniz: bu genellikle daha kısadır, let ve const, bir sonraki soruda göreceğimiz gibi değişkenlerin yeniden atanıp atanmayacağını daha iyi kontrol edebilir.

5. var, let ve const arasındaki fark nedir?

ES6'nın yayınlanmasından bu yana, modern dilbilgisi hayatın her alanına girdi ve bu son derece yaygın bir mülakat sorusu haline geldi. Var, JavaScript'in ilk sürümündeki değişken bildirim anahtar kelimesidir. Ancak eksiklikleri ES6'da iki yeni anahtar kelimenin benimsenmesine yol açtı: let ve const.

Bu üç anahtar kelimenin farklı atamaları, promosyonları ve alanları vardır - bu nedenle bunları ayrı ayrı tartışacağız.

i) Dağıtım

En temel fark, let ve var'ın yeniden atanabilmesidir, ancak const olamaz. Bu, const'ı sabit değişkenler için en iyi seçenek yapar ve yanlışlıkla yeniden tahsis gibi hataları önler. Değişken bir dizi veya nesneyi temsil ettiğinde, const değişkenin değişmesine izin verir, ancak değişkenin kendisi yeniden atanamaz.

Hem Let hem de var yeniden atanabilir, ancak aşağıdaki noktaların açık olması gerektiğinden, tüm durumlar değişkeni değiştirmeyi gerektirmiyorsa, çoğu seçenekte, var'a göre önemli bir avantaja sahip olalım.

ii) Geliştirin

İşlev bildirimleri ve ifadeler arasındaki farka benzer şekilde (yukarıda açıklandığı gibi), var ile bildirilen değişkenler her zaman ilgili üst değerlerine yükseltilirken, const ve let ile bildirilen değişkenler yükseltilir, ancak daha önce bildirmeye çalışırsanız Erişim, bir TDZ (zaman ölü bölge) hatası alacaksınız. Var, yanlışlıkla yeniden tahsis etme gibi hatalara daha yatkın olabileceğinden, işlemler yararlıdır. Aşağıdaki kodu göz önünde bulundurun:

var x = "genel kapsam"; function foo () { var x = "işlevsel kapsam"; console.log (x); } foo (); // "işlevsel kapsam" console.log (x); // "genel kapsam"

Burada, foo () ve console.log (x) sonuçları beklentilerle tutarlıdır. Peki ikinci değişken kaldırılırsa ne olur?

var x = "genel kapsam"; function foo () { x = "işlevsel kapsam"; console.log (x); } foo (); // "işlevsel kapsam" console.log (x); // "işlevsel kapsam"

Bir işlev içinde tanımlanmış olmasına rağmen, x = "işlevsel kapsam" genel değişkenlerin üzerine yazılmıştır. İkinci değişken x'in foo () ile sınırlı olduğunu belirtmek için var anahtar sözcüğünün tekrarlanması gerekir.

iii) Alan

Var işlev kapsamlı olsa da (işlev kapsamı), let ve const blok kapsamlıdır (blok kapsamlı: Genel olarak Blok, işlevler, koşullu ifadeler ve döngüler dahil olmak üzere küme parantezleri {} içindeki herhangi bir koddur. Farkı açıklığa kavuşturmak için aşağıdaki koda bakın:

var a = 0; let b = 0; const c = 0; Eğer doğruysa) { var a = 1; let b = 1; const c = 1; } console.log (a); // 1 console.log (b); // 0 console.log (c); // 0

Koşullu blokta, var a'nın genel kapsamı yeniden tanımlanmıştır, ancak let b ve const c'nin genel kapsamı yeniden tanımlanmamıştır. Genel olarak konuşursak, yerel görevlerin yerel olarak yürütülmesini sağlamak, kodu daha net hale getirecek ve hataları azaltacaktır.

6. Değişkenleri anahtar sözcükler olmadan atarsanız ne olur?

Değişkenleri tanımlamak için anahtar kelimeler kullanmazsanız ne olur? Teknik olarak konuşursak, x henüz tanımlanmamışsa, x = 1 pencere için kısaltmadır. X = 1.

Bu kısaltmayı tamamen ortadan kaldırmak için, belgenin üst kısmına veya belirli bir işlevde - ES5 yazma kullanımı katı ile tanıtılan katı modu yazabilirsiniz. Daha sonra, bir değişkeni anahtar sözcük olmadan bildirmeye çalıştığınızda, bir sözdizimi hatası alırsınız: Yakalanmamış Sözdizimi Hatası: Beklenmeyen tanımlayıcı.

7. Nesne yönelimli programlama (OOP) ile işlevsel programlama (FP) arasındaki fark nedir?

JavaScript, çok paradigmalı bir dildir, yani olay odaklı, işlev ve nesne yönelimli dahil olmak üzere birçok farklı programlama stilini destekler.

Farklı programlama paradigmaları vardır, ancak çağdaş hesaplamada, işlevsel programlama ve nesne yönelimli programlama en popüler olanlardır ve JavaScript her ikisi de çalıştırılabilirdir.

Nesne yönelimli programlama

OOP, veri alanları (JavaScript olarak adlandırılan sınıflar) ve programlar (JavaScript yöntemleri) dahil olmak üzere "nesneler" kavramına dayalı bir veri yapısıdır.

Bazı yerleşik JavaScript nesneleri arasında Math (random, max ve sin yöntemleri için), JSON (JSON verilerini ayrıştırmak için) ve String, Array, Number ve Boolean gibi ilkel veri türleri bulunur.

Yerleşik yöntemler, prototipler veya sınıflar kullanıldığında, esasen nesne yönelimli programlama kullanırlar.

Fonksiyonel programlama

FP (Fonksiyonel Programlama), paylaşılan durumdan, değişken verilerden ve yan etkilerden kaçınmak için "saf fonksiyonlar" kavramına dayanır. Bu pek çok terim gibi görünebilir, ancak kodda pek çok saf işlev oluşturulmuş olabilir.

Aynı verileri girin, saf fonksiyon her zaman aynı çıktıyı verir. Bu yöntemin hiçbir yan etkisi yoktur: Konsolda oturum açmak veya harici değişkenleri değiştirmek gibi sonuçları döndürmenin yanı sıra gerçekleşmeyecektir.

Paylaşılan duruma gelince, işte basit bir örnek, giriş aynı olsa bile, durum yine de fonksiyonun çıkışını değiştirebilir. İki işlevi olan bir kod oluşturun: biri sayıya 5 ekler ve diğeri sayıyı 5 ile çarpar.

const num = { değer: 1 }; const add5 = () = > num.val + = 5; const çarpma5 = () = > num.val * = 5;

Önce add5'i çağırır ve ardından 5 ile çarparsanız, genel sonuç 30 olur. Ancak işlev tersi şekilde yürütülürse ve sonuç kaydedilirse, çıktı 10'dur ve bu önceki sonuçla tutarsızdır.

Bu, işlevsel programlama ilkesini ihlal eder, çünkü işlevin sonucu, Bağlam tarafından çağrılan yönteme bağlı olarak değişir. Sonuçları daha tahmin edilebilir hale getirmek için yukarıdaki kodu yeniden yazın:

const num = { değer: 1 }; const add5 = () = > Object.assign ({}, num, {val: num.val + 5}); const multiply5 = () = > Object.assign ({}, num, {val: num.val * 5});

Şimdi, num.val değeri hala 1'dir, Context tarafından çağrılan yöntemden bağımsız olarak, top5 (num) ve çarpma5 (num) her zaman aynı sonucu verecektir.

8. Zorunlu ve bildirimsel programlama arasındaki fark nedir?

Zorunlu programlama ve bildirim temelli programlama arasındaki farkla ilgili olarak, OOP (Nesne Yönelimli Programlama) ve FP (İşlevsel Programlama) 'ya başvurabilirsiniz.

Bu ikisi, birçok farklı programlama paradigmasının ortak özelliklerini tanımlayan genel terimlerdir. FP (fonksiyonel programlama), bildirim temelli programlamanın bir örneğidir ve OOP (nesne yönelimli programlama), zorunlu programlamanın bir örneğidir.

Temel anlamda, zorunlu programlama bir şeyin nasıl yapılacağıyla ilgilidir. Adımları en basit şekilde açıklar ve for ve while döngüleri, if ve switch ifadeleri ile karakterize edilir.

const sumArray = dizi = > { sonuç = 0 olsun; for (let i = 0; i < dizi.length; i ++) { sonuç + = dizi }; dönüş sonucu; }

Buna karşılık, bildirimsel programlama ne yapılacağına odaklanır ve bağımlılık ifadeleri aracılığıyla bunun nasıl yapılacağını çıkarır. Bu genellikle daha temiz kodla sonuçlanır, ancak geniş ölçekte, düşük şeffaflık nedeniyle hata ayıklama daha zordur.

Bu, yukarıdaki sumArray () işlevinin bildirim yöntemidir.

const sumArray = dizi = > {dönüş dizisi.reduce ((x, y) = > x + y)};

Resim kaynağı: pexels.com/@rawpixel

9. Prototip tabanlı kalıtım nedir?

Son olarak, prototip tabanlı kalıtım hakkında konuşmak istiyorum. Birkaç farklı nesne yönelimli programlama türü vardır ve JavaScript, prototip tabanlı kalıtım kullanır. Sistem, mevcut nesneleri prototipler olarak kullanarak tekrarlı çalışmaya izin verir.

Prototip kavramı ile ilk kez karşılaşsanız bile, yerleşik yöntemleri kullanırken prototip sistemlerle karşılaşacaksınız. Örneğin, dizileri işlemek için kullanılan işlevler (eşleme, azaltma, ekleme vb.) Array.prototype nesnesinin tüm yöntemleridir. Aslında, bir dizinin her örneği (köşeli parantezlerle veya alışılmadık yeni Array ()) Array.prototype'dan miras alır, bu nedenle map, lower ve spliceare gibi yöntemler varsayılan olarak kullanılabilir.

Bu, dizeler ve Boolean işlemleri gibi neredeyse tüm yerleşik nesneler için geçerlidir: Infinity, NaN, null ve undefined gibi yalnızca birkaçının sınıfı veya yöntemi yoktur.

Prototip zincirinin sonunda, Object.prototype'ı bulabilirsiniz, JavaScript'teki hemen hemen her nesne bir Object örneğidir. Örneğin, Dizi prototipi ve Dize prototipi, Object.prototype sınıflarını ve yöntemlerini miras alır.

Prototip sözdizimini kullanan nesnelere sınıflar ve yöntemler eklemek için, nesneyi bir işlev olarak başlatın ve sınıflar ve yöntemler eklemek için prototip anahtar sözcüğünü kullanın:

işlev Kişi () {}; Person.prototype.forename = "John"; Kişi.prototype.surname = "Smith";

Prototip hesaplama kapsanmalı mı yoksa genişletilmeli mi?

Yerleşik hesaplamaları, uzantı prototiplerini oluşturduğunuz şekilde değiştirebilirsiniz, ancak çoğu geliştirici (ve çoğu şirket) bunu tavsiye etmez.

Birden çok nesnenin aynı işlemi gerçekleştirmesini istiyorsanız, özel bir nesne oluşturabilirsiniz (veya kendi "sınıfınızı" veya "alt sınıfınızı" tanımlayabilirsiniz), bu nesneler, prototipin kendisini değiştirmeden yerleşik prototipi devralır. Diğer geliştiricilerle işbirliği yapmayı planlıyorsanız, JavaScript'in varsayılan davranışıyla ilgili belirli beklentileri vardır ve bu varsayılan davranışı düzenlemek, kolayca hatalara yol açabilir.

Genel olarak bu sorular, temel işlevleri ve diğer az bilinen özellikleri dahil olmak üzere JavaScript'i daha iyi anlamanıza yardımcı olabilir ve umarız bir sonraki görüşmeye hazırlanmanıza yardımcı olur.

Yorum Beğen Takip Et

AI öğrenme ve geliştirmenin kuru mallarını paylaşalım

Tam platform yapay zeka dikey öz medya "temel okuma" yı takip etmeye hoş geldiniz

Bugünün Eğlenceli Resmi: Dudleyin zorunlu numara değişikliğinin neden olduğu bir beyin fırtınası
önceki
Süper telefoto montaj numarası Sony Aynasız SEL600F40GM ve SEL200600G lensler piyasaya çıktı
Sonraki
"TFBOYS" "Paylaş" 190623 Wang Yuan, çok mutlu olduğu için çok mutlu, uçmaktan gerçekten mutlu
Turing, Watt'ın yeni İngiliz poundunun yerini aldı. "Suçlu" neden İngiltere Kraliçesi ile omuz omuza dursun?
Nanning Sanhao arabası taksilerin takibini sınırlıyor: Rolls-Royce sahipleri özür diliyor
Denon X serisi ürünler iki yeni AV alıcısı ekler
"TFBOYS" "Paylaş" 190623 Wang Junkai'nin süper sevimli fotoğrafları geliyor, çok tatlı, küçük bir kardeş çok tatlı
Alman Ultrasone (aşırı) kulak tıkaçları da aşırı
Günlük Rezerv Satın Alma | Bu hafta rezerv pamuk cirosu iyi, ortalama fiyat yükseltildi, ortalama ciro oranı yaklaşık% 95
Audio-Technica ATH-G1, ATH-PDG1a oyun kulaklığı
Şok edici ses ve videonun cazibesini yorumlayan, kabaran bas, SONY Echo Wall Çin pazarına girdi
"Red Velvet" "Paylaş" 190623 Seulgi'nin bugünkü fotoğraf güncellemesi% 100 sevimli
Birinci Sınıf A kapsamlı genişletme Perth (Geçiş) INT-25 saf Sınıf A kapsamlı amplifikatör
Sony (SONY) plak çalar PS-LX310BT, Çin'de piyasaya sürüldü
To Top