Первый основной вопрос на стороне ByteDance

JavaScript

Общий обзор

Привет всем, я Мелио Пиг, я принадлежу к интерфейсу Mengxin. Это первый раз, когда я пишу статью о самородках. Если письмо не очень хорошо, пожалуйста, позаботьтесь обо мне. Мне посчастливилось получить ByteDance некоторое время назад. Я все еще очень рад приглашению на интервью. Это все та же фраза. Фонд - это самое важное. Хотя я уже положил трубку с обеих сторон, я все же хочу поделиться некоторыми интересными темами о фонде. ~

тема

Первый этап собеседований прошел относительно легко. Интервьюер сказал, что в начале все было относительно просто и элементарно. Это заставило меня расслабиться. Было очень приятно. Большинство собеседований в начале должно быть о технологиях (если чат не очень хорош) , считается, что я не могу попасть на следующую прямую трансляцию, чтобы написать код), а затем после ByteDance, это прямая трансляция Niuke.com для написания кода, я увидел, что интервьюер написал такие 2 строки код не спеша

let a = new Foo() //a.id -> 1
let b = new Foo() //b.id -> 2

процесс решения

Используйте глобальные переменные

Как милая новая я, увидев это, это так просто, просто запиши это~

let idIndex = 1;
function Foo () {
  this.id = idIndex++;
}
let a = new Foo();
console.log(a);
let b = new Foo();
console.log(b);

Очевидно, эффект был достигнут, а Мэнсиню это тоже очень легко понять.Каждый раз, когда создается экземпляр объекта, добавляются глобальные атрибуты, что полностью соответствует требованиям интервьюера.Интервьюер неторопливо сказал, гм, да, но может не использовать глобальные переменные. . .

Использовать статические свойства

Что в этом сложного, Са! Просто измените глобальный на статический.

function Foo () {
  this.id = Foo.idIndex++;
}
Foo.idIndex = 1
let a = new Foo();
console.log(a);
let b = new Foo();
console.log(b);

Интервьюер нахмурился. Этот ребенок еще не написал тот код, который мне нужен. «Мм, могу ли я добиться этого эффекта без использования глобальных и статических свойств?» Пока я могу только думать об этом. «Тогда используйте закрытие?», интервьюер сказал, что вы можете показать это

Используя замыкание

Это по-прежнему очень просто для Мэн Синя, а код записи Лао-цзы — шаттл.

const Foo = (function(){
  let idIndex = 1;
  return function(){
    this.id = idIndex++;
  }
})()
let a = new Foo();
console.log(a);
let b = new Foo();
console.log(b);

Сделав несколько штрихов, я закончил писать, и интервьюер кивнул: Что ж, похоже, я вполне доволен своим стилем письма.

let a = Foo() //a.id -> 1
let b = new Foo() //b.id -> 2
let c = new Foo() //c.id -> 3
let d = Foo() //d.id -> 4

Используйте экземпляр для сохранения поля

Разумный сначала застрял у меня на некоторое время, в основном для решения этой проблемы, но интервьюер все же был очень дружелюбен с подсказкой, как судить, вызывается ли метод напрямую или с помощью нового вызова, вы его использовали? instanceof, ха-ха, к счастью, я написал код в мгновение ока, и, конечно, есть такой кусок кода для отладки.

const Foo = (function(){
  let idIndex = 1;
  return function(){
    // this.id = idIndex++;
    console.log(this instanceof Foo)
  }
})()
let a = new Foo();
// console.log(a);
let b = Foo();
// console.log(b);
let c = Foo();
// console.log(c);
let d = new Foo();
// console.log(d);

Приведенный выше код очевиден, напечатанный результатtrue,false,false,true, потому что первый и последний используют новые, которые принадлежат экземпляру Foo, а затем выносят суждения на основе этого.Прежде всего, вам действительно нужно иметь определенное понимание нового, новое изменит это, чтобы указать на экземпляр один. Экземпляр, и вернет экземпляр после выполнения последнего метода. Если вы не используете новый для прямого вызова функции, функция возвращает undefined по умолчанию без возвращаемого значения. Вы можете решить эту проблему, если знаете это.

const Foo = (function(){
  let idIndex = 1;
  return function(){
    // console.log(this instanceof Foo)
    if (this instanceof Foo) {
      // 使用了new 会自动返回对象~
      this.id = idIndex++;
    } else {
      // 没有使用new,我们帮它返回~
      return {
        id: idIndex++
      }
    }
  }
})()
let a = new Foo();
console.log(a); // {id: 1}
let b = Foo();
console.log(b); // {id: 2}
let c = Foo();
console.log(c); // {id: 3}
let d = new Foo();
console.log(d); // {id: 4}

Это завершает первый письменный тестовый вопрос~

Суммировать

В общем, первый вопрос относительно легкий и приятный, а более поздние вопросы я поделюсь постепенно.На самом деле, большинство вопросов с одной стороны относительно базовые.Сложнее всего может быть дать вам написать промис от руки и реализовать Обещание.Некоторые из статических методов с одной стороны, интервьюер с одной стороны меня вполне устроил, так он еще и повысил свою уверенность в себе, а потом его ругали вторым туром интервью.Некоторое знание, Я надеюсь расти вместе со всеми.Если есть какая-то ошибка, я надеюсь, что большой парень слегка распылит ее и направит вас вперед~ Спасибо за вашу поддержку~