Javascript mülakat soruları. JavaScript'i anlamanın zorluğu. Buzzword - köri

  • 18.04.2019

Röportajlarda, cevapları uzun zamandır öğrenilen aynı tür soruları sormaktan hoşlanırlar.

Bugün nadiren hatırlanan soruları ele alacağız.

Öyleyse başlayalım!

1. foo.x neye eşittir?

var foo = (n: 1);
var bar = foo;
foo.x = foo = (n: 2);

Bu soru, şirketlerin ilk %3'ü (Apple, Google, Facebook) tarafından sorulmaktadır.

Burada dikkat edilmesi gereken en önemli şey, foo.x tarafından başvurulan foo'nun foo değişmeden önce "ayarlanmış" olmasıdır. foo.x, foo'nun eski değerini ifade eder.

  • İzin vermek lref değerlendirmenin sonucu olmak SolTarafİfade.
  • İzin vermek başvuru değerlendirmenin sonucu olmak Atamaİfadesi.

Bu, eski foo'da (n: 2)'ye eşit yeni bir x özelliğinin görüneceği anlamına gelir. Ve yeni foo yazılacak (n: 2).

Eski foo barda:

// bar
{
sayı: 1,
x: (
sayı: 2
}
}

foo.x'in sonraki çıktısında foo'muz x içermeyen yeni değerine atıfta bulunduğundan, foo.x tanımsız - tanımsız olacaktır.

Cevap: tanımsız

2. Ekle (sayı1) (sayı2) gibi bir toplama işlevi yazın..

Not: Terim sayısı sınırlı değildir

Orijinalde, bu görev şu şekilde çözülür:

Sabit ekleme = (a) => (
toplam = a olsun;
const işlev = (b) => (
eğer (b) (
toplam + = b;
dönüş işlevi;
) Başka (
dönüş toplamı;
}
};
dönüş işlevi;
); (2) (3) (); // 5;

Ama sonra sana bir şart verildi.

Sondaki fazla parantezleri kaldırın
ekle (2) (3) // 5 ekle (1) (2) (5) // 8 ...

Şimdi görev daha karmaşık hale geldi. Ve çözüm, yöntemi geçersiz kılmakta yatmaktadır. değeri.

Sabit ekleme = (a) => (
toplam = a olsun;
const işlev = (b) => (
toplam + = b;
dönüş işlevi;
};
func.valueOf = () => toplam; dönüş işlevi;
); konsol.log (ekle (2) (3)); // 5;

aradığımızda konsol.log, görmeyi umuyor Sicim, orada değilse, alınan değerden yapmaya çalışacaktır. Sicim.

Yukarıdaki örnekte, (2) (3)'ü çalıştırdıktan sonra, console.log'un bir Dize'ye dönüşeceği bir işlev döndürülür, bu eylemler sırasında işlevi bir ilkele dönüştürmek için valueOf yöntemi çağrılır ve bu nedenle geçersiz kıldık. Bu method o zaman standart değer yerine toplam değerimizi döndürür.

Not:

Bu örnek hepsinde çalışmıyor konsol.

3. Konsola ne çıkacak? Sebebini açıkla.

var a = (),
b = (anahtar: "b"),
c = (anahtar: "c");

bir [b] = 123;
bir [c] = 456;

konsol.log (a [b]);

Neler oluyor? Bir nesne üzerinde yeni bir özellik ayarlandığında, JavaScript örtük olarak şunu yapacaktır: dizmek değerler. Yukarıdaki kodda, b ve c nesnelerdir, dolayısıyla ikisi de "" (String) biçimine dönüştürülür. Çünkü dizmek değerler eşittir, o zaman yeni bir değer atadığımız ortaya çıkıyor aynı mülk.

Yazmaya eşdeğer:

Var a = (),
b = "nesne",
c = "nesne";

bir [b] = 123;
bir [c] = 456;

4. Girdi parametrelerinden birinin 3'e eşit olup olmadığını bulmak için basit bir fonksiyon yazın.

Burada vurgu, argümanların bilgisini test etmek üzerinedir, ancak bazen daha da ileri giderler ve nasıl çalıştığını anlatmak isterler. Array.prototype.slice.call (argümanlar).

İşlev Üç Geçişlidir () (
const argümanlar = Array.prototype.slice.call (argümanlar);
dönüş args.indexOf (3)! = -1;
) isThreePassed (1,2) // yanlış
isThreePassed (9,3,4,9) // doğru

Bildiğimiz gibi, argümanlar dizi değil, sıradan bir nesne, yani böyle bir özelliği yok faydalı yöntem nasıl indeksi... Bunun için kullanılır Array.prototype.slice.call (argümanlar), hangisinden yapılır argüman -> dizi.

Ama nasıl çalışıyor?

.Arama () ve. uygulamak () açıkça ayarlamanıza izin verir Bugün nasılsın işlevde. Ve eğer geçersen argüman bu şekilde, sonra dilim onunla normal bir dizi gibi çalışacak.

Ve işte ilginç bir deney:

Sabit o = (
"0": "sıfır",
"1 bir"
); .slice.call (o); //; const oo = (
"0": "sıfır",
"1 bir",
uzunluk: 2
); .slice.call (oo); // ["sıfır bir"];

5. İç içe iki diziyi birleştirin

], ] ->

Sorun çözülebilir Farklı yollar... Genellikle görüşülen kişinin aşağıdaki gibi bir yöntemi bilip bilmediğini bilmek isterler. azaltmak .

Buradaki fikir, bulunan değerleri geri döndürmek için orijinal dizinin tüm öğelerini ve "dizilerin altında" geçmektir. yeni dizi... Bu, son öğeye ulaşana kadar özyinelemeli olarak gerçekleşir.

Ayrıca, yeni bir dizinin oluşumu ile bize yardımcı oluyor concat .

Const flatten = (arr) => arr.reduce ((flat, toFlatten) => flat.concat (Array.isArray (toFlatten)? Flatten (toFlatten): toFlatten),);

Bu kadar! 🙏🏼 👍

İyi günler, sevgili misafir! Sizi blog sayfamda ağırlamaktan mutluluk duyuyorum.

Bugün Olacak Javascript geliştiricisi pozisyonu için bir adaya teknik bir röportajda hangi soruların sorulacağı hakkında. Amaç kontrol etmektir gereken seviye adayın dil bilgisi ve teorik eğitim.

Kıdemli Ön Uç Geliştiricisi Grechenok Eugene ve Kıdemli Arka Uç Geliştiricisi Gizzatov Marcel'e makaleyi oluşturmadaki yardımları için minnettarlığımı ifade etmek isterim. "30 bin ve 130 için" adaylarla röportaj yapmak için kullandıkları metodolojiden daha ileri giden sorular. Çok teşekkürler beyler, bana verdikleri sürede ve bence röportaj, kendi bilgilerimdeki boşlukları gidermek ve profesyonel olma yolunda bir adım daha atmak için iyi bir teşvik oldu.

JavaScript soruları (sözdizimi ve dil özellikleri)

1. Nesnenin kendisi için bir özelliğin tanımlanıp tanımlanmadığını kontrol etmeniz gerekiyorsa ... (hasOwnProperty)
2. Bu nasıl çalışır (http://bonsaiden.github.io/JavaScript-Garden/ru/#function.this)
3. Kapanışlar (http://bonsaiden.github.io/JavaScript-Garden/ru/#function.closures)
4. Değişkenleri tanımlama (köpüren)
5. let, const, var değişkenleri (https://learn.javascript.ru/let-const)
6. Eşitlik ve Karşılaştırma (operatör == ve ===)
7. Operatör typeof ve instanceof (bunlar için http://bonsaiden.github.io/JavaScript-Garden/ru/#types.instanceof kullanılır)
8. Neden eval kullanamıyorsunuz (http://bonsaiden.github.io/JavaScript-Garden/ru/#core.eval)
9. Yıkım (https://learn.javascript.ru/destructuring)
10. Şablon dizileri (https://learn.javascript.ru/es-string)
11. Sınıflar (prototipler, modern)
12. Yineleyiciler (https://learn.javascript.ru/iterator)
13. Jeneratörler (https://learn.javascript.ru/generator)
14. Yeni veri türleri (https://learn.javascript.ru/set-map)
15. Eventloop nedir? Nasıl çalıştığını açıklayın.

Genel programlama soruları

  1. Derlenmiş bir dil ile yorumlanmış bir dil arasındaki fark
    C Derlemesi Java'dan Nasıl Farklıdır?
  2. Statik ve dinamik yazma arasındaki fark
  3. Kalıtım ve kompozisyon arasındaki fark (https://habrahabr.ru/post/325478/)
  4. Algoritmalar ve karmaşıklıkları (JS https://tproger.ru/translations/algorithms-and-data-structures/)
    a. Herhangi bir dilin ekinde, bir ağacı sıralamak / çaprazlamak / bir dizide aramak için standart yöntemlere, karmaşıklıklarını ve nasıl çalıştıklarını açıklayan bir dikte örnekleri verin.
  5. FIFO, LIFO
  6. Veri yapıları (JS https://learn.javascript.ru/data-structures)
    a. Sayılar, Dizeler
    B. Başvuruya göre geçen (değere göre iletilen) nesneler (ilişkisel diziler)
    C. diziler
    NS. Ağaçlar, Listeler (bağlantılı, başvurulan)
  7. Mimari (fark nedir)
    a. asenkron,
    B. çok iş parçacıklı
  8. mikro hizmetler
    a. Mikro hizmetler, ortak bir veri yolu aracılığıyla dağıtılmış bir mimari olacak mı?
    B. Mikro hizmet gereksinimleri
    ben. yatay ölçekleme
    ii. hata toleransı
  9. Mikro hizmetlerin faydaları:
    ben. hafif destek(küçük hizmetler daha kolaydır)
    ii. sorunu çözmek için dillerde ve kitaplıklarda kısıtlama yok
    iii. basitleştirilmiş test, etkileşimleri gizleme yeteneği
    iv. yeni sürümlerin kolay yuvarlanması ve geri alınması
    v. teknolojiyi deneyebilirsin

Çevik Metodolojiler

  1. neden ihtiyacımız var
  2. hangi yaklaşımlar var
  3. Geliştirme sorunlarını belirleme, neden scrum'da bir retrospektife ihtiyacınız var?
  4. Geliştiriciler tarafından görevlerin dağılımı
    • son tarihler açık
    • planlama

Ve sonunda ...

JavaScript anlama zorluğu

Görev 1. Bu kod ne gösterecek?

Var b = 5; var a = function() (uyarı (b);); a ();

Sorunun amacı, kapatmanın anlaşılmasını test etmektir.

Konu: Kapatma.

Cevap: Bir kapatmanın tanımından devam edersek - bir fonksiyonun bildirildiği bir değişkenin kapsamını hatırlama yeteneği, o zaman doğru cevap 5'tir. a fonksiyonun dışında önceden bildirilen değişkenin içeriğini hatırladı ve fonksiyonun çıktısından sonra onu uyarı 5'e geçirdi.

İstediğin kadar.

  • Komut dosyasını başlattıktan 3 saniye sonra bir uyarı görüntülemeniz gerekir. Nasıl yapılır?

Yani:

Veya bunun gibi:

  • JavaScript'teki kalıtım, PHP'deki kalıtımdan nasıl farklıdır?

Kalıtımın tek bir yolla yapılabildiği PHP'den farklı olarak JavaScript'in bu tür birçok yolu vardır. Dil düzeyinde, prototipler üzerinde kalıtım uygulanır.

JavaScript'te, her nesnenin başka bir nesneyle - "prototip" olarak adlandırılan bir ilişkisi olabilir. Bir özellik (veya yöntem) araması durumunda orijinal nesne başarısız olursa, yorumlayıcı kendi prototipinde, ardından prototip prototipinde vb. aynı adı taşıyan özelliği (yöntemi) bulmaya çalışır. Örneğin, obj.prop'a (veya kesinlikle aynı olan) bir çağrı istersek, obj ["prop" ]), JavaScript, prop özelliğini obj nesnesinin kendisinde, ardından obj prototipinde, obj prototipinde vb. sonuna kadar aramaya başlar.

  • JavaScript'te bir kalıtım örneği verin.

Örneğin, "kedi" nesnesinin "hayvan" nesnesinden miras aldığını varsayalım.Prototip kalıtımda, bu bir referans olarak uygulanır.

Veya işte biraz daha ayrıntılı bir örnek. MyType, Obj'den devralır:


  • JavaScript'teki nesneler hakkında bir kelime?

Nesneler (aynı zamanda ilişkisel diziler, karmalardır) ve bunlarla JavaScript'te çalışmak çoğu dilden farklı şekilde uygulanır. JavaScript'te bir nesne sıradan bir nesnedir. ilişkisel dizi veya başka bir deyişle, "karma". Herhangi bir anahtar => değer eşleşmesini saklar ve birkaç standart yöntemi vardır.

  • JavaScript'te nesne yöntemi nedir?

JavaScript'teki bir nesne yöntemi, basitçe bir ilişkisel diziye eklenen bir işlevdir.

  • JavaScript'te neden bir değişkenin önüne var yazalım?

Sıradan atama yoluyla bir değişken oluşturursanız, bir "genel değişken" oluşturulacaktır.Örnek:

Var sözcüğünü kullanarak bir değişken oluşturursanız, işlev tamamlandıktan sonra varlığı sona eren bir "yerel değişken" oluşturulur.Örnek:

  • İki işlev vardır:f (a, b) işlevi (a + b döndür) ve var f = işlev (a, b) (dönüş a + b).Aralarında bir fark var mı? Eğer öyleyse, hangisi?

İşlevin görünürlüğünde bir fark var. İşlevin var olmayan sürümü, geçerli kapsamda her yerde görünür. Fonksiyonun tanımına kadar dahil. var varyantı, bir değişkene bir işlev atar, bu nedenle işlev yalnızca tanımdan sonra görünür.

  • JavaScript'te nasıl dizi oluştururum?

İşte birkaç yol.

  • JavaScript'te bir işlev yapıcı olarak kullanılabilir mi?

Bunun gibi:

  • JavaScript'te kaç tane ve ne tür döngü yapısı vardır?

Üç: for, while ve do ... while.

  • Kodun yapacağı şey: kırma işareti; ?

Geçerli döngü bloğundan çıkın veya " etiketine geçin işaret ".

  • Bunun gibi bir dizi tanımlamak mümkün mü: var a = "a, b" .split (",")?

Evet yapabilirsin.

  • Hangisi uyarı verecek (typeof null); ?

"nesne" mesajını gösterecektir.

  • Ve bu: uyarı (nesnenin boş örneği); ?

"yanlış" mesajını gösterecektir.

  • 0.1 + 0.2 == 0.3 ?

Hayır çünkü hesaplanan değer 0.3000000000000000004 olacaktır. Bu, hesaplama hassasiyetinin etkisidir ve JavaScript ile sınırlı değildir.

  • Hangisi uyarı verecek (typeof NaN); ?

"Sayı"

  • Hangisi uyarı verecek (NaN === NaN); ?

"YANLIŞ"

  • innerHTML ve externalHTML özellikleri arasındaki fark nedir?

Herhangi bir DOM öğesinin innerHTML özelliği, bu öğenin içindeki HTML kodunu içerir. Bu özellik için yeni bir değer ayarlarken, dahili HTML kodu tarayıcı tarafından yeniden oluşturulur.

dışHTML, innerHTML ile hemen hemen aynıdır, aradaki fark, geri dönmesidir. tam HTMLöğe.

Ayrıca innerHTML'nin herkes tarafından desteklendiğini belirtmek önemlidir. modern tarayıcılar IE'de externalHTML desteklenirken (diğer tarayıcılardan bazı farklılıklarla), ikincisinde Opera sürümleri, ve en son WebKit (Safari, Chrome) tabanlı tarayıcılarda, ancak Firefox'ta desteklenmez.

Kod için:

innerHTML şunu döndürür:

dışHTML şunu döndürür:


  • == ve === operatörleri arasındaki fark nedir?

== operatörü eşitlik için karşılaştırır, ancak === kimlik için karşılaştırır. === operatörünün avantajı, aynı türe iki değer atamamasıdır. Yaygın olarak kullanılması bu yüzdendir.

  • Object.getOwnPropertyNames() ve Object.keys() arasındaki fark nedir?

Object.getOwnPropertyNames (), bir nesneden veya diziden numaralandırılabilir ve numaralandırılamaz özellikleri döndürür.

Object.keys (), bir nesneden veya diziden numaralandırılmış özellikleri döndürür.

  • Komut dosyası yürütme akışını kontrol etmek ve hataları izlemek için hangi dil yapısı kullanılabilir?

Bu, try() ... catch() yapısını kullanarak mümkündür.

  • Neden bir (); başarılı olur ve çağrı b(); hata mesajı veriyor?

a () işlevi, betiğin yüklenmesi aşamasında, "yüzüyor" gibi başlatılır ve b değişkeni bildirildiğinde işlev b başlatılır.

  • Küresel değişkenler nelerdir? Nasıl yaratılırlar? Global değişkenleri kullanmanın sorunları nelerdir?

Global bir değişken, yerel bir değişkenin (blok kapsamı ile sınırlı) aksine, belge boyunca kullanılabilen (görünür) bir değişkendir. program kodu içinde tanımlandığı)

Çoğunluk JavaScript geliştiricileri global değişkenleri kullanmaktan kaçınır. Sebeplerden biri, global ve yerel değişkenlerin adlarında olası bir çakışmadır. Ayrıca, global değişkenleri kullanan kodun bakımı ve test edilmesi daha zor olabilir.

  • JavaScript kapanışları nedir?

Basit bir deyişle, bu dahili bir işlevdir, yani. işlevde işlev.

Bir kapatma işlemine kapatma denir, çünkü ebeveyn yürütüldükten sonra veya harici fonksiyon, dahili kod hala yorumlayıcıda bulunur ve yürütülebilir. İç fonksiyon (kapatma) dış fonksiyondan değişkenler kullansa bile hatalar oluşmayacaktır.Örneğin, bu özellik olay işleyici işlevleri oluşturmak için kullanılabilir:


  • Dosya adıyla bir dize alan ve uzantıyı (son noktadan sonraki pasaj) döndüren bir işlev yazın.

    • Javascript'te prototip nedir?

    Genel anlamda prototip, zaten var olan nesnelere özellikler eklemenize izin veren bir özelliktir ve ayrıca JavaScript'te sınıf mirasını taklit etmek için kullanılır. Burada ayrıntılı bir cevap yazılmıştır. Başka bir seçenek de Prototype.js. JavaScript programlarına OOP dostu özellikler ekleyen popüler bir kitaplıktır.

    • Olay işleyicilerini asmanın hangi yollarını biliyorsunuz?

    Olaylar üç şekilde eklenebilir:

    • htmlElement.onclick = function (olay) (....) - bu şekilde yalnızca bir işleyici ekleyebilirsiniz
    • htmlElement.addEventListener ("tıkla", ...) - bu şekilde birkaç işleyici asabilirsiniz, işleyicilerin sırasını korur
    • htmlElement.attachEvent ("on" + event_name, işleyici) - ayrıca birkaç tane ekleyebilirsiniz, işleyicilerin sırasını korumaz, olayın tetiklendiği öğeye erişim yoktur.

Röportajlara isteyerek davet ediliyorum, özgeçmişindeki güzel bir fotoğrafın mı yoksa içeriğinin mi suçu bu bilmiyorum. Bir özgeçmişle ilgiliyse, mevcut her işte kullanılan teknolojileri tanımlamak için iki, üç saat harcıyorum. Bazen yabancılara, nasıl dekore edildiklerine bakıyorum ve aniden kendim için yararlı bir şey bulacağım ...

Görevler

Başlamak için daha kolay bir şey.

1. Bir satır var (var str = "fgfggg";), ya str alırsak?

Cevap

str, dizideki karakteri sıfır dizininde döndürür. js'deki bir dize değişmezdir, yani ondan bir karakter okunabilir, ancak yazılamaz.


2. Satır (2) .plus (3) .minus (1)'in yürütülmesi sırasında çıktıda 4 verecek yöntemleri uygulayın.

Cevap

Rakamlarla çalıştığımız için Number prototipini yeni yöntemlerle genişletmemiz gerekiyor.

Number.prototype.plus = işlev (değer) (bu + değeri döndürür;) Number.prototype.minus = işlev (değer) (bunu döndürür - değeri;)
İki numara, artı işlevinde bunun aracılığıyla kullanılabilir olacaktır. Ondan, bununla işaret edilen sayıyı ve argüman olarak iletilen sayıyı toplamanın sonucunu döndürürüz. Aynı şekilde eksi için.


3. Günümüzde nadirdir, ancak insanlar hala soruyor: "Temel türlerin prototiplerine doğrudan yazmak neden kötü?"

Cevap

Array.prototype.sort = fonksiyon () () var t =; t.sort ()
Beklenen sonuç şudur ve tanımsız olarak dönecektir.
bunu bekliyoruz standart yöntemler belgelere göre çalışacak, ancak bazı geliştiriciler yöntemi geçersiz kılabilir ve tamamen beklenmedik sonuçlar döndürür.
Bu nedenle prototip.js kitaplığı yerini jQuery'ye bıraktı.


4. Bir işlev verildiğinde, "*", "1", "b", "1c" dizelerini argüman olarak kabul eder, "1 * b * 1c" dizesini döndürecek şekilde uygular.

Cevap

Bir döngüdeki tüm argümanları yineleyerek doğrudan çözülebilir, ancak bunu daha akıllıca yapacağız.

getStr() işlevi (dönüş .slice.call (argümanlar, 1) .join (argümanlar))


5. Bir ağaç verildiğinde, tüm köşelerin toplamını bulmanız gerekir.

Cevap

Sorunu özyineleme ile çözdüm, sonra çözümü basitleştirdik ve sonra kuyruğa yeniden yazdık.

özyineleme.

Var toplamı = 0; function getSum (obj) (sum + = obj.valueNode; if (obj.next! = null) (for (var i = 0; i)< obj.next.length; i++) { getSum(obj.next[i]); } } return sum; } var tree1 = { valueNode: 1, next: [ { valueNode: 3, next: null }, { valueNode: 2, next: null } ] } var tree = { valueNode: 3, next: [{ valueNode: 1, next: null }, { valueNode: 3, next: null }, { valueNode: 2, next: null }, { valueNode: 2, next: [ { valueNode: 1, next: null }, { valueNode: 5, next: null } ] }] }; console.log(getSum(tree1)); sum = 0; console.log(getSum(tree));
Sıra.

getSum (obj) işlevi (var dizi =, toplam = 0, akım; while (dizi.uzunluk> 0) (geçerli = dizi.shift (); toplam + = akım.değerNode; if (current.next! = Null) ( for (var i = 0; i< current.next.length; i++) { arr.push(current.next[i]); } } } return sum; } var tree = { valueNode: 3, next: [{ valueNode: 1, next: null }, { valueNode: 3, next: null }, { valueNode: 2, next: null }, { valueNode: 2, next: [ { valueNode: 1, next: null }, { valueNode: 5, next: null } ] }] }; getSum(tree)


6. js'den önce, sonra değerleri değiştirmek mümkün müdür?

Cevap

Hayır, yapabileceğimiz tek şey önce veya sonra olan sınıfı kaldırmak veya tam tersine eklemek.


Hadi, beyni boşaltacak bir şey, düzen için bir soru.

7. Üç adet 20X20px bloğunu 60px'lik bir blokta, blokların kenarlıkları olacak şekilde arka arkaya yerleştirin.

8. Öğeler için yuvarlatılmış köşeler ve metin için stiller (yazı tipi, yazı tipi, renk vb.) nasıl uygulanır?

Cevap

Etiketler için stil kuralları belirtilmemişse, metin içeren tüm öğelere stil özellikleri uygulanacaktır. Örneğin, bağlantıların varsayılan bir metin rengi vardır ve gövdede tanımladığımızdan daha yüksek önceliğe sahiptir. Gerçek şu ki, birçok özellik için varsayılan değer devralır, yani ebeveynde olduğu gibi. Vücuda ulaşana kadar yukarı doğru döner.
border-radius özelliği ise sadece köşeleri yuvarlatılmış olmasını istediğimiz etiket için geçerlidir.


9. Stilleri Sıfırla Nedir?

Cevap

Pek çok etiket varsayılan olarak biçimlendirilir ve yerleşim süreci sırasında bunları geçersiz kılmamız gerekir. Bunu her seferinde yapmamak için onları "büyük miktarlarda" "atıyoruz". Bunu yapmak için, stiller için bir dosya oluştururuz, onu önce veya ilk stil dosyasına dahil ederiz, en üstte temel etiketler için stillerimizi belirtiriz.
Örneğin. Menü düzeni için genellikle ul listesini kullanırız, bunun için her seferinde dolgu, kenar boşluğu ve liste stili türünü sıfırlamamız gerekir. Stilleri bir kez ayarlayabilirsiniz ve listeler dış ve iç kenarlıkların yanı sıra işaretçisiz hale gelir.


10. Açılır pencereyi ortaya yerleştirmek gerekiyor, boyutunu biliyoruz, ancak sayfa boyunca kaymasını istemiyoruz ve yüksekliği ekranın yüksekliğine sığmayabilir.

Cevap

gövde (taşma: gizli;) .wrap (konum: sabit; üst: 0; sol: 0; genişlik: %100; yükseklik: %100; taşma-y: otomatik; arka plan rengi: rgba (230, 230, 230, .1);) .popup (konum: mutlak; genişlik: 400 piksel; yükseklik: 300 piksel; sağ: 0; sol: 0; üst: 0; alt: 0; kenar boşluğu: otomatik;)


11. Stilleri olan bir yarım daire çizin.

Cevap

genişlik: 100 piksel; yükseklik: 100 piksel; sağ kenarlık: 1 piksel katı # f00; sınır yarıçapı: 0 %50 %50 0;


12. Tarihlere göre sıralanmış nesneler içeren bir dizi var.

Cevap

var arr = [(tarih: "01/10/2017"), (tarih: "11/05/2016"), (tarih: "13/21/2002"]); arr.forEach (işlev (öğe) (var arrDate = item.date.split ("."), tarih = new Date (Sayı (arrDate), Number (arrDate), Number (arrDate)); item.time = tarih. getTime();)); arr.sort (işlev (a, b) (if (a.time - b.time)< 0) { return false; } else { return true; } }); var res = arr.map(function (item) { return {date: item.date}; }); console.log(res);


13. Aynı harflerden oluşup oluşmadıklarını belirlemek için birkaç kelime vardır ("cat", "current", "oct")

Cevap

var arr = ["kot", "tok", "okt"], arr1 = ["kot", "tok", "ott"]; function sameWords (arr) (var word1, word2; for (var i = 0; i)< arr.length-1; i++) { word1 = 0; word2 = 0; if (arr[i].length !== arr.length) { return false; } else { for (var j = 0; j < arr[i].length; j++) { word1 += arr[i][j].charCodeAt(0); word2 += arr[j].charCodeAt(0); } if (word1 !== word2) { return false; } } } return true; } console.log(sameWords(arr)); console.log(sameWords(arr1));

vaatler hakkında

V son zamanlar genellikle söz, ne olduğu, hangi hata işleme yöntemlerinin onlarsız yapılabileceği hakkında sorular sormaya başladılar.(14, 15, 16)

Cevap

Uzaktan başlayacağım, çünkü js asenkron olduğundan, daha sonra, hazır olduğunda çağrılan argümanlar olarak geri arama işlevleri iletildiğinde belirli bir tamamlanmanın izlenmesinin bir sonucu olarak. Zaman uyumsuz yöntemler zinciri büyüdü, bu da kodla çalışmayı, hata ayıklamayı zorlaştıran Geri Arama Cehennemine yol açtı ve bunların yerini vaatler aldı.

Var promis = new Promise (işlev (çöz, reddet) (... setTimeout (işlev () (çöz (çöz);), 5000);));
Birkaç vaat birleştirilebilir ve onlardan bir kerede yanıt alınabilir.
var SözlerImages =; için (i = 0; i< count; i++) { promisesImages.push(new Promise((resolveImg, rejectImg) =>(let img = new Image (), startTime = Date.now (); img.src = this.imgUrl + "?" + Math.floor (Math.random () * 100000000); img.onload = () => (resolveImg (Date.now () - startTime);); img.onerror = redImg;))); ) Promise.all (promisesImages) .then ((zamanlamalar) => (...))


17. Ve elbette doldurma sorusu: "Söz vermeden nasıl yapabilirsiniz?"

Cevap

Eski usulde bir sayaç değişkeni getirildi ve bir sonraki asenkron eylemin sonu gelir gelmez değişken toplam tutarla karşılaştırıldı.


18. Sözlerde hata işleme ile ilgili soruyu da hatırladım. Sunucuya üç isteğimiz var, biri bize kullanıcı adını, ikincisi verilerini ve avatar için üçüncü görüntüyü veriyor, her istek için bir söz kullanıyoruz, bunları bir zincirde birleştiriyoruz, birinde bir hata olursa ne olacak isteklerin zinciri tamamlanacak mı?

Cevap


Sözler büyümeye devam ediyor ve Geri Arama Cehennemi, Söz Cehennemi ile değiştirildi. Ne yapalım?

Cevap

işlev testi () (yeni Söz ver (işlev (çöz) (setTimeout (işlev () (çöz (1);))))) zaman uyumsuz işlev test1 () (var res = test bekle (); console.log (res + 1); )
Aslında, testten bir yanıt alana kadar test1'in yürütülmesi "duruyor" gibi görünüyor. Bu yöntemleri daha önce okumuştum ama çok dikkat etmemiştim ama bir şekilde onlardan bahsettiğimiz bir sohbette şaşırdım: “Nasıl oluyor, yürütme duruyor, işlevin ne olduğu, nerede olduğu belli değil. geri arama tanımlandığında - burada her şey açık, işlemin tamamlanmasının ardından işlevde ne olacağını görebilirsiniz veya bağlam hakkında her zamanki gibi her zaman ada göre arama yapabiliriz. " Beynin javascript'ine sahip olduğumu ve uyumsuzluğa o kadar alışkınım ki, eşzamanlı yürütme bana sınırların ötesinde bir şey gibi görünüyor ve aslında, bir zamanlar her şeyi eşzamanlı olarak programladığım nefeste, hatta var. bir dosyadan okuma tamamlanana kadar devam ederse daha fazla devam etmeyecektir.


(19) İşte bir başka asenkroni örneği. Sayıların hangi sırayla görüntüleneceğini ve neden böyle olduğunu açıklayın.
konsol.log (1); setTimeout (işlev () (konsol.log (2);), 0) konsol.log (3);
Oldukça popüler, söylemeliyim. bu yüzden içeri aldım Yeniden... Zaten cevap vermeye başladı: "1, 3, 2. js asenkron olmasına rağmen, ancak içinde bir yürütme kuyruğu ve setTimeout ve setInterval olduğundan, 0 belirtilirse, işlev çağrısını kuyruğun sonuna koyun. "
Burada, 132 civarında doğru cevap verdiğimi söyleyerek, erkeklerin başarısız olduğunu söylemeliyim, ancak nedenini açıklamadım.

(20) Genel olarak setTimeout ve setInterval ile ilgili sorular çok alakalı.Bana soruldu: "Sorabileceğiniz minimum süre nedir?"

Cevap

Her tarayıcının kendi minimumu vardır, bundan daha azını belirtirseniz, gecikme minimumdan daha az olmayacaktır. Bazen, görev kuyruğa girdiğinden ve zaman belirtilenden artı kuyruktaki görevlerin yürütülmesinin maliyetinden önce toplandığından, bazen belirtilen süreden daha fazla.

Kapatma olmadan nerede

Çok uzun zaman önce, bu örnek için bir makalenin tamamını vurguladık (), okuyucular yorumlarda yazdı her türlü yol gelenekselden fantastike uzanan çözümler. Genelde röportajlarda bahsettiğim şeyler bunlar.
for (var i = 0; i< 10; i++) { setTimeout(function () { console.log(i); }, 100); }
21. Konsolda ne görüntülenecek, doğru sonucu döndürmek için örnek nasıl değiştirilebilir (mümkün olduğunca çok şekilde adlandırın)?

Cevap

En yaygın, bir kapağa sarın

için (var i = 0; i< 10; i++) { (function (i) { setTimeout(function () { console.log(i); }, 100); })(i) }
Herkes sadece bağlamı i'ye aktarmanın mümkün olmadığına dikkat etmedi.

için (var i = 0; i< 10; i++) { setTimeout(function (i) { console.log(i); }.bind(this, i), 100); }
Ayrıca setInterval ve setTimeout yöntemleri, geri çağırma işlevine bağımsız değişkenler olarak iletilecek bağımsız değişkenler olarak geçirilebilir.
for (var i = 0; i< 10; i++) { setTimeout(function (i) { console.log(i); }, 100, i); }
es6

için (i = 0; i< 10; i++) { setTimeout(function () { console.log(i); }, 100); }
es6'nın özelliklerinden biri, bu durum biraz beklenmedik bir şekilde çalışacak, () bloğunda olmasın.


Hadi hardcore bir şeyler yapalım.

22. Dönecek bir fonksiyon yazmak gerekiyor. Selam Dünya", Ancak aynı zamanda işlev gövdesinde ne sayılar ne de harfler kullanılamaz ve döngüler, diziler, nesneler kullanılabilir, ancak sayı olmadan.

Cevap

Ne yazık ki, bu ilginç insanlar bana nasıl çözüleceğini söylemediler, bu yüzden evde düşündükten sonra sadece tahmin edebilirim.

Var sıfır = .uzunluk, bir = [()] Uzunluk, iki = [,] Uzunluk, yedi = [,] Uzunluk; konsol.log (String.fromCharCode (Sayı (Dize (yedi) + Dize (iki))));
Böylece H harfini aldım, ama bu hala bir sapkınlık, kalan 10 karakteri yapmaya devam ediyor ...


(23) Onlardan. 1'den 100'e kadar olan sayılar dizide rastgele karıştırılmış, oradan bir sayı çıkarılmış, nasıl bir sayı olduğunu bulmanız gerekiyor. algoritma O (n ^ 2) karmaşıklığını aşmamalıdır.

Cevap

Dizide dolaşın ve oradaki tüm sayıları toplayın ve (n + 1) / (n / 2) formülüyle elde edilen sayıdan çıkarın.

Aklıma daha egzotik bir çözüm geldi. Çocuklar ve kalbi zayıf olanlar bakmasalar daha iyidir.

Var toplam = 101 * 50, sumArr = eval (.join ("+"). Replace ("++", "+")), res; res = toplam-sumArr;


Bir keresinde sorduklarını hatırladım: "Dizi öğelerinin toplamını bulmanın en hızlı yolu nedir?"

Cevap

eval (.join ("+")


O anda, hatırladım ve daha iyi bir şeye gelmedim.

(24) İşte başka bir başarısızlık sorunu. Ben aynen aktaracağım, bana yazdıkları gibi yazacaklar.

Fonksiyon Kitabı (isim, yazar) (this.name = isim; this.author = yazar; şunu döndür;) function Foo (Kitap, "Javascript öğreticisi", "Peter Sergeev")
Foo'yu uygula

Cevap

Bu satır işlevi Foo (Kitap, "Javascript Eğitimi", "Peter Sergeev") ile kafam karıştı. Sadece burada bir şeylerin yanlış olduğunu görüyorum? Object.create () aracılığıyla bir çözüm önerildi, ancak katılmıyorum. Yapıcı işlevinin kendisine yazılan özellikler ve yöntemler, Object.create'e "kopyalanmayacaktır".

Function Book (ad, yazar) (this.name = name; this.author = yazar; bunu döndür;) function Foo (Cclass, name, Author) (return Object.create (Cclass.prototype);) var book = Foo ( Kitap, "js", "petr"); konsol.log (kitap.adı); -> tanımsız
Elbette beni almadılar ama son olarak teoriyi daha iyi incelememi tavsiye ettiler. Ahmak.
Her durumda, bu şekilde karar vermeyi tercih ederim.

Function Book (isim, yazar) (this.name = name; this.author = yazar; bunu döndür;) function Foo (Cclass, name,writer) (return Cclass.call ((), name, yazar);) var book = Foo (Kitap, "js", "petr"); konsol.log (kitap.adı);
Erkeklere mülakatlara daha iyi hazırlanmalarını tavsiye etmek istiyorum.

palindrom sorunu

(25) Evet hala soruluyor. Ve birkaç kez karşıma çıktı. İlk defa bir döngüde çözmeye başladım, işe yaradı, sadece sorun kaldı farklı semboller, her karakter için değiştirme yazmak bir seçenek değil ve düzenli olarak güçlü değilim ve ilk eşleşen oluşumuna kadar çalışacak. Arkamda anlaşılmaz bir şey bırakmaya alışık değilim, bu yüzden işlevi nasıl uygulayacağımı buldum.

İşlev isPalindrom1 (str) (if (str.toLowerCase (). Değiştirin (/ [^ a-ЯА-ЯёЁ] / g, "") === str.toLowerCase (). Değiştirin (/ [^ а-ЯА-ЯёЁ ] / g, "") .split (""). ters (). birleş ("")) (doğru döndür;) başka (yanlış döndür;))
Güzel, sade, zarif.

Komik, ama yaklaşık bir yıl sonra aynı soruyla karşılaştım. Memnun oldum: "Şanslı." Anlaşıldığı üzere, hayır. Bir döngü ile çözmek gerekiyordu ve normal ifade sadece bir karakter için kullanılabilirdi. Muhatap bunu, tüm hat boyunca düzenli bir modelle değiştirmenin çok kaynak yoğun olduğu gerçeğiyle motive etti.

Evde düşünürken, şöyle bitirdim:
function isPalindrom (str) (var str = str.toLowerCase (), lim = str.length - 1, i = 0, j = str.length - 1; while (i<= lim) { if (/[^а-яА-ЯёЁ]/.test(str[i])) { i += 1; } if (/[^а-яА-ЯёЁ]/.test(str[j])) { j -= 1; } if (str[i] != str[j]) { return false; } i += 1; j -= 1; } return true; } console.log(isPalindrom("А роза упала на лапу Азора"));
26. js, css nasıl bağlanır? Farklı yolların artıları, eksileri?

Cevap

Etiketleri kullanmak mümkündür

sayfanın sağında veya

Tarihte, aşağıdaki satırı ekleyin
"); uyarı (document.cookie);"

Verinin yeri için, işlev çağrısını kapatacak ve kullanıcı tarafından yürütülecek bir kod döndürebilirsiniz.
Şimdi zaten düzelttiler, ancak json'da kritik bir güvenlik açığı olmadan önce, bir satır sonu karakteriyle kırıldı.


32. Sayfa yüklemenin hızlandırılması.

Cevap

1 tüm js dosyalarını küçültün ve tek bir dosyaya yapıştırın
2 css ile aynı
3 görüntüleri sprite olarak toplayın
4 önbelleğe alma
a) js ve css dosyaları sonsuza kadar (veya uzun bir süre, örneğin bir yıl için) önbelleğe alınır, bunlarda bazı değişiklikler yapıldığında, geliştirme sonucunda sürüm numarası değişir, tarayıcı bunların yeni dosyalar olduğunu düşünür ve onları yükler. Önbelleğe alma süresi, sona erme başlığında bulunur.
b) dosya, içinde değişiklikler meydana gelene kadar önbelleğe alınır. Bir kullanıcı siteyi ilk kez ziyaret ettiğinde, hala bir önbelleği yoktur, dosyalar yüklenir ve bir sonraki başlık değiş tokuşu yapıldığında, bir ETag analiz edilir (dosyanın içeriğinin toplamının hash'i veya hash'i). son değiştirilme zamanı veya sürüm numarası) Değiştiyse, yüklendiyse, aksi takdirde karmadan alınır.
Ayrıca son değişikliğin (Last_Modifed) tarihini içeren başlıklar da alabilirsiniz, ancak bu daha az güvenilirdir.
c) göndermeden önce verileri sıkıştırabilirsiniz, buna nginx'te yapılandırma yapılandırılarak karar verilir. Örnek. İçerik Kodlaması: gzip
d) js modüllere bölünebilir ve gerektiğinde farklı sayfalara bağlanabilir.

Birkaç tane daha bulabilirsiniz, ancak daha az popüler veya modası geçmiş.


33. CommonJS ve AMD mi yoksa modülerlik mi?

Cevap

Arketektranın bir prensibi asenkron, diğeri ise senkronizedir. Örnek olarak RequaerJs verilebilir, tipine göre asenkron olduğunu söyleyebiliriz.

Define ([mod1, mod2, mod3], function (Mod1, Mod2, Mod3) (yeni Mod1 (); ....));
define aslında basit bir işlevdir, şapellerinin arkasına yazılan her şey, define'de ne olduğuna bakılmaksızın yürütülür, bu nedenle callbeck işlevi bir argümandır. Dizide listelenen tüm bağımlılıklar yüklenir yüklenmez, callbeck işlevinin bağımsız değişkenleri aracılığıyla dahili olarak kullanılabilir hale gelirler.
Aksine, Node.Js'deki modül sistemi senkronizedir. Yazıyoruz:

Var mod = gerekli ("modül");
ve hemen altında mod ile çalışabilirsiniz, modül yüklenene kadar her şey durur


34. Bir başka ilginç örnek. Yedi, artı, bir, beş, eksi, iki yöntemlerini uygulayın. yedi (artı (bir ())) -> 8.beş (eksi (iki ())) -> 3

Cevap

Röportaj için şöyle karar vermeye başladım:

Birinci fonksiyon (arg) (if (arg typeof === "function") (return arg (1);) else (return 1;)) fonksiyon yedi (arg) (if (arg typeof === "function") ( dönüş arg (7);) başka (dönüş 7;)) işlev artı (arg) (dönüş işlevi (a) (dönüş a + arg;))
Beş, eksi, iki için fonksiyonlar benzer şekilde yazılır. Zaten evde, sakin bir ortamda düşünerek böyle bir karar çıktı

Birinci işlev (arg) (dönüş 1 + (arg || 0);) işlev iki (arg) (dönüş 2 + (arg || 0);) işlev beş (arg) (dönüş 5 + (arg || 0); ) işlev yedi (arg) (dönüş 7 + (arg || 0);) işlev artı (arg) (arg dönüşü;) işlev eksi (arg) (dönüş -arg;)


35. Kabarcık sıralama.

Evet, evet, hala ona soruyorlar.

Cevap

var m =, sayı = m.uzunluk - 1, maks; for (var i = 0; i< count; i++) { for (var j = 0; j < count - i; j++) { if (m[j] >m) (maks = m [j]; m [j] = m; m = maks;)))


36. Ters Polonya notasyonu.

Temel ilke. 23 + 1- satırına göre hareket etmeye başlarız, ilk aritmetik işarete ulaşır ulaşmaz önüne iki rakam alırız ve onların yerine hesaplamanın sonucunu yazarız. 51- çıkıyor. Her şeye yeniden başlıyoruz.
Kimin umrunda, işte wikipedia makalesi

Cevap

var notation = "23 + 1-", notation1 = "7 2 3 * -", notation2 = "1 2 + 4 * 3 +"; function getComputation (gösterim) (var kuyruğu =, tmp, num1, num2; for (var i = 0; i)< notation.length; i++) { if (/\d+/.test(notation[i]) === true) { queue.push(Number(notation[i])); } else { switch (notation[i]) { case "+": tmp = queue.pop() + queue.pop(); queue.push(tmp); break; case "-": num1 = queue.pop(); num2 = queue.pop(); if (num1 >num2) (tmp = num1 - num2;) başka (tmp = num2 - num1;) kuyruk.push (tmp); kırmak; durum "*": tmp = kuyruk.pop () * kuyruk.pop (); sıra.push (tmp); kırmak; durum "/": tmp = kuyruk.pop () / kuyruk.pop (); sıra.push (tmp); kırmak; ))) dönüş kuyruğu; ) konsol.log (getComputation (gösterim)); konsol.log (getComputation (gösterim1)); konsol.log (getComputation (gösterim2));
Bana prensibi söylendi, bu yüzden sadece mekanizmayı uygula.


37. Bir div var, içinde başka bir div var, ikincisi %50 dolgulu, nasıl görünecek?

Cevap

Sarma (genişlik: 200 piksel; kenarlık: 1 piksel düz yeşil;) .block (genişlik: 200 piksel; dolgu-alt: %50; kenarlık: 1 piksel düz kırmızı;)


Muhatap, çok ilgilenmeme rağmen, evde nasıl çalışacağını görmemi önerdi.
Sizce, aday başa çıkmadıysa, bir röportajın soruyu kendiniz cevaplaması doğru mu?

38. Farklı parantezlerden oluşan bir satır var, hepsinin kapalı olup olmadığını kontrol edin. Örnek satır: "()) (()) (()] ["

Cevap

function validBraces (str) (var arrOpenSymbols =, sonuç = false, countOpenSymbols; if (str.length> 0) ((var i = 0; i için)< str.length; i++) { if (str[i] === "{" || str[i] === "[" || str[i] === "(") { arrOpenSymbols.push(str[i]); } else { countOpenSymbols = arrOpenSymbols.length; if ((str[i] === "}" && arrOpenSymbols[(countOpenSymbols-1)] === "{") || (str[i] === "]" && arrOpenSymbols[(countOpenSymbols-1)] === "[") || (str[i] === ")" && arrOpenSymbols[(countOpenSymbols-1)] === "(")) { arrOpenSymbols.pop(); } } } if (arrOpenSymbols.length === 0) { result = true; } else { result = false; } } return result; } console.log(""); console.log(validBraces("()")); console.log(validBraces("[)")); console.log(validBraces("{}()")); console.log(validBraces("([{}])")); console.log(validBraces("())({}}{()]["));
Dizeler "(", "[", "]", ")" parantezlerinden geçirilmişse

validBraces (str) işlevi (deneyin (eval (str); true döndür;) catch (err) (yanlış döndür;))


39. Kök içindeki herhangi bir div'e tıkladığınızda kimliğini konsolda gösterecek bir kod yazın.

kök id1
id2
id3

Cevap

$ ("# root"). on ("click", function (event) (event.stopPropogation (); console.log ($ (event.target) .attr ("id"));))


40. Bir diziden bir nesne oluşturacak bir kod yazın
// girişteki dizi
var arr = [(ad: "genişlik", değer: 10), (ad: "yükseklik", değer: 20)]
// çıkıştaki nesne
(genişlik: 10, yükseklik: 20)

Cevap

function getObj (dizi) (var nesne = (); dizi.forEach (işlev (öğe) (nesne = öğe.değer;)); dönüş nesnesi;)


41. Sonuç ne olacak?

var i = 10; var dizi =; while (i--) ((işlev (i) (var i = i; array.push (işlev () (dönüş i + i;));)) (i);) console.log ([dizi (), dizi (),])

Cevap

çünkü işlevi nedeniyle

(işlev (i) ()) (i);
bir kapatma oluşturur, var i = i - zaten kapatmalarda kapsamlandırılmıştır.

() işlevi (dönüş i + i;)
başlangıçta i'yi kendi kapsamında arayacak, onu bulmadan daha yüksek bir seviyeye çıkacak ve orada onu bulacak. İşlev, son öğe tarafından diziye eklenecek toplamı döndürür.


42. Bir fonksiyon ve bir nesne vardır. Fonksiyonu kullanarak bir nesneden konsola x değerini yazdırmak için bildiğiniz tüm yolları yazın.

f () işlevi (console.log (this.x);) var obj = (x: "bar");

Cevap

f.çağrı (obj, a, b); f.apply (obj,); obj.funk = f () işlevi (console.log (this.x);) obj.funk (); fonksiyon f () (console.log (this.x);) .bind (obj, a, b); F ();


43.
function Kitap () (this.name = "foo") Book.prototype = (getName: function () (bu.name döndür;)); var kitap = yeni Kitap (); Book.prototype.getUpperName = function () (bunu döndür.getName (). ToUpperCase ();) book.getUpperName ();
Yöntem ne döndürecek?
a) bir hata, çünkü yöntem, örneklemeden sonra bildirilir
b) "FOO" geri dönecek

Cevap


44. js'de değişkenler şu şekilde bildirilir:
a = 3; b = "merhaba"; fonksiyon showBlock () (var blok1 = document.getElementsByClassName ("block1"), blok2 = document.getElementsByClassName ("block2"); if (! (block1.childNodes.length> 0)) (block2.style.display = "block ";)) document.addEventListener (" DOMContentLoaded ", function () (showBlock ();));

Tabii ki, bunlar çözmem gereken tüm görevler değil, bazılarını güvenle unuttum, bazıları çok banal, birçok soru, sadece teori hakkında, perde arkasında kaldı.

Başka

İşte birkaç soru daha, doğrudan cepheyle ilgili değiller, ancak muhtemelen bilmek gereksiz değil.
Sunumunuzda mükemmel bir arayüz mü?
Hataya dayanıklı bir siteyi nasıl yaparsınız?
Ne tür güvenlik açıkları biliyorsunuz?

Etiketler: Etiket Ekle

İstediğin kadar.

  • Komut dosyasını başlattıktan 3 saniye sonra bir uyarı görüntülemeniz gerekir. Nasıl yapılır?

Yani:

Veya bunun gibi:

  • JavaScript'teki kalıtım, PHP'deki kalıtımdan nasıl farklıdır?

Kalıtımın tek bir yolla yapılabildiği PHP'den farklı olarak JavaScript'in bu tür birçok yolu vardır. Dil düzeyinde, prototipler üzerinde kalıtım uygulanır.

JavaScript'te, her nesnenin başka bir nesneyle - "prototip" olarak adlandırılan bir ilişkisi olabilir. Orijinal nesnede bir özellik (veya yöntem) araması başarısız olursa, yorumlayıcı aynı adı taşıyan özelliği (yöntemi) kendi prototipinde, ardından prototip prototipinde vb. bulmaya çalışır. Örneğin, bir çağrı istersek obj.prop'a (veya tamamen aynı olan obj ["prop"]), JavaScript prop özelliğini obj nesnesinin kendisinde, ardından obj prototipinde, obj prototipinde vb. son.

  • JavaScript'te bir kalıtım örneği verin.

Örneğin, "kedi" nesnesinin "hayvan" nesnesinden miras aldığını varsayalım.Prototip kalıtımda, bu bir referans olarak uygulanır.

Veya işte biraz daha ayrıntılı bir örnek. MyType, Obj'den devralır:


  • JavaScript'teki nesneler hakkında bir kelime?

Nesneler (aynı zamanda ilişkisel diziler, karmalardır) ve bunlarla JavaScript'te çalışmak çoğu dilden farklı şekilde uygulanır. JavaScript'teki bir nesne, basit bir ilişkisel dizidir veya başka bir deyişle bir "karma"dır. Herhangi bir anahtar => değer eşleşmesini saklar ve birkaç standart yöntemi vardır.

  • JavaScript'te nesne yöntemi nedir?

JavaScript'teki bir nesne yöntemi, basitçe bir ilişkisel diziye eklenen bir işlevdir.

  • JavaScript'te neden bir değişkenin önüne var yazalım?

Sıradan atama yoluyla bir değişken oluşturursanız, bir "genel değişken" oluşturulacaktır.Örnek:

Var sözcüğünü kullanarak bir değişken oluşturursanız, işlev tamamlandıktan sonra varlığı sona eren bir "yerel değişken" oluşturulur.Örnek:

  • İki işlev vardır:f (a, b) işlevi (a + b döndür) ve var f = işlev (a, b) (dönüş a + b).Aralarında bir fark var mı? Eğer öyleyse, hangisi?

İşlevin görünürlüğünde bir fark var. İşlevin var olmayan sürümü, geçerli kapsamda her yerde görünür. Fonksiyonun tanımına kadar dahil. var varyantı, bir değişkene bir işlev atar, bu nedenle işlev yalnızca tanımdan sonra görünür.

  • JavaScript'te nasıl dizi oluştururum?

İşte birkaç yol.

  • JavaScript'te bir işlev yapıcı olarak kullanılabilir mi?

Bunun gibi:

  • JavaScript'te kaç tane ve ne tür döngü yapısı vardır?

Üç: for, while ve do ... while.

  • Kodun yapacağı şey: kırma işareti; ?

Geçerli döngü bloğundan çıkın veya " etiketine geçin işaret ".

  • Bunun gibi bir dizi tanımlamak mümkün mü: var a = "a, b" .split (",")?

Evet yapabilirsin.

  • Hangisi uyarı verecek (typeof null); ?

"nesne" mesajını gösterecektir.

  • Ve bu: uyarı (nesnenin boş örneği); ?

"yanlış" mesajını gösterecektir.

  • 0.1 + 0.2 == 0.3 ?

Hayır çünkü hesaplanan değer 0.3000000000000000004 olacaktır. Bu, hesaplama hassasiyetinin etkisidir ve JavaScript ile sınırlı değildir.

  • Hangisi uyarı verecek (typeof NaN); ?

"Sayı"

  • Hangisi uyarı verecek (NaN === NaN); ?

"YANLIŞ"

  • innerHTML ve externalHTML özellikleri arasındaki fark nedir?

Herhangi bir DOM öğesinin innerHTML özelliği, bu öğenin içindeki HTML kodunu içerir. Bu özellik için yeni bir değer ayarlarken, dahili HTML kodu tarayıcı tarafından yeniden oluşturulur.

dışHTML, innerHTML ile hemen hemen aynıdır, fark, öğenin tam HTML'sini döndürmesidir.

Ayrıca, innerHTML'nin tüm modern tarayıcılar tarafından desteklendiğini, dışHTML'nin ise IE'de (diğer tarayıcılardan bazı farklılıklarla) desteklendiğini belirtmek önemlidir. en son sürümler Opera ve en son WebKit (Safari, Chrome) tabanlı tarayıcılarda, ancak Firefox'ta desteklenmez.

Kod için:

innerHTML şunu döndürür:

dışHTML şunu döndürür:


  • == ve === operatörleri arasındaki fark nedir?

== operatörü eşitlik için karşılaştırır, ancak === kimlik için karşılaştırır. === operatörünün avantajı, aynı türe iki değer atamamasıdır. Yaygın olarak kullanılması bu yüzdendir.

  • Object.getOwnPropertyNames() ve Object.keys() arasındaki fark nedir?

Object.getOwnPropertyNames (), bir nesneden veya diziden numaralandırılabilir ve numaralandırılamaz özellikleri döndürür.

Object.keys (), bir nesneden veya diziden numaralandırılmış özellikleri döndürür.

  • Komut dosyası yürütme akışını kontrol etmek ve hataları izlemek için hangi dil yapısı kullanılabilir?

Bu, try() ... catch() yapısını kullanarak mümkündür.

  • Neden bir (); başarılı olur ve çağrı b(); hata mesajı veriyor?

a () işlevi, betiğin yüklenmesi aşamasında, "yüzüyor" gibi başlatılır ve b değişkeni bildirildiğinde işlev b başlatılır.

  • Küresel değişkenler nelerdir? Nasıl yaratılırlar? Global değişkenleri kullanmanın sorunları nelerdir?

Genel değişken, yerel değişkenin (tanımlandığı program kodu bloğuyla sınırlı) aksine belgenin tamamında kullanılabilen (görünür) bir değişkendir.

Çoğu JavaScript geliştiricisi global kullanmaktan kaçınır. Sebeplerden biri, global ve yerel değişkenlerin adlarında olası bir çakışmadır. Ayrıca, global değişkenleri kullanan kodun bakımı ve test edilmesi daha zor olabilir.

  • JavaScript kapanışları nedir?

Basit bir deyişle, bu dahili bir işlevdir, yani. işlevde işlev.

Bir kapatmaya kapatma denir, çünkü üst veya dış işlevin yürütülmesinden sonra iç kod yorumlayıcıda kalır ve yürütülebilir. İç fonksiyon (kapatma) dış fonksiyondan değişkenler kullansa bile hatalar oluşmayacaktır.Örneğin, bu özellik olay işleyici işlevleri oluşturmak için kullanılabilir:


  • Dosya adıyla bir dize alan ve uzantıyı (son noktadan sonraki pasaj) döndüren bir işlev yazın.

    • Javascript'te prototip nedir?

    Genel anlamda prototip, zaten var olan nesnelere özellikler eklemenize izin veren bir özelliktir ve ayrıca JavaScript'te sınıf mirasını taklit etmek için kullanılır. Burada ayrıntılı bir cevap yazılmıştır. Başka bir seçenek de Prototype.js. JavaScript programlarına OOP dostu özellikler ekleyen popüler bir kitaplıktır.

    • Olay işleyicilerini asmanın hangi yollarını biliyorsunuz?

    Olaylar üç şekilde eklenebilir:

    • htmlElement.onclick = function (olay) (....) - bu şekilde yalnızca bir işleyici ekleyebilirsiniz
    • htmlElement.addEventListener ("tıkla", ...) - bu şekilde birkaç işleyici asabilirsiniz, işleyicilerin sırasını korur
    • htmlElement.attachEvent ("on" + event_name, işleyici) - ayrıca birkaç tane ekleyebilirsiniz, işleyicilerin sırasını korumaz, olayın tetiklendiği öğeye erişim yoktur.