написать впереди
Так как я все еще новичок во фронтенде, очень возможно сделать ошибки, и исправления приветствуются!
JavaScript
Что за язык JavaScript? Каковы характеристики?
Язык сценариев, работающий в движке браузера V8, может запускаться непосредственно интерпретатором без компиляции.Кроме того, переменные определены свободно и относятся к языку со слабой типизацией.
Назовите несколько основных спецификаций JavaScript?
- Не объявляйте несколько переменных в одной строке
- Замените == на ===
- Оператор switch должен иметь ветвь по умолчанию.
- Конструкторы пишутся с большой буквы, константы пишутся с большой буквы
- Используйте литералы объектов вместо новой функции(){}
принцип отрисовки страницы
- Браузер анализирует HTML для создания DOMTree.
- Затем синтаксический анализ CSS создаст CSSRuleTree
- После завершения синтаксического анализа механизм браузера создаст RenderingTree с помощью DOMTree и CSSRuleTree.
- вызов браузера
предварительно скомпилировано
- Сначала просканируйте ключевое слово var и поднимите наверх;
- Затем просмотрите определение функции, прежде чем упоминать var
- а затем выполнять последовательно
отложить и асинхронно
- существует
<script>Установка атрибута defer в элементе эквивалентна указанию браузеру на немедленную загрузку и отсрочку выполнения. После того, как страница будет проанализирована, она будет выполнена в указанном порядке. - Атрибут async сообщает браузеру о немедленной загрузке, как только загрузка начнется, и не может гарантировать их выполнение в указанном порядке.
тип данных
Что такое примитивные типы? Является ли null объектом?
Существует 6 примитивных типов: логический, строковый, числовой, нулевой, неопределенный и символьный.
null не является объектом, typeof null выводит объект, потому что предыдущая система 32 будет представлять объекты, начинающиеся с 000, но null представляет все нули, поэтому он ошибочно оценивается как объект
разница между примитивными типами и ссылочными типами
1. Примитивные типы хранят значения, а ссылочные типы хранят указатели. 2. Примитивные типы данных хранятся непосредственно в стеке, а ссылочные типы данных — в куче.
Какие типы можно получить с помощью typeof?
undefined,string,number,boolean,object,function
typeof может различать только примитивные типы, кроме null, а ссылочные типы могут различать только функции.
Что такое лифт? Что такое временная мертвая зона? Разница между var, let и const
- Подъем функции имеет приоритет над подъемом переменной.Поднятие функции переместит всю функцию в верхнюю часть области видимости, а подъем переменной перенесет только объявление в верхнюю часть области видимости.
- Var имеет продвижение и может использоваться перед объявлением, let, const нельзя использовать перед объявлением из-за временной мертвой зоны
- var объявление переменной в глобальной области видимости приведет к тому, что переменная будет смонтирована в окне, две другие не будут
- Функции let и const в основном одинаковы, но переменные, объявленные const, не могут быть повторно назначены.
- let и const не допускают дублирования объявлений
примитивный тип
Почему 0,1+0,2!=0,3? Как решить эту проблему?
В компьютерах числа хранятся в двоичной форме. Числа в JavaScript хранятся с использованием стандарта двойной точности IEEE 754. Из-за ограниченного объема памяти при наличии неразделенного десятичного числа берется приблизительное значение.
В 0,1+0,2 аппроксимируются 0,1 и 0,2, поэтому при сложении двух приблизительных значений конечный результат равен 0,3000, 0000, 0000, 0004, что недостаточно близко к 0,3 для JS, поэтому появляется 0,1. +0,2!= 0,3
Решение:parseFloat((0.1+0.2).toFixed(10)) === 0.3 // правда
Разница между нулем и неопределенным
undefined: указывает, что переменная объявлена, но ей не присвоено значение.
null: переменная определена и назначена, но она пуста, без каких-либо методов свойств и значений
Сценарии использования символов
Использовать как имя свойства
var mySymbol=Symbol();
var a={};
a[mySymbol]='hello'
оператор
Когда использовать === и когда использовать ==
== выполнит преобразование типов и затем сравнит, === не будет, попробуйте использовать ===.
Вы можете использовать == в следующих двух случаях
- Проверить, существует ли свойство объекта
var obj={}
if(obj.a == null){
// 相当于obj.a===null || obj.a===undefined
}
- Проверить, существует ли параметр функции
function fn(a, b){
if(b == null){
// 相当于b===null || b===undefined
}
}
В чем разница между Object.is() и ===,==?
Можно сказать, что Object.is() является обновленной версией, Object.is(NaN, NaN) вернет true, Object.is(-0,+0) вернет false
тип ссылки
Тип массива
Как определить, является ли переменная массивом?
1. Определить, существуют ли какие-либо методы массива
if(arr.splice){}
2.instanceof (некоторые версии IE неверны)
arr instanceof Array
3.Array.isArray()
4.Object.prototype.toString.call(arr); // '[object Array]'
5. метод конструктора
arr.constructor === Array
преобразовать массив в массив
let arrayLike = {
'0' : 'a',
'1' : 'b',
'2' : 'c',
length : 3
};
let arr1 = Array.prototype.slice.call(arrayLike);
let arr2 = [].slice.call(arrayLike);
let arr3 = Array.from(arrayLike);
метод массива
// 会改变原数组
pop() // 末尾删除
push() // 末尾新增
shift() // 开头删除
unshift() // 开头新增
reverse() // 数组反转
sort() // 排序
splice() // 修改数组(删除插入替换)
// 不会改变原数组
concat() // 合并数组
slice() // 选择数组的一部分
indexOf() // 顺序查找指定元素下标
lastIndexOf() // 倒序查找指定元素下标
// 迭代方法
// every()查询数组是否每一项都满足条件
// some()查询数组中是否有满足条件的项
// filter()过滤,返回true的项组成的数组
// map()对每一项运行给定函数,返回每次函数调用结果组成的数组
// forEach()对每一项运行给定函数,无返回值
var numbers = [1,2,3,4,5,4,3,2,1];
numbers.every(function(item,index,array){
return item>2;
}) // false
numbers.some(function(item,index,array){
return item>2;
}) // true
numbers.filter(function(item,index,array){
return item>2;
}) // [3,4,5,4,3]
numbers.map(function(item,index,array){
return item*2;
}) // [2,4,6,8,10,8,6,4,2]
numbers.forEach(function(item,index,array){
// 执行某些操作
}) // 无返回值
// 归并方法
// reduce()从第一项开始逐个遍历到最后
// reduceRight()从最后一项开始向前遍历到第一项
var values = [1,2,3,4,5];
values.reduce(function(prev,cur,index,array){
return prev+cur;
}) // 15
// reduceRight()结果一样,顺序相反
Какой алгоритм сортировки использует нативная сортировка?
Алгоритм сортировки, сочетающий сортировку вставками и быструю сортировку.
['1','2','3'].map(parseInt) является ответом?
[1,NaN,NaN]
Поскольку parentInt требует два параметра (val, radix), radix представляет систему синтаксического анализа, а map передает три (элемент, индекс, массив), что приводит к тому, что соответствующее основание системы счисления является недопустимым и вызывает ошибки синтаксического анализа.
Тип даты()
Получить дату в формате 2019-02-16
function formatDate(dt){
if(!dt){
dt=new Date()
}
var year = dt.getFullYear();
var month = dt.getMonth()+1;
var day = dt.getDate();
if(month<10){
month= '0'+month;
}
if(day<0){
day = '0'+day;
}
var formatDt = year+'-'+month+'-'+day
return formatDt;
}
некоторые другие методы
getHour() // 返回时
getMinutes() // 返回分
getSeconds() // 返回秒
getDay() // 返回星期天数
getTime() // 返回毫秒数
Тип функции
Объявления функций и выражения функций
Синтаксический анализатор сначала прочитает объявление функции, подняв его на передний план. Функциональное выражение будет ждать, пока код, в котором оно находится, не будет фактически интерпретирован и выполнен.
// 函数声明
function sum(a,b){
return a+b;
}
// 函数表达式
var sum = function(a,b){
return a+b;
}
Расскажите о понимании этого объекта
Это относится к объекту среды, выполняемому функцией, который всегда указывает на непосредственно вызывающую функцию, и значение может быть определено только во время выполнения.
указатель на это
1. Привязка по умолчанию, окно в браузере, глобальное в узле
2. Пример неявной привязки: window.a()
3. Явная привязка
- Жесткий обязательный вызов, применение, привязка
- контекст вызова API
filter, forEach и т. д. имеют необязательный параметр, который используется для этого значения при выполнении обратного вызова.
4.новая привязка
5. Стрелочные функции
Здесь не очень подробно, рекомендуется прочитатьСамая полная подробная история JavaScript -- 5 видов этого всестороннего анализа привязки
В чем разница между связыванием, вызовом и применением?
Та же точка
- используются для изменения указателя this функции
- Первый параметр - это значение этого для выполнения
- может использовать последующие параметры для передачи параметров
разница
- call и apply — прямые вызовы функций, bind возвращает функцию, которую нужно вызвать с помощью()
- Параметр вызова передается один за другим, привязка аналогична вызову, а вторым параметром применения является массив
Роль вызываемого и вызывающего абонента?
callee является атрибутом объекта arguments, а функция, указывающая на объект arguments, является текущей функцией. Рекурсия может использовать arguments.callee(). Область this в стрелочной функции такая же, как и вне функции, и нет объекта аргументов, поэтому стрелочная функция не имеет вызываемого.
function factorial(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1)
}
}
caller — это атрибут объекта функции, указывающий на функцию, которая вызывает текущую функцию.Например, если A вызывает B, то B.caller указывает на A(). Текущая функция вызывается в глобальной области видимости, а значение caller равно null.
Основной тип упаковки
Number
toFixed() возвращает строковое представление значения с указанными десятичными знаками.
var num=10; num.toFixed(2); // '10.00'
String
// charAt()根据字符位置返回所在位置的字符串
// charCodeAt()根据字符位置返回所在位置字符串的字符编码
var str = 'hello world';
str.charAt(1); // 'e'
str.charCodeAt(1); // '101'
// fromCharCode() 接收字符编码转为字符串
String.fromCharCode(104,101,108,108,111) //'hello'
// concat()将字符拼接起来得到新字符串
var str="hello"
str.concat(' world'); // "hello world"
// indexOf()和lastIndexOf() 返回字符位置
// trim() 删除空格
// toLowerCase() 转小写,toUpperCase() 转大写
// localeCompare() 根据字母表比较排序
Разница между фрагментом, подстрокой и подстрокой
Срез и подстрока получают начальную и конечную позиции, а подстрока получает начальную позицию и длину возвращаемой строки.
Для отрицательных чисел slice добавит отрицательное число к длине строки, substr добавит отрицательный первый параметр к длине строки, превратит второй параметр в 0, а substring превратит все отрицательные числа в 0.
Разница между split() и join()
join() помещает элементы массива в строку, split разбивает строку на массивы
var arr=[1,2,3];
var str=arr.join('|'); // '1|2|3'
str.split('|'); // [1,2,3]
Монолитные встроенные объекты
Глобальный объект
Метод кодирования URI
encodeURI и encodeURICcomponent encodeURI и decodeURICcomponent
Роль eval?
Функция состоит в том, чтобы разобрать строку из кода JS и выполнить ее. Чтобы избежать использования eval, небезопасно и очень дорого
Математический объект
- мин() и макс()
var max=Math.max(3,54,32,16); // 54
- метод округления
Math.ceil() // округлить Math.floor() // округлить в меньшую сторону Math.round() // округлить в большую сторону
- random()
Прототипы и цепочки прототипов
прототип
- Все ссылочные типы (массивы, объекты, функции) имеют __proto__неявный прототипсвойство, значение свойства является обычным объектом.
Кроме того, Object.prototype.__proto__ указывает на null
- Все функции имеют прототипявный прототипсвойство, значение свойства является обычным объектом.
Function.prototype.bind() не имеет свойства прототипа
- __proto__ всех ссылочных типов (массивы, объекты, функции) выполняет свойство прототипа своего конструктора
Конструктор
Особенности конструктора: первая буква имени функции заглавная, она похожа на шаблон, и несколько экземпляров могут быть новыми.
var a={} // var a=new Object()的语法糖
var a=[] // var a=new Array()的语法糖
function Foo(){} // var Foo=new Function()的语法糖
instanceof
instanceof определяет, какому конструктору принадлежит ссылочный тип
Логика оценки f instanceof Foo: __proto__ f поднимается слой за слоем, можно ли найти Foo.prototype.
Однако, поскольку __proto__ всех специальных объектов в цепочке прототипов в конечном итоге будет указывать на Object.prototype, instanceof не совсем точен при оценке типа.
Чем именно занимается новый оператор?
- Создать пустой объект
- Укажите __proto объекта на прототип прототипа конструктора
- Выполнить код в конструкторе, передать параметры и указать this на этот объект
- возвращаемый объект
function _new(){
let obj = {};
let con=[].shift.call(arguments);
obj.__proto__ = con.prototype;
let res = con.apply(obj, arguments);
return res instanceof Object ? res : obj;
}
Разница между созданием объекта по новому и созданием по литералу
Больше рекомендуется по тексту, созданию объектов, производительности и удобочитаемости. Разница между использованием var o = new object() и var o = {} заключается в том, что конструктор будет вызывать конструктор.
hasOwnProperty
hasOwnProperty определяет, имеет ли сам объект указанное свойство, и не будет искать цепочку прототипов.
Инструкции:object.hasOwnProperty(proName)
Используйте его для циклического просмотра собственных свойств объекта.
for(let item in f){
if(f.hasOwnProperty(item)){
console.log(item)
}
}
Сеть прототипов
При обращении к свойствам объекта сначала ищите базовые свойства, если нет, то идите вверх по цепочке __proto__, это цепочка прототипов
объектно-ориентированный
Несколько способов создания объектов
- заводской узор
function createPerson(name, age){
var o = new Object();
o.name = name;
o.age = age;
o.sayName = function(){
console.log(this.name)
}
return o;
}
var person1 = createPerson('chen',21)
- Шаблон конструктора
Создание объекта не показано, метод свойства напрямую назначен ему, нет оператора возврата
function Person(name, age){
this.name = name;
this.age = age;
this.sayName = function(){
console.log(this.name)
}
}
var person1 = new Person('chen',21)
Недостаток: каждый метод должен быть переопределен для каждого экземпляра и не может использоваться повторно.
- режим прототипа
function Person(){}
Person.prototype.name="chen"
Person.prototype.age=21
Person.prototype.sayName=function(){
console.log(this.name)
}
var person1 = new Person()
Недостаток: все экземпляры получают одинаковое значение свойства.
- Режим прототипа смешанного конструктора
Шаблон конструктора используется для определения свойств экземпляра, а шаблон прототипа — для определения методов и общих свойств.
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype = {
constructor: Person,
sayName: function(){
console.log(this.name)
}
}
var person1=new Person('chen',21)
реализовать наследование
JavaScript реализует наследование через цепочку прототипов
- Наследование цепочки прототипов
Ядро: используйте экземпляр родительского класса в качестве прототипа дочернего класса.
function Parent(){
this.name = 'parent'
}
Parent.prototype.sayName = function(){
return this.name
}
function Child(){
}
// 继承了Parent
Child.prototype = new Parent();
var child1=new Child();
child1.say();
Преимущества: наследование объектов шаблона и прототипа родительского класса.
Недостаток: множественное наследование невозможно, все свойства объекта-прототипа используются всеми экземплярами.
- Конструктор
Ядро: вызов родительского конструктора внутри дочернего конструктора
function Parent(){
this.arr=[1,2,3]
}
function Child(){
// 继承了Parent
Parent.call(this)
}
var child1 = new Child();
child.arr.push(4); // [1,2,3,4]
var child2 = new Child();
child.arr; // [1,2,3]
Преимущества: решает проблему, заключающуюся в том, что экземпляры подкласса совместно используют ссылочный объект родительского класса в наследовании цепочки прототипов, реализует множественное наследование и может передавать параметры родительскому классу при создании экземпляра подкласса.
Недостатки: могут наследоваться только свойства и методы экземпляра родительского класса, но не свойства/методы прототипа; повторное использование функций невозможно, и каждый подкласс имеет копию функции экземпляра родительского класса, что влияет на производительность.
- наследование композиции
Используйте наследование цепочки прототипов для использования наследования свойств и методов прототипа и реализации наследования свойств экземпляра через наследование конструктора.
function Parent(name){
this.name = name;
this.arr = [1,2,3]
}
Parent.prototype.sayName = function(){
console.log(this.name)
}
function Child(name,age){
// 继承属性
Parent.call(this, name)
this.age=age
}
// 继承方法
Child.prototype = new Parent()
Child.prototype.constructor = Child;
Child.prototype.sayAge = function(){
console.log(this.age)
}
var child1=new Child('chen',21);
child1.arr.push(4); //[1,2,3,4]
child1.sayName() // 'chen'
child1.sayAge() // 21
var child2=new Child('miao', 12)
child2.arr // [1,2,3]
child2.sayName() // "miao"
child2.sayAge() // 12
Преимущества: восполнение дефектов наследования конструктора, может наследовать свойства/метод экземпляра или наследовать атрибут/метод прототипа, нет проблемы совместного использования ссылочных атрибутов, может быть преобразовано, может быть повторно использовано
Недостатки: вызываются две функции родительской конструкции, один из которых является прототипом творческого подтипа, а другой находится в подконструкторе, два экземпляра (подэкземпляры помещены в подкатенты)
- прототипное наследование
Ядро: выполнить неглубокую копию данного объекта
var person = {
name: 'chen',
arr: [1,2,3]
}
var person1 = Object.create(person);
person1.name = 'run'
person1.arr.push(4)
var person2 = Object.create(person);
person2.name = 'miao'
person2.arr.push(5)
person.arr; // [1,2,3,4,5]
Недостатки: все экземпляры наследуют свойства прототипа, повторное использование невозможно.
- паразитарное наследование
Ядро: Создайте объект на основе объекта, затем улучшите объект и верните объект.
function create(original){
// 通过调用函数创建一个新对象
var clone = object(original);
// 以某种方式增强对象
clone.sayHi = function(){
console.log('hi')
}
return clone;
}
var person = {
name: 'chen'
}
var person1 = create(person);
person1.sayHi();
- Паразитическая композиционная наследственность
function Parent(name){
this.name = name;
this.arr = [1,2,3]
}
// 将共享的属性/方法放到原型上
Parent.prototype.sayName = function(){
console.log(this.name)
}
// 借用构造函数增强子类实例属性(支持传参和避免篡改)
function Child(name,age){
// 继承属性
Parent.call(this, name)
this.age=age
}
function inheritPrototype(Child, Parent){
var prototype=Object.create(Parent.prototype);
prototype.constructor=Child;
Child.prototype=prototype;
}
// 将父类原型指向子类
inheritPrototype(Child, Parent);
Child.prototype.sayAge=function(){
console.log(this.age)
}
var child1=new Child('chen',21);
child1.arr.push(4); //[1,2,3,4] 继承自父类实例属性
child1.sayName() // 'chen' 继承自父类原型方法
child1.sayAge() // 21 继承自子类原型方法
var child2=new Child('miao', 12)
child2.arr // [1,2,3]
child2.sayName() // "miao"
child2.sayAge() // 12
Как класс реализует наследование и в чем суть класса?
класс - это просто синтаксический сахар, по сути, функция
class Parent{
constructor(value){
this.val=value
}
getValue(){
console.log(this.val)
}
}
class Child extends Parent{
constructor(value){
super(value)
this.val = value
}
}
let child = new Child(1)
child.getValue() // 1
child instanceof Parent // true
Ядро: используйте extends, чтобы указать, от какого родительского класса наследуется, и super должен использоваться в конструкторе подкласса, который можно рассматривать как Parent.call(this, value)
Что такое объектно-ориентированное программирование и процедурное программирование, их сходства и различия, преимущества и недостатки
Ориентированность на процесс заключается в том, чтобы анализировать шаги, необходимые для решения проблемы, а затем использовать функции для пошаговой реализации этих шагов и вызывать их один за другим при их использовании.
Объектно-ориентированный - разложить транзакцию, составляющую проблему, на различные объекты.Цель вознаграждения объектов - не завершение шага, а описание поведения чего-либо на всем этапе решения проблемы.
Преимущества: простота обслуживания, высокая удобочитаемость, легкое расширение, высокий уровень наследования, снижение повторяющейся рабочей нагрузки и сокращение времени разработки.
Закрытие
Закрытие относится к функции, которая имеет доступ к переменным внутри другой функции.Когда другие функции определены внутри функции, создается замыкание.
Расскажите о своем понимании замыканий
Используйте замыкания для имитации области видимости на уровне блоков
преимущество: Он может избежать загрязнения глобальных переменных и реализовать инкапсуляцию и кэширование;
недостаток: закрытие резидентной памяти, увеличение использования памяти и неправильное использование утечек памяти.Решение: устанавливает для неприменимых локальных переменных значение null перед выходом из функции.
Два самых больших применения замыканий: 1. Вы можете читать переменные внутри функции 2. Постоянно хранить эти переменные в памяти 3. Инкапсулировать приватные свойства и приватные методы объекта
Расскажите о своем понимании цепочки областей видимости
Роль цепочки областей видимости состоит в том, чтобы гарантировать, что переменные и функции, имеющие доступ к среде выполнения, находятся в порядке.Переменные цепочки областей видимости могут только иметь доступ, а доступ к объекту окна прекращается.
Проще говоря, область действия — это доступная область действия переменных и функций.
Как создать область блока
- ES6 использует let и const
- Закрытие
BOM
Что такое объекты спецификации?
- объект верхнего уровня окна JS
- информация о текущем URL-адресе браузера местоположения
- навигатор сам браузер информация
- информация об экране экрана клиента
- История доступа к истории браузера
методы объекта окна
alert(),prompt(),confirm(),open(),close(),print(),focus(),blur(),moveBy(),moveTo(),resizeBy(),resizeTo(),scrollBy(),scrollTo(),setInterval(),setTimeout(),clearInterval(),clearTimeout()
объект истории
history.go(-1); // 后退一页
history.go(1); // 前进一页
history.back(); // 后退一页
history.forward(); // 前进一页
положение окна
- Получить положение левой и верхней части окна в браузерах
var leftPos=(typeof window.screenLeft == 'number') ? window.screenLeft : window.screenX;
var topPos=(typeof window.screenTop == 'number') ? window.screenTop : window.screenY;
- Переместить окно в указанное положение
moveTo (): получить значение координат x, y новой позиции
moveBy(): получает количество пикселей, перемещенных в горизонтальном и вертикальном направлениях.
размер окна
externalWidth и externalHeight возвращают размер самого окна браузера, innerWidth и innerHeight возвращают размер области просмотра контейнера
- изменить размер окна
resizeTo() и resizeBy()
Как определить тип браузера
Используйте навигатор.userAgent
var ua = navigator.userAgent;
var isChrome = ua.indexOf('Chrome')
Разобрать части URL
Используйте свойство местоположения
- href полный адрес
- протокол протокол
- хост имя хоста + номер порта
- имя хоста имя хоста
- порт номер порта
- относительный путь
- хеш #якорь
- поиск Строка запроса
history.go(1)
DOM
Почему манипулирование DOM происходит медленно?
Поскольку DOM принадлежит движку рендеринга, а JS принадлежит движку JS, когда мы работаем с DOM через JS, это включает связь между двумя потоками, и работа DOM может привести к перерисовке и перекомпоновке, поэтому это приводит к производительности. вопросы.
Вставка десятков тысяч DOM, как добиться, чтобы страница не зависала?
- 1. Рендеринг DOM пакетами и вставка DOM через цикл requestAnimationFrame.
- 2. Виртуальная прокрутка, отображающая только содержимое в видимой области
Что мешает рендерингу
- 1. И HTML, и CSS блокируют рендеринг. Если вы хотите рендерить быстрее, вам следует уменьшить размер файла исходного рендеринга, сгладить иерархию и оптимизировать селектор.
- 2. Когда браузер анализирует тег скрипта, он делает паузу для построения DOM,
Решение:
- ① Поместите тег script в нижнюю часть тела.
- ②Добавьте атрибут defer к тегу script, файл JS будет загружаться параллельно, но будет выполняться последовательно после анализа HTML.
- ③ Добавлен тег сценария с атрибутом async, указывающим, что загрузка и анализ файлов JS не будет блокировать рендеринг.
Перерисовка Перерисовка и перерисовка
Перерисовка — это когда узел меняет стиль, не влияя на макет, перекомпоновка — это когда необходимо изменить макет или свойства геометрии.
Неизбежно произойдет оплавление, а стоимость оплавления выше, чем стоимость перерисовки.
проблемы с производительностью: 1. Изменить размер окна 2. Изменить шрифт 3. Добавить или удалить стили 4. Изменить текст 5. Позиция или плавание 6. Блочная модель
Уменьшите количество перерисовок и перекомпоновок
- 1. Используйте трансформацию вместо топа
- 2. Используйте видимость для замены display:none, первая вызывает только перерисовку, вторая вызывает перекомпоновку
- 3. Не помещайте значение атрибута узла в цикл в качестве переменной в цикле.
- 4. Не используйте макеты таблиц
- 5. Чем быстрее достигается анимация, тем больше время перекомпоновки, вы также можете использовать requestAnimationFrame
- 6. Селекторы CSS сопоставляются справа налево, чтобы избежать слишком большого количества уровней узлов.
- 7. Установите часто перерисовываемые или перекомпоновываемые узлы в качестве слоев
①изменит атрибут ②видео, тег iframe
создать узел
- createElement создает элемент
- createTextNode создает текстовый узел
- createDocumentFragment создает фрагмент документа
- cloneNode возвращает копию узла, на котором был вызван метод
Меры предосторожности:
- Приведенное выше просто создает изолированный узел, который необходимо добавить в документ через appendChild.
- cloneNode должен обращать внимание на то, содержит ли скопированный узел дочерние узлы, привязку событий и другие проблемы.
- Используйте createDocumentFragment для решения проблем с производительностью при добавлении большого количества узлов.
API модификации страницы
- appendChild() добавляет дочерние узлы
- insertBefore() добавляет узел перед ссылочным узлом
parentNode.insertBefore(newNode, refNode)parentNode представляет родительский узел, newNode представляет добавляемый узел, а refNode представляет ссылочный узел.
- removeChild() удаляет дочерние узлы
- replaceChild() заменить
parent.replaceChild(newChild,oldChild)
API запроса узла
- document.getElementById
- document.getElementsByTagName
- document.getElementsByName
- document.getElementsByClassName
- Document.Queryselector // возвращает первый подходящий элемент
- document.querySelectorAll
Реляционный API узла
- parentNode // родительский узел
- parentElement // родительский узел, должен быть элементом
- childNodes // список дочерних элементов, включая текст, узлы комментариев
- дочерние элементы // список дочерних элементов
- firstChild // первый дочерний узел
- lastChild // последний дочерний узел
- hasChildNodes // Определяем, есть ли у текущего узла дочерние узлы
- previousSibling // предыдущий одноуровневый узел
- предыдущаяElementSibling//узел предыдущего родственного элемента
- nextSibling // следующий родственный узел
- nextElementSibling // узел следующего родственного элемента
API атрибутов элемента
- setAttribute установить атрибут
element.setAttribute(name, value)
- getAttribute возвращает значение атрибута
- removeAttribute удалить атрибут
API стилей элементов
- window.getComputedStyle возвращает вычисленный стиль элемента
- getBoundingClientRect возвращает размер и положение элемента относительно видимого окна браузера.
- Измените стиль элемента напрямую
ele.style.color = 'red'
ele.style.setProperty('font-size', '16px')
ele.style.removeProperty('color')
- Динамически добавлять правила стиля
var style = document.createElement('style');
style.innerHTML='body{color:red;} #top{color:white;}';
document.head.appendChild(style);
В чем разница между атрибутом и свойством?
атрибут — это атрибут, который элемент dom имеет в документе в виде тега HTML.
Прототип — это свойство, которое элемент dom имеет как объект в JS.
Как JS задает ширину и высоту полученной блочной модели?
- Получить ширину и высоту встроенного элемента
dom.style.width/height
- Применимо только для получения ширины и высоты элемента в IE
dom.currentStyle.width/height - Получите ширину и высоту элемента, лучшая совместимость
window.getCompontedStyle(dom).width/height - Получить ширину и высоту на основе абсолютного положения элемента в области просмотра
dom.getBoundingClientRect().width/height
- Наиболее часто используемый, лучшая совместимость
dom.offsetWidth/offsetHeight
Разница между offsetWidth/offsetHeight, clientWidth/clientHeight и srcollWidth/scrollHeight
- offsetWidth/offsetHeight возвращает content+padding+border, эффект такой же, как у e.getBoundingClientRect()
- clientWidth/clientHeight возвращает содержимое + отступы, если есть полоса прокрутки, она не включает полосу прокрутки
- scrollWidth/scrollHeight возвращает размер, содержащий содержимое + paddin + overflow
Разница между document.write и innerHTML
- document.write может перерисовывать только всю страницу
- innerHTML может перерисовывать часть страницы
DOM-события
уровень событий DOM
- DOM0
element.onclick=function(){} - DOM2
element.addEventListener('click',function(){},false) - DOM3
element.addEventListener('keyup',function(){},false)
Событие уровня DOM0Это назначение функции свойству обработки события. Недостаток заключается в том, что обработчик не может одновременно связать несколько функций обработки.
События уровня DOM2Добавьте в программу несколько функций обработки, определите два метода, addEventListener и removeEventListener, которые используются для привязки и отвязки событий соответственно.Метод содержит три параметра: имя свойства обработки связанного события, функцию обработки и захватывает, когда событие выполняется
IE8 и ниже реализованы с использованием attachEvent и detachEvent, и нет необходимости передавать третий параметр, потому что IE8 и ниже поддерживают только всплывающие события.
btn.attachEvent('onclick', showFn);
btn.detachEvent('onclick', showFn);
События уровня DOM3Он предназначен для добавления множества типов событий, таких как загрузка, прокрутка, размытие, фокус, dbclick, mouseup, mousewheel, textInput, keydown, keypress на основе событий уровня DOM2, а также позволяет пользователям настраивать некоторые события.
Как использовать события?
- Обработчик HTML-событий
<div onclick="clicked()"></div>
Плюсы и минусы: Простой, но тесно связанный с HTML-кодом, неудобно менять
- Обработчик уровня DOM0
document.onclick = function(){}; // 指定事件
docuemtn.onclick = null; // 删除事件
Плюсы и минусы: простой и кроссбраузерный
- Обработчик уровня DOM2
addEventListener('click', function(){},布尔值) // 指定事件
removeListener('click', function(){}, 布尔值) // 移除事件
Преимущества и недостатки: можно добавить несколько функций прослушивания, если указанная функция-обработчик является анонимной функцией, ее нельзя удалить.
- Обработчик событий IE
attachEvent('onclick', function(){}) // 指定事件
detachEvent('click', function(){}) // 移除事件
Преимущества и недостатки: можно добавить несколько функций прослушивания, если указанная функция-обработчик является анонимной функцией, ее нельзя удалить.
Различия между IE и стандартной моделью событий DOM
- Различия в параметрах:
Первый параметр attachEvent() на одно больше on, чем имя события addEventListener(); третьего параметра нет, поскольку модель событий IE поддерживает только всплывающие потоки событий.
- Область действия функции обработчика событий:
В IE обработчик события находится в глобальной области видимости, и this в нем будет указывать на окно, тогда как модель события DOM действует на элемент, а this в нем выполняет элемент, которому он принадлежит.
- Разница между методами свойств объекта события event
перестань пузыриться
IE: CancelBubble=true
DOM: stopPropagation()
Предотвратить событие по умолчанию элемента
IE: returnValue=false
DOM: предотвратить по умолчанию ()
цель события
IE: srcElement DOM: target
Какова совместимость между IE и стандартом?
var ev = ev || window.event;
document.docuemntElement.clientWidth || document.body.clientWidth
var target = ev.srcElement || ev.target
Модель событий DOM (всплывание и захват)
- всплывающее окно событий
Третий параметр addEventListener равен false, событие выполняется, когда оно всплывает, а цель события всплывает уровень за уровнем.
Как предотвратить всплытие событий
child.addEventListener('click', function(e){
console.log('目标事件')
e.stopPropagation();
}, false)
- захват событий
Захват событий выполняется сверху вниз, а третий параметр addEventListener равен true
Поток событий DOM
Поток событий, определяемый событиями уровня DOM2, включает три этапа: этап захвата событий, этап в целевом объекте и этап всплытия событий. Захват события отправляется первым, предоставляя возможность перехватить событие, затем фактическая цель получает событие, а последний этап — это этап всплытия, где на событие можно отреагировать.
Захват конкретного процесса захвата событий DOM
window->docuemnt->html->body->...
Окно, которое получает событие в начале, окно отдается документу после получения события, третье — это html-тег, а затем тело, и далее оно передается вниз уровень за уровнем. Эквивалент всплывает, процесс от текущего элемента к окну
Общие приложения для объекта Event
- event.preventDefault(): предотвратить событие по умолчанию
- event.stopPropagation(): остановить всплытие
- event.stopImmediatePropagatio(): останавливает выполнение оставшихся обработчиков событий и предотвращает всплывание текущего события в DOM.
- event.currentTarget: текущий связанный элемент события, когда событие делегировано
- event.target: когда событие делегировано, различайте, какой элемент в данный момент нажат
пользовательское событие
var event = new Event('custome');
ev.addEventListener('custome', function(){
console.log('custome');
});
ev.dispatchEvent(event);
Разница между mouseover и mouseenter
mouseover: когда мышь перемещается в элемент или его дочерние элементы, событие будет запущено, поэтому существует процесс повторного запуска и всплытия.对应的移除事件是mouseout
mouseenter: когда мышь перемещается в сам элемент (без подэлементов), событие будет запущено без всплытия.Соответствующее событие удаления — mouseleave
Пожалуйста, объясните, что такое брокер событий?
Прокси-сервер события (делегирование события) делегирует событие, которое изначально должно быть привязано к родительскому элементу, так что родительский элемент действует как прослушиватель событий. Принцип — всплытие событий DOM-элементов.
Преимущества: это может повысить производительность, сэкономить много памяти, сократить регистрацию событий и понять, что нет необходимости связывать его снова при добавлении подобъектов.
Разница между document.load и document.ready
document.onload выполняется после загрузки структуры стиля, а window.onload() запускается не только после загрузки структуры стиля, но и после загрузки всех файлов ресурсов изображения стиля.
В document.ready такого метода изначально нет.В jQuery есть $().ready().Событие ready не требует полной загрузки страницы.Достаточно только загрузить структуру DOM для срабатывания.
JSON
Как понять JSON?
JSON — это встроенный объект JS и облегченный формат обмена данными. Обычно используются два метода:
- разобрать // строку в объект
- stringify // объект в строку
Разница между XML и JSON?
- Объем данных: по сравнению с XML, JSON имеет меньший объем данных и более высокую скорость передачи.
- Взаимодействие с данными: взаимодействие между JSON и JavaScript более удобно, его легче анализировать и обрабатывать, а взаимодействие с данными лучше.
- Описание данных: JSON менее описателен для данных, чем XML.
- С точки зрения скорости передачи: JSON намного быстрее, чем XML.
Ajax
Как создать Аякс?
// 创建XMLHTTPRequest对象
var xhr = new XMLHttpRequest();
// 创建一个新的http请求
xhr.open("get", url, true)
// 设置响应HTTP请求状态变化的函数
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
if(xhr.status == 200){
// 获取异步调用返回的数据
alert(xhr.responseText)
}
}
}
// 发送HTTP请求
xhr.send(null);
Код состояния readyState описание: 0: не инициализирован, send() не вызывается; 1: send() был вызван, запрос выполняется; 2: метод send() выполнен, все содержимое ответа получено; 3: содержимое ответа анализируется; 4: анализ завершен и может быть вызван на клиенте.
Каковы преимущества и недостатки Ajax?
преимущество: 1. Улучшите взаимодействие с пользователем за счет асинхронного режима 2. Оптимизируйте передачу между браузером и сервером, уменьшите количество ненужных обменов данными и уменьшите использование полосы пропускания 3. Ajax работает на стороне клиента и берет на себя часть оригинальная работа сервера Проделанная работа снижает нагрузку на сервер при большом количестве пользователей 4. Ajax может добиться частичного обновления
недостаток: 1.Ajax раскрывает детали взаимодействия с сервером 2 поддержка поисковика слабая 3 непростая в отладке.
Разница между GET и POST, реализованными в браузерах
- GET, назад и обновление безвредны, можно добавить в закладки, можно кэшировать, параметры будут храниться в истории браузера, разрешены только символы ASCII, безопасность плохая, данные отображаются в URL
- POST назад и обновление повторно отправит данные, не может быть сохранено как тег, не может быть кэшировано, параметры не будут сохранены в истории браузера, нет ограничений на типы данных, повышенная безопасность, данные не будут отображаться в URL-адресе
Непонимание параметров запроса GET
Миф: Мы часто думаем, что существует ограничение на размер параметров GET-запроса, тогда как POST не имеет ограничений
На самом деле протокол HTTP не ограничивает длину запроса GET/POST.Максимальное ограничение длины GET связано с тем, что браузер и веб-сервер ограничивают длину URL-адреса.
Разница между GET и POST
Между методами GET и POST нет существенной разницы, но формат сообщения отличается.
перекрестный домен
Три тега, которые могут пересекать домены:<img><link><script>
Что такое междоменный домен?
Кросс-доменный относится к передаче данных или связи между разными доменами через JS. Протокол, доменное имя, порт имеют разницу это другой домен
Почему браузеры используют политику одного и того же происхождения?
Политика того же происхождения предназначена для предотвращения атак CSRF, она использует состояние входа пользователя для инициирования вредоносных запросов. Без политики одинакового происхождения Ajax может получить доступ к веб-сайту из любого источника.
Как решить кроссдоменную проблему?
- JSONP
Принцип заключается в использовании<script>Метки не имеют уязвимости междоменных ограничений
function jsonp(url, callback, success){
let script = docuemnt.createElement('scipt');
script.src = url;
script.async = true;
script.type = "text/javascript";
window[callback] = function(data){
success && success(data)
}
document.body.appendChild(script)
}
jsonp('http://xxx.com', 'callback', function(value){
console.log(value);
})
JSONP прост в использовании и имеет хорошую совместимость, но только для запросов GET.
- CORS
CORS должен поддерживаться как внешним, так и внутренним интерфейсом. Серверная сторона устанавливает Access-Control-Origin для включения CORS. Этот атрибут указывает, какие доменные имена могут получать доступ к ресурсам. Разделенные на простые запросы и сложные запросы, сложные запросы имеют еще один предварительный запрос
- document.domain применяется только к тому же доменному имени второго уровня, например.
a.test.comа такжеb.test.com. добавить на страницуdocument.domain = 'test.com'Указывает, что доменное имя второго уровня такое же и может быть междоменным. - postMessage
Обычно используется для получения данных сторонних страниц, встроенных в страницу, одна страница отправляет сообщение, а другая страница определяет источник и получает сообщение.
// 发送消息
window.parent.postMessage('message', 'http://www.test.com')
// 接收消息
let mc=new MessageChannel()
mc.addEventListener('message', event => {
let origin = event.origin || event.originalEvent.origin;
if(origin === 'http://www.test.com'){
console.log('验证通过')
}
})
window.name
место хранения
Пожалуйста, опишите разницу между cookie, sessionStorage и localStorage
отвечать:
- Емкость: cookie составляет всего 4 КБ, localStorage и sessionStorage имеют максимальную емкость 5 МБ.
- Связь с сервером: файлы cookie используются для связи клиент-сервер.
- Действительное время: файл cookie существует до истечения установленного действительного времени, sessionStorage будет очищаться при закрытии текущей страницы, а localStorage будет существовать всегда, если только он не будет активно удален.
- Простота использования API: API файла cookie должен быть инкапсулирован для использования, localStorage.setItem(key, value);localStorage.getItem(key)
Есть несколько способов реализовать функцию хранения?
куки, сессионстораже, локалстораже, индексдб.
IndexDB не имеет ограничений по размеру хранилища, не взаимодействует с сервером и всегда будет существовать, если только он не будет активно удален.
Что такое сервисный работник?
Service Worker — это независимый поток, работающий за браузером, как правило, его можно использовать для реализации функции кэширования, протокол передачи должен быть https.
Работа серверного работника?
- Взаимодействовать с кешем, когда пользователь запрашивает что-то в кеше, сервис-воркер может сразу получить данные из кеша без вызова через внешний http
- Отправляйте push-уведомления
- Запуск фоновой синхронизации: отправьте файл с помощью браузера в автономном режиме, Service Worker может сохранить эту задачу и загрузить файл на внешний сервер после восстановления сетевого подключения.
ES6
стрелочная функция
Отличие стрелочных функций от обычных функций:
- Стрелочные функции не имеют аргументов (замените оператором остатка)
- Стрелочные функции не имеют прототипа и не могут использоваться в качестве конструкторов (не могут вызываться с ключевым словом new).
- Стрелочные функции не имеют собственного this, ссылаются на this внешнего контекста выполнения.
спред оператор
- Преобразует массивы, подобные массивам, в настоящие массивы.
let nodeList = document.querySelectorAll('div')
let arr=[...nodeList]
- Объединить несколько массивов
let arr1=[1,2,3]
let arr2=[4,5,6]
let arr3=[...arr1, ...arr2]
for... цикла
Разница между for-of и for-in
- Обход for-of получает значение ключа объекта, а for-in получает имя ключа
- for-in пройдёт всю цепочку прототипов объекта, что имеет низкую производительность for...of пройдёт только текущий объект и не пройдёт цепочку прототипов
- Для обхода массива for-in просматривает все перечисляемые свойства (включая цепочки прототипов), а for...of возвращает только значение свойства, соответствующее индексу массива.
Принцип для... из
Используя интерфейс итератора внутри объекта обхода, цикл for...of разбивается на самый примитивный цикл for.
Каковы преимущества и недостатки понимания обещаний? Что такое цепочка обещаний? В чем разница между выполнением конструктора Promise и выполнением функции?
- Обещание имеет три состояния: ожидание, решено, завершено, отклонено, отклонено.
И как только он переходит из состояния ожидания в другое состояние, его нельзя изменить снова.
- Когда Promise создается, код внутри конструктора выполняется немедленно.
- Промис реализует связанные вызовы, то есть новый промис возвращается после каждого вызова then.Если в then используется return, значение return будет обернуто Promise.resolve().
Что вы понимаете под генератором?
Генератор может контролировать выполнение функций
function *foo(x){
let y=2*(yield(x+1))
let z=yield(y/3)
return (x+y+z)
}
let it=foo(5)
it.next() // {value:6,done:false}
it.next(12)
it.next(13)
Вызов функции Generator вернет итератор. В первый раз функция останавливается на yield(x+1), поэтому значение=5+1=6; во второй раз входящий параметр эквивалентен значению предыдущего yield, то есть пусть y=2*12=24; пусть z=24/3=8; третий следующий, входящий параметр эквивалентен значению предыдущего yield, то есть пусть z=13, y= 24, x=5, добавить и вернуть 42
Преимущества асинхронного ожидания по сравнению с обещанием
- Преимущество в том, что он обрабатывает цепочку вызовов then и может писать код более четко и точно.
- Недостатки: await трансформирует асинхронный код в синхронный, если нет зависимости между несколькими асинхронными кодами, но использование await приведет к падению производительности
Понимание async, await, внутренних принципов
Асинхронность заключается в переносе возвращаемого значения функции с помощью Promise.resolve(), что аналогично обработке возвращаемого значения, а асинхронность может использоваться только с ожиданием. await на самом деле является синтаксическим сахаром генератора плюс обещание, а генератор автоматического выполнения реализован внутри.
Каковы характеристики setTimeout, setInterval и requestAnimationFrame?
setTimeout задерживает выполнение, а setInterval выполняет функцию обратного вызова через равные промежутки времени Ни один из двух вышеперечисленных способов не гарантирует, что задача будет выполнена в ожидаемое время. requestAnimationFrame имеет собственную функцию регулирования, и эффект задержки точен.
Реализуйте обещание самостоятельно
const PENDGIN='pending'
const RESOLVED='resolved'
const REJECTED='rejected'
function myPromise(fn){
const that=this
that.state=PENDING
that.value=null
that.resolvedCallbacks=[]
that.rejectedCallbacks=[]
function resolve(value){
if(value instanceof myPromise){
return value.then(resolve, reject)
}
setTimeout(()=>{
if(that.state===PENDING){
that.state=RESOLVED;
that.value=value;
that.resolvedCallbacks.map(cb => cb(that.value))
}
},0)
}
function reject(error){
setTimeout(()=>{
if(that.state===PENDING){
that.state=REJECTED
that.value=value
that.rejectedCallbacks.map(cb => cb(that.value))
}
},0)
}
try{
fn(resolve, reject)
}catch(e){
reject(e)
}
}
myPromise.prototype.then=function(onFulfilled, onRejected){
const that=this
onFulfilled=typeof onFulfilled==='function'?onFulfilled: v=>v
onRejected=typeof onRejected==='function'?onRejected: r=>{throw r}
if(that.state===PENDING){
that.resolvedCallbacks.push(onFulfilled)
that.rejectedCallbacks.push(onRejected)
}
if(that.state===RESOLVED){
onFulfilled(that.value)
}
if(that.state===REJECTED){
onRejected(that.value)
}
}
new myPromise((resolve, reject) => {
setTimeout(()=>{
resolve(1)
},0)
}).then(value=>{
console.log(value)
})
разница между потоком и процессом
Процесс описывает события, необходимые ЦП для выполнения инструкций и загрузки и сохранения контекстов.Потоки — это более мелкие единицы, которые ускоряют время, необходимое для выполнения инструкции в секундах.
Преимущества однопоточного JS
Поскольку js может изменять DOM, если поток пользовательского интерфейса все еще работает во время выполнения JS, пользовательский интерфейс не может быть безопасно отрисован. JS работает в одном потоке, что позволяет экономить память, экономить время переключения контекста и не иметь проблем с блокировкой.
что такое стек выполнения
Стек выполнения хранит структуру стека вызовов функций, следуя принципу «первым пришел — последним вышел». Поместите его в стек выполнения снизу, а затем вытащите его с вершины стека для выполнения.
Микрозадачи и макрозадачи
Разным очередям задач будут назначены разные источники задач.Источники задач можно разделить на микрозадачи и макрозадачи. Микрозадачи включают process.nextTick, promise, MutationObserver. Задачи макросов включают сценарии, setTimeout, setInterval, setImmediate, ввод-вывод, рендеринг пользовательского интерфейса.
Порядок выполнения EventLoop
1. Сначала выполните синхронный код, который представляет собой задачу макроса. 2. После выполнения всего синхронного кода стек выполнения пуст, проверьте, есть ли какой-либо асинхронный код для выполнения. 3. Выполнить все микрозадачи 4. Когда все микрозадачи будут выполнены, страница будет отрисовываться при необходимости 5. Затем запустить следующий раунд EventLoop, выполнить асинхронный код в задаче макроса, то есть функцию обратного вызова в setTimeout
Proxy
Одной из основных функций Vue3.0 является использование Proxy вместо Object.defineProperty. Прокси может установить перехватчик перед целевым объектом, обычно с Reflect, первый перехватывает объект, а второй возвращает результат перехвата
Недостатки Object.defineProperty
1. Не удалось обнаружить добавление и удаление корневых атрибутов объекта. 2. Невозможно обнаружить модификации массивов на основе индексов. 3. Не удалось обнаружить мониторинг модификации .length
использованная литература:
Расширенное программирование с помощью JavaScript (3-е издание)