Отчет о предварительном интервью в мае | Шанхай
create by db on 2020-5-14 22:37:37
Recently revised in 2020-6-8 22:29:17
предисловие
Хоулан, ты установил киоск?
С июня по июнь влияние новой короны постепенно уменьшалось.
Хотя в этом году суждено стать мировой экономической зимой, прилавки еще предстоит установить, а также необходимо пройти собеседование.
Позвольте мне сначала рассказать о моей ситуации: Координация в Шанхае, трое не-бакалавров (без двойного первого класса, не специализирующихся на компьютерах), старый новичок в области фронтенда, работающий в небольшой компании, технологический стек Vue + ElementUI. Изначально планировал сменить место работы через год, но эпидемия вынудила его к середине года. К собеседованиям я начала готовиться 1 мая, основным каналом доставки был Boss, спустя почти месяц я прошла собеседование в семи компаниях (не считая телефонных) и получила три предложения. Я дам вам отчет об интервью здесь, который также является кратким изложением моего собственного выступления.
текст
Сначала напишите свой опыт интервью и вопросы интервью, а затем некоторые из ваших собственных ответов. Пожалуйста, проверьте по требованию.
Компания А
ситуация в компании:
Дачанг
Можно только сказать, что я посмелее - наткнулся на голову нового БАТ в начале. Это рекомендует хедхантер. Я сделал некоторые приготовления, но, конечно же, он все еще был посажен. С одной стороны видео-интервью. Интервьюер очень приятный. Он задаст несколько вопросов, основываясь на своем резюме. У него больше базовых знаний и ему нужно писать код! Код вручную! Код вручную!
проблема:
-
Реализация и преимущества и недостатки трехколоночной верстки
-
Текстовый однострочный/трехстрочный дисплей
-
Перерисовка и перекомпоновка
-
Рукописная последовательность Фибоначчи и ее оптимизация
-
Глядя на вывод кода, что такое макрозадачи и микрозадачи и что они включают?
-
Напишите функцию глубокого клонирования javascript deepClone
-
Два режима маршрутизации Vue, представляющие их принципы, преимущества и недостатки
-
Написать функцию привязки событий js
const Event = {
on() {} // 绑定
off() {} // 解绑
trigger() {} // 触发事件
};
- рукописная функция дедупликации
const arr = [1, '1', '1', 'NaN',NaN,'NaN', {a: 1}, '{a: 1}', {a: 1}]
- Алгоритм миксина/пользовательской директивы/v-if/diff в Vue
результат:
Пока
награда:
Из-за отсутствия подготовки (про свою посуду не говорю), и некоторых знаний, к которым серьезно не готовился, я заикался и отвечал на большинство вопросов, а глубокого понимания асинхронности у меня не было /mixin/diff К счастью, интервьюер оказался очень милым, поможет вам шаг за шагом подумать, но все равно зависает.
Усвоенный урок таков: вы не можете быть просто программистом (инженером CV?), вы должны знать причину, фундамент очень важен, понимание очень важно, и самое главное — уметь ясно выражать то, что вы делаете. хочу сказать.
Компания Б
ситуация в компании:
Бизнес-отделу аутсорсинговой компании, занимающемуся собственными проектами, требуется реализация front-end и back-end среднего и высокого уровня (самого front-end нет)
одна сторона:
Поскольку в этом отделе нет фронтенда, они позаимствовали фронтенд-лидера (предположительно старшего) из других отделов в качестве интервьюера. Может быть, из-за того, что они мало знают о своих проектах, они сосредотачиваются на основах.
проблема:
-
HTML-семантика
-
Новые возможности CSS3
-
Перерисовка и перекомпоновка
-
Замыкания и их приложения
-
Новые функции ES6, вопросы о let, promise, class и т. д.
-
Кратко опишите элементы конфигурации webpack
-
Алгоритмы сортировки, которые вы знаете, и как их реализовать
-
Несколько способов передачи параметров в компоненты Vue
...и множество API для js-объектов
Вторая сторона:
После того, как одна сторона будет закончена, мы перейдем непосредственно ко второй стороне, интервьюер на второй стороне является архитектором этого отдела (очень хорошо), и мы в основном говорим о проектах и некоторых решениях проблем.
-
Зачем прыгать с корабля
-
Основываясь на требованиях проекта, как исследовать потребности, выбрать подходящую структуру и схему и подробно описать процесс.
-
Зачем нужно сдавать экзамен PMP по технологиям
-
Какая самая сложная проблема на работе?
-
Вы привели команду
-
планирование будущей карьеры
HR сторона:
Потом я пошла к HR, HR — милая дама (в маске, и я не могу видеть свое лицо)
-
Когда я могу получить работу
-
Ожидаемая зарплата
... слюни
результат:
Предложение поступило, но зарплата не соответствовала ожиданиям, поэтому я отказался
награда:
Очень полезный опыт собеседования, который расширил мои знания и придал мне определенную уверенность. В конце концов, собеседование — это процесс двустороннего отбора, а еще это хороший опыт, чтобы познакомиться с людьми, которым стоит поучиться, и подумать над некоторыми вопросами, о которых вы никогда не задумывались.
Компания С
ситуация в компании:
Небольшая компания, занимающаяся собственным проектом, имеет два фронтенда (оба молодые), предполагается, что будет набран фронтенд лидер, но JD не написал
интервью:
"В компании более дюжины человек. Это приглашение на собеседование, отправленное генеральным директором боссу. Это довольно близко к тому месту, где я живу, поэтому я все еще очень заинтересован. Но я не знаю, то ли лидер отсутствует, то ли по другим причинам, поэтому я отправил двоих детей интервьюерами.
Это интервью было не очень хорошим. Два интервьюера, вероятно, были неопытны и не готовы задавать вопросы. Некоторые из задаваемых слов неясны, а некоторые вопросы на работе используются для того, чтобы задавать вопросы...
результат:
Может быть, они не особо довольны друг другом, не более
награда:
Очень плохой опыт собеседования.
Компания Д
ситуация в компании:
Компания среднего размера, занимающаяся государственными проектами
одна сторона:
Это также не был особенно приятным опытом интервью.
Собеседование было назначено на два часа дня, поэтому я пришел на десять минут раньше. Однако там 1 фронтенд, 3 теста и 6 бэкендов из одного блока (много давления) — их HR так кто-то забронировал одновременно? ! Затем на стойке регистрации попросили всех выстроиться в очередь, чтобы получить форму личной информации, и распечатать вопросы интервью на месте ... Прошло 20 минут работы, а затем полчаса, чтобы ответить на вопросы, а затем ждать интервью. . .
Меня уведомили, что у меня может быть собеседование почти до четырех часов — все пришли, давайте встречаться — выходите на собеседование и будьте в хорошем настроении. Затем последовала самая раздражающая операция, HR отвел меня в небольшой кабинет, в котором был всего один компьютер——Интервьюер проводит удаленное собеседование. В то время в моем сердце пробежало 10 000 травяных и грязевых лошадей... Но все они пришли...
проблема:
-
Представьтесь
-
Процесс входа пользователя в систему и определение полномочий, хранение информации о пользователе
-
Прыжок маршрута, как обновить страницу
-
Расскажите об обычном рабочем содержании и процессе
-
Расскажите о личном опыте работы
-
Отправлен вопрос закрытия, чтобы увидеть результат
-
Будет ли это Реакт
-
Что ты хочешь спросить меня
Сообщите HR первым делом после личной встречи - если есть два лица и вам нужно быть удаленным, пожалуйста, позвоните заранее (я так вежлив (⊙o⊙)…)
Вторая сторона:
Вторая сторона — видеоинтервью дома после работы ночью (групповой чат WeChat)
В 8 часов интервьюер опоздал на десять минут. HR сказал мне, что это собеседование с боссом, я думал, что буду говорить о проекте,похвастаться БГоворя об идеалах (в принципе, я не спрашивал многого), я встретил очень приземленного босса.
проблема:
-
Разговор о типе и различии модели коробки
-
div с центрированием по вертикали
-
Как написать перетаскиваемый div и как перетаскивать его на другие узлы
-
Жизненный цикл Vue
-
Защита маршрута Vue
-
Параметры передачи компонента Vue
-
Рисуем на месте трехрядную трехколоночную адаптивную верстку
результат:
Получил предложение, но отказался из-за восприятия компании и удаленности от работы
награда:
Очень странный опыт собеседования, многолетний опыт.
Компания Э
ситуация в компании:
Средние и крупные компании (слышали название), занимаются внутренними проектами, JD требуется старший
интервью:
Очень комфортное интервью (возможно я мазохист).
HR — красивый парень (много и красивых HR — редкость), в компании много людей, и немного шумно. Интервью проводилось прямо у небольшой стойки регистрации у входа. Интервьюер на самом деле молодец, очень сильный, и вопросы очень подробные, от поверхностных до глубоких — в основном все фронтенд-знания разобраны.
проблема:
-
HTML-семантика
-
Используются некоторые теги HTML5
- Роль и разница между импортом и импортом
-
Классификация и различие блочных моделей
-
Абсолютное и относительное позиционирование
-
Определение BFC/действие/условие срабатывания
-
отображать свойства
-
приоритет селектора
-
Макет с тремя колонками
-
Синтаксис ES6: обещание/стрелочная функция/класс
-
Использование и объем замыкания
-
Цепочка прототипов, методы реализации наследования
-
Асинхронность и ее решения, макрозадачи и микрозадачи и их процессы
-
перекрестный домен
-
Реализовать глубокое копирование
-
выполнять обещания
-
Разница между GET и POST кода http/status
-
GET и POST http
-
Жизненный цикл Vue/связь компонентов/реактивная реализация/шаблон маршрутизации/защита маршрутизации
-
Упакованный принцип webpack, часто используемый загрузчик и плагин, а также некоторая общая конфигурация
-
Асинхронные операции в node.js
-
Знание ТайпСкрипта
-
Внедрение интерфейсных микросервисов
-
Вы привели команду
-
В чем ты лучше всего
前面回答基本没问题,但到后面webpack、node、微服务那一块,就有些捉襟见肘了。不过面试官很有耐心,每个回答都是记录,不清楚的也很耐心的解释。经过沟通发现,他这几天面了很多人了。 . .
Один интервьюер дал мне хорошую оценку (возможно, бонус от односельчан), но мне, к сожалению, сообщили, что второй интервьюер не успел. . .
результат:
Пока
награда:
Очень полезное интервью, интервьюер дал много руководящих мнений и предложений,старшийС более личным пониманием, но также очистить направление дальнейшего изучения.
Компания Ф.
ситуация в компании:
Малые и средние культурно-творческие компании
интервью:
Интервьюер:Вы принимаете 996?
я: Каков бюджет найма вашей компании?
результат:
Это самое короткое интервью, которое у меня когда-либо было.
награда:
Спасибо интервьюеру за его прямолинейный подход, позволяющий избежать траты времени.
Люди могут соглашаться на сверхурочную работу, а если они заняты проектами, они также могут добровольно работать сверхурочно, но я действительно не хочу идти в отделение интенсивной терапии.
Компания G (последняя запись)
ситуация в компании:
Стартапы
Телефонное интервью:
Интервьюер должен был следить за моим блогом, сначала он спросил какие-то базовые знания, а потом спросил о проекте. Проблемы не перечислены одна за другой, и большинство из них повторяются с предыдущими, ведь, хотя фронтальные знания относительно сложны, основные точки знаний все же могут уловить контекст.
одна сторона:
На сцене не было слишком много вопросов.Дама была очень спокойной и не задавала слишком много вопросов о технологиях, потому что мы разговаривали по телефону раньше, и мы в основном говорили о том, как войти в отрасль, о проблемах с которыми вы сталкиваетесь в повседневной работе, и решения: что вы делаете после работы, ваш личный план развития, каково это вести блог, что вы изучаете в последнее время, ваше отношение к сверхурочной работе... и т. д.
Вторая сторона:
С другой стороны, он должен быть техническим директором.Основной вопрос касается обычной учебы (я сказал об этом в своем вступлении), каких-то обычных путей обучения, личных планов развития и ожиданий.
Три стороны:
Три стороны - генеральный директор и HR компании.Основные вопросы - о проекте, модулях, за которые отвечает человек, выборе некоторых проектов, процессе запуска некоторых проектов, решении проблем на месте. , и почему вы хотите сменить работу. , ожидания от компании и некоторые сведения о компании.
результат:
Оферту получил на следующий день, очень нравится атмосфера в компании, все доброжелательные. С нетерпением жду приема на работу.
награда:
Нанимаемая компания также ищет фронтенда, который может работать. Я надеюсь сначала хорошо выполнить свою работу, связаться с другими предприятиями (похожие на мультитерминал, небольшие программы, приложения и т. д.), накопить осадки, улучшить технологии, ознакомиться с бизнесом, углубиться в отрасль и стремиться быть слэш молодежи.
Суммировать
Выше приведены некоторые резюме процесса интервью. Некоторые из них подробно и сокращенно. Некоторые интервью должны быть записаны мной для ознакомления, а некоторые неудобно или забыли записать. Извините, ха.
После этих интервью я чувствую, что давление занятости в этом году на самом деле довольно велико. Конечно, золото всегда блестит, и талантам не нужно беспокоиться о поиске работы где угодно - так что давайте, маленькие друзья - не стесняйтесь, отпустите!
Нынешний уровень физических лиц примерно средний +.В Шанхае зарплата крупных заводов будет относительно выше, но и требования к основам и алгоритмам тоже выше, для небольших компаний требования к алгоритмам не высокие, а браузерные принципы и JS и ES составляют большую часть, за ними следует фреймворк, и лучше всего иметь некоторый опыт упаковки проектов.
Я написал этот блог, в основном самводный блогСделайте подведение итогов, если это может помочь всем, это лучше всего.
предположение
Напоследок несколько предложений для друзей:
-
Обычное накопление очень важно: Мы можем записать некоторые проблемы, возникшие в работе, и пути их решения, а также уделить время подведению итогов. Лучше всего найти платформу для ведения блога, Nuggets, GitHub, blog garden, CSDN — все это хорошо, хорошая память не так хороша, как плохое письмо, писать самому гораздо лучше, чем читать снова. Онлайн-блог нелегко проверить самостоятельно, и если вы столкнетесь с точкой знаний, которую вы не можете четко вспомнить в интервью, вы все равно можете поговорить об этом - я резюмировал ее в своем блоге.
-
Не копайте дыры для своего резюме: Пишите все, что можете, и вы можете писать все, что хотите. Обычные интервьюеры будут задавать вопросы на основе своего резюме, поэтому не указывайте в резюме термины, которые вы не понимаете — проверьте их и запомните, если вы их не понимаете. Иначе было бы очень неловко задавать три вопроса.
-
Подготовьтесь перед собеседованием: Собеседование — это экзамен, и мы должны пересмотреть к экзамену. Система знаний фронтенда по-прежнему очень понятна — страницы, стили, JS, фреймворки, упаковка проекта и построение, сначала освойте то, в чем вы хороши, а потом устраняйте белые пятна.
-
Не лезь в яму дважды: Обсудите с интервьюером, чтобы понять текущую ситуацию с трудоустройством. Поймите и смиритесь со своими недостатками, если вы не сможете ответить на какие-то вопросы в этом интервью, не беда, вернитесь, чтобы проверить информацию, посмотрите видео, сделайте обзор, обязательно запомните его, и вы может сделать это хорошо в следующий раз. Если вы боитесь забыть, вы можете записать это.
-
Не будь голым! Не будь голым! Не будь голым!: Я три раза сказал важные вещи.Если у вас есть ипотека или автокредит, будет очень тяжело бросить работу и найти работу - у вас есть еда в руках, и вы не паникуете. Конечно, местные тираны на свободе...
-
Старайтесь не растягивать временную шкалу слишком долго: Трудно найти работу, пока идешь на работу, если хочешь отпроситься, то после работы нужно готовиться к собеседованию. Так что надо много работать и стараться, чтобы за полмесяца было еще несколько предложений, если сроки слишком большие, то можно и расслабится (я просто долго тянул). Постарайтесь быть избирательным, найдите компанию, которая подходит (зарплата, способности, поездки и т. д.) для собеседования, и никогда не ходите туда, когда получите приглашение на собеседование, иначе вы просто потратите свое время.
-
Правильное отношение, продолжайте учиться: Технологии меняются с каждым днем, а фреймворки появляются один за другим. Теперь, когда вы выбрали эту отрасль, вы должны исправить свой менталитет, усердно учиться, улучшать свои технологии, знакомиться с бизнесом и углубляться в отрасль.
приложение
Справочная документация
Отчет о промежуточном интервью за май | Otaku King - Nuggets
1. Реализация и преимущества и недостатки трехколоночной верстки
План размещения | выполнить | преимущество | недостаток |
---|---|---|---|
Плавающая компоновка | Есть три столбца слева и справа, левый столбец перемещается влево, правый столбец перемещается вправо, а средний столбец устанавливает левое и правое поля. | Проще и совместимее | Плавающие элементы отделены от потока документов, и вам нужно только обратить внимание на очистку флота при их использовании. |
ПозицияМакет | Левый, средний и правый три столбца (без порядка), напрямую задайте положение каждого дочернего элемента в соответствии с атрибутом позиционирования. | Быстрая и простая настройка | Элементы отделены от потока документов, а дочерние элементы также отделены от потока документов.Когда высота неизвестна, будут проблемы, а валидность и удобство использования относительно плохие. |
Макет таблицы | Левый, средний и правый три столбца, отображение родительского элемента: таблица, отображение дочернего элемента: таблица-ячейка, дочерний элемент по центру без ширины | Простота в использовании, никаких проблем с совместимостью | ①Невозможно установить поля столбца; ②Это не подходит для SEO; ③Когда высота одной из ячеек превышает высоту, ячейки с обеих сторон также становятся выше вместе |
Гибкая компоновка | Левый, средний и правый три столбца, отображение родительского элемента: flex, установка ширины с обеих сторон, центральный дочерний элемент flex: 1; | более совершенный | Существует проблема совместимости с IE, и он может поддерживать только IE9 и выше. |
Макет сетки | Три столбца слева, посередине и справа, отображение родительского элемента: сетка; реализовано с помощью сетки | Самый мощный и простой | Совместимость плохая, поддерживается в IE10+, поддерживаются только некоторые свойства. |
2. Текстовый однострочный/трехстрочный дисплей
Одна строка текста, скрытая переполнением, становится...
p {
/* 隐藏元素溢出内容 */
overflow: hidden;
/* 单行显示 */
white-space: nowrap;
/* 溢出显示省略号 */
text-overflow: ellipsis;
}
Скрытие переполнения многострочного текста становится...
p {
overflow: hidden;
/* 将对象作为弹性伸缩盒子模型显示 。 */
display: -webkit-box;
/* 限制在一个块元素显示的文本的行数,即行数设置 */
-webkit-line-clamp: 3;
/* 规定框从上向下垂直排列子元素 */
-webkit-box-orient: vertical;
}
3. Перерисовка и перекомпоновка
переплавка: когда часть (или все) дерева рендеринга необходимо перестроить из-за изменений размера, макета, скрытия и т. д. элементов. Это называется reflow (на самом деле я думаю, что проще и понятнее будет называть это re-layout). Каждой странице требуется как минимум одна перекомпоновка, то есть при первой загрузке страницы.
перерисовать: когда некоторым элементам в дереве рендеринга необходимо обновить свойства, эти свойства влияют только на внешний вид и стиль элемента, но не на макет, например цвет фона. Это называется перекраска.
разница
- Оплавление неизбежно вызовет перерисовку, а перерисовка не обязательно приведет к оплавлению. Например: только при изменении цвета будет происходить только перерисовка, не вызывая оплавления
- Перекомпоновка требуется при изменении макета страницы и свойств геометрии.
Например: добавление или удаление видимых элементов DOM, изменение положения элемента, изменение размера элемента — поля, отступы, границы, ширина и высота, изменение содержимого.
-
Перекомпоновка часто сопровождается изменениями макета, которые обходятся дорого:
-
Перерисовка — это просто изменение стиля, а не структуры:
4. Рукописная последовательность Фибоначчи и ее оптимизация
Что такое последовательность Фибоначчи: Последовательность Фибоначчи, также известная как последовательность золотого сечения, была введена математиком Леонардодой Фибоначчи на примере кролиководства, поэтому ее также называют «кроличьей последовательностью». Относится к такой последовательности: 1, 1, 2, 3 , 5, 8, 13, 21, 34, ... В математике последовательность Фибоначчи определяется рекурсивно следующим образом: F(0)=1, F(1)=1, F(n)=F(n-1 )+F(n-2) (n>2, n∈N*), эта последовательность начинается с третьего элемента, каждый элемент равен сумме двух предыдущих
function Fibonacci (n) {
if ( n <= 1 ) {return 1};
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
Этот метод наименее кодовый и простой для понимания, но при большом n быстро происходит переполнение стека, причина в том, что слишком много "вызывных фреймов" и браузер приостанавливает анимацию. Подробнее см.Оптимизация хвостового вызова расширения функции - Руан Ифэн.
- Рекурсия (оптимизированная версия)
function Fibonacci2 (n , ac1 = 1 , ac2 = 1) {
if( n <= 1 ) {return ac2};
return Fibonacci2 (n - 1, ac2, ac1 + ac2);
}
Этот метод написан после оптимизации хвостового вызова функции (параметр по умолчанию поддерживается ES6 и более поздними версиями, а ES5 должен использовать обычный метод записи значения по умолчанию) Он немного сложен для понимания, но он не вызовет переполнения стека. рекомендуется использовать его.
- версия нормального цикла
function Fibonacci3(n) {
if (n===1 || n===2) {
return 1;
}
var n1 = 1, n2 = 1, sum;
for (let i = 2; i < n; i++) {
sum = n1 + n2
n1 = n2
n2 = sum
}
return sum
}
Лучше всего понятен циклический вариант, то есть дать начальное значение, а затем продолжить накапливать
- Разрушающая версия присвоения
var Fibonacci4 = function (n) {
if (n===1 || n===2) {
return 1;
}
let n1 = 1; n2 = 1;
for (let i = 2; i < n; i++) {
[n1, n2] = [n2, n1 + n2]
}
return n2
}
Лучше всего понятен циклический вариант, то есть отдавать начальное значение, а затем продолжать накапливать (используя деструктурирующее присваивание, код получается более лаконичным).
5. Проверьте вывод кода, что такое макрозадачи и микрозадачи и что они включают?
setTimeout(function() {
console.log(1)
}, 0);
new Promise(function executor(resolve) {
console.log(2);
for( var i=0 ; i<10000 ; i++ ) {
i == 9999 && resolve();
}
console.log(3);
}).then(function() {
console.log(4);
});
console.log(5);
вывод:
2
3
5
4
1
задача макроса
# | браузер | Node |
---|---|---|
setTimeout | √ | √ |
setInterval | √ | √ |
setImmediate | x | √ |
requestAnimationFrame | √ | x |
микрозадачи
# | браузер | Node |
---|---|---|
process.nextTick | x | √ |
MutationObserver | √ | x |
Promise.then catchfinally Async/Await | √ | √ |
исполнительный механизм:
- Сначала выполнить основной поток
- При обнаружении очереди макросов (макрозадачи) поместите ее в очередь макросов (макрозадачу)
- При встрече с микроочередью (микрозадачей) поместите ее в микроочередь (микрозадачу)
- Основная ветка завершена
- Выполнить микроочередь (микрозадачу), выполняется микроочередь (микрозадача)
- Выполнить задачу в очереди макросов (макросаска) один раз и завершить выполнение
- Выполнить микроочередь (микрозадачу), выполнение завершено
- цикл по очереди. . .
6. Напишите функцию глубокого клонирования javascript deepClone
// 深拷贝
/**
* 深拷贝对象,可以正确序列化日期
* @param {*} obj
*/
export const DEEP_CLONE = function (obj) {
let objClone = Array.isArray(obj) ? [] : {}
if (obj && typeof obj === 'object') {
for (let key in obj) {
if (obj.hasOwnProperty(key)) {
// 判断ojb子元素是否为对象,如果是,递归复制
if (obj[key] && typeof obj[key] === 'object') {
// 深拷贝日期类型
if (obj[key] instanceof Date) {
objClone[key] = new Date(obj[key].valueOf())
// console.log('deepClone', objClone[key])
} else {
objClone[key] = DEEP_CLONE(obj[key])
}
} else {
// 如果不是,简单复制
objClone[key] = obj[key]
}
}
}
}
return objClone
}
7. Два режима маршрутизации Vue
hash
принцип
- Реализация ранней внешней маршрутизации основана на location.hash, а значение location.hash — это содержимое после # в URL-адресе.
Принцип реализации заключается в отслеживании содержимого позади #, чтобы инициировать Ajax-запрос на частичное обновление без обновления всей страницы.
- Используйте событие hashchange для отслеживания изменений URL-адреса. Следующие изменения URL-адреса вызовут событие hashchange: браузер меняет URL-адрес вперед и назад, тег a меняет URL-адрес, а window.location меняет URL-адрес.
преимущество
Совместимость с браузерами более ранних версий, Angular1.x и Vue по умолчанию используют хеш-маршрутизацию.
Только содержимое до символа # будет включено в запрос и отправлено на серверную часть, то есть, даже если серверная часть не полностью покрывает маршрут, она не вернет ошибку 404. Изменение хэш-значения добавит запись в историю доступа браузера, поэтому вы можете управлять переключением хэша с помощью кнопок браузера «назад» и «вперед». Переопределяет функциональность закрепленных за якорем элементов
недостаток
Это не очень красиво.Если данные, передаваемые потом, будут сложными, то будут проблемы.
history
принцип
- history предоставляет два метода pushState и replaceState для записи состояния маршрутизации. Эти два метода изменяют URL-адрес, не вызывая обновления страницы.
- history предоставляет событие popstate, аналогичное событию hashchange, но событие popstate немного отличается: событие popstate запускается, когда URL-адрес изменяется в браузере вперед и назад, а событие popstate не запускается при изменении URL-адреса через pushState. /replaceState или тег. К счастью, мы можем перехватить вызов pushState/replaceState и событие щелчка тега a для обнаружения изменений URL-адреса, поэтому мониторинг изменений URL-адреса может быть достигнут, но это не так удобно, как hashchange.
- И pushState(state, title, url), и replaceState(state, title, url) могут принимать одни и те же три параметра.
преимущество
Простой в использовании, более красивый
Новый URL-адрес, заданный функцией pushState(), может быть любым URL-адресом того же происхождения, что и текущий URL-адрес, а хэш может изменить содержимое только после #, поэтому можно установить только URL-адрес того же документа, что и текущий URL-адрес.
Когда URL-адрес, установленный функцией pushState(), точно совпадает с текущим URL-адресом, он также будет добавлен в стек истории, а содержимое после hash# должно быть изменено, чтобы добавить его в новый стек.
pushState() может добавлять в запись данные любого типа через параметр stateObject, тогда как hash может добавлять только короткие строки pushState() может дополнительно установить атрибут title для последующего использования
недостаток
URL-адрес внешнего интерфейса должен совпадать с URL-адресом серверной части, отправляющей запрос, иначе будет сообщено об ошибке 404.
Из-за History API браузеры более ранних версий имеют проблемы с совместимостью.
Два разных сценария использования
- Как видно из вышеприведенного, URL-адрес будет иметь # в режиме хеширования.Если вы хотите, чтобы URL-адрес был более элегантным, вы можете использовать режим истории.
- При использовании режима истории вам нужно обратить внимание на добавление ресурса-кандидата, который охватывает все ситуации на стороне сервера: если URL-адрес не соответствует ни одному из статических ресурсов, вы должны вернуть ту же страницу index.html, которая является вашей страницей. приложение зависит от.
- Когда вам нужна совместимость с браузерами более ранних версий, рекомендуется использовать хеш-режим.
- Когда вам нужно добавить в запись данные любого типа, вы можете использовать режим истории.
8. Напишите функцию привязки событий js
const Event = {
on() {} // 绑定
off() {} // 解绑
trigger() {} // 触发事件
};
class Event {
constructor() {
// 为了查找迅速使用了对象
this._cache = {};
}
// 绑定事件
on(eventName, callback) {
/* 为了查找方便和节省空间, 把同一类型事件放到数组中
* 因为数组是有序的, 逻辑上是队列, 先绑定先触发
* */
// 如果有就放入, 没有就新建, 然后再看下是否有放入函数,没有就加入
let fns = (this._cache[eventName] = this._cache[eventName] || []);
// 如果事件方法没有的话就放入到字典进去
if (fns.indexOf(callback === -1)) {
fns.push(callback);
}
return this;
}
// 触发事件
trigger(eventName, data) {
// 看下字典里有没有这个函数名字, 有的话就触发它
let fns = this._cache[eventName];
if (Array.isArray(fns)) {
// 有的话就对立面的每一个function传入参数data
fns.forEach(fn => {
fn(data);
});
}
return this;
}
/*解绑, 看下字典里如果有这个事件名字就去
* 看下要删除什么
* */
off(eventName, callback) {
let fns = this._cache[eventName];
if (Array.isArray(fns)) {
if (callback) {
let index = fns.indexOf(callback);
if (index !== -1) {
fns.splice(index, 1);
}
} else {
// 全部清空
fns.length = 0;
}
}
return this;
}
}
const event = new Event();
event.on("test", a => {
console.log(a);
});
event.trigger("thet", "hello world"); // 绑定后就输出
event.off("test");
event.trigger("test", "hello world"); // 解绑后就不显示了
9. Функция рукописной дедупликации
const arr = [1, '1', '1', 'NaN',NaN,'NaN', {a: 1}, '{a: 1}', {a: 1}]
// 利用for嵌套for,然后splice去重(ES5中最常用)
function unique2(arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = i + 1; j < arr.length; j++) {
if (arr[i] == arr[j]) { //第一个等同于第二个,splice方法删除第二个
arr.splice(j, 1);
j--;
}
}
}
return arr;
}
// 利用hasOwnProperty
function unique7(arr) {
var obj = {};
return arr.filter(function (item, index, arr) {
return obj.hasOwnProperty(typeof item + item) ? false : (obj[typeof item + item] = true)
})
}
// 利用filter
function unique4(arr) {
return arr.filter(function (item, index, arr) {
//当前元素,在原始数组中的第一个索引==当前索引值,否则返回当前元素
return arr.indexOf(item, 0) === index;
});
}
10. mixin/пользовательские директивы/v-if/v-ssd/diff алгоритм
11 Рукописный аякс
// 手写ajax
function get(){
var req = new XMLHTTPRequest();
if(req){
req.open("GET", "http://test.com/?keywords=手机", true);
req.onreadystatechange = function(){
if(req.readyState == 4){
if(req.status == 200){
alert("success");
}else{
alert("error");
}
}
}
req.send();
}
}
12 Функция привязки событий + делегирование событий
function delegate(element, eeventType, selector, fn) {
element.addEventListener(eventType, e => {
let el = e.target
})
}
13 Экземпляр обещания
// Promise
function fn(){
var promise = new Promise(function(resolve,reject){
// ... some code
if(/*异步操作成功*/) {
resolve(value) // 成功调用resolve 往下传递参数 且只接受一个参数
}else {
reject(error) // 失败调用reject 往下传递参数 且只接受一个参数
}
});
return promise
}
fn.then(function (r) {
console.log('成功: ' + r);
}).catch(function (reason) {
console.log('失败: ' + reason);
});
// 全部成功调用
Promise.all([promise1,promise2]).then(sucess1,fail1)
// 有一个成功就调用
Promise.race([promise1,promise2]).then(sucess1,fail1)
14 Самостоятельное выполнение обещаний
class MyPromise{
constructor(executor) {
this.status = "pending"; // 初始化状态为pending
this.value = undefined; // 初始化返回的成功的结果或者失败的原因
// 这里是resolve方法,成功后执行,将状态改变为resolved,并且将结果返回
let resolve = result => {
if(this.status !== "pending") return; // 状态一旦改变,就不会再变
this.status = "resolved";
this.value = result;
}
// 这里是reject方法,异常时执行,状态改为rejected,并且将失败的原因返回
let reject = reason => {
if(this.status !== "pending") return;
this.status = "rejected";
this.value = reason;
}
// try、catch捕获异常,如果错误,执行reject方法
try {
executor(resolve, reject)
} catch(err) {
reject(err)
}
}
}
15 Принцип и использование VueX
16 Реализация маршрутизации разрешений Vue
Сводка реализации маршрутизации разрешений Vue
17 js для оценки объектов и массивов
18 Что именно делает new() в js?
- [Полностью понимаете, что делает new() в js?](https://www.jianshu.com/p/bf4cda6b515f)
19 Сорт
Передовой
20 Параметры маршрутизации Vue -------- разница между параметрами и запросом
Предыстория: проекту необходимо передавать значения по страницам, например идентификатор тестового вопроса.После обновления переданное значение исчезает, поэтому изучается разница между двумя следующими.
- params может использовать только имя для импорта маршрутов, запрос использует путь для импорта
- params похож на post, а query больше похож на передачу параметров get в нашем ajax.Проще говоря, первый не отображает параметры в адресной строке браузера, а второй отображает, так что передавать относительно безопасно значения через параметры.
- Использование значения похоже на это.маршрут.имя.запроса.
- Как только значение params обновляется, оно исчезает, а обновление значения запроса все еще существует.
this.$router.push({
path:"/detail",
params:{
name:'nameValue',
code:10011
}
});
this.$router.push({
path:'/xxx'
query:{
id:id
}
})
Резюме: этот метод можно использовать для небольшого количества параметров, если есть большой объем общедоступных данных, можно использовать Vuex или локальное хранилище.
Постскриптум: Привет друзья, если вы считаете, что статья неплохая, не забудьте поставить лайк или звездочку.Ваши лайки и звездочки - это мотивация для меня писать больше и насыщеннее статей!Адрес GitHub
Документ Соглашение
dbбиблиотека документацииЗависит отdbиспользоватьCreative Commons Attribution-NonCommercial-ShareAlike 4.0 Международная лицензияЛицензия.
на основеgithub.com/danygitgitСоздание работ выше.
Права на использование, отличные от разрешенных в настоящем Лицензионном соглашении, могут быть получены отCreative Commons.org/licenses/не…получено в.