слова, написанные впереди
Я не мастер, но тоже новичок. В процессе обучения я всегда забываю, запоминаю, практикуюсь и забываю неоднократно.Поэтому я решил потихоньку обобщить пройденные ямы и письменный тест, который я испытал, и буду продолжать обновлять и добавлять. находится на github. Я чувствую, что хороший друг, не забудьте поставить звезду, давайте вместе добьемся прогресса~~
Обновить адрес:портал
Предварительное интервью, письменный тест и руководство по неправильным вопросам
CSS связанные
1. Разница между отображением: нет и видимостью: скрыто (вопросы письменного теста интерфейса Pinduoduo, 2018 г.)
Ответ: Визуально они одинаковы, но отличаются управлением домом. display:none сделает все элементы положения дома, связанные с шириной и высотой, недействительными и исчезнет; visibility:hidden просто делает элемент невидимым, но ширина и исходное положение не меняются.
javascript
1. Основные вопросы
1) Можно ли использоватьtypeof bar === 'object'
Чтобы определить, является ли бар объектным типом, есть ли риск?
Ответ: Есть риск, базовые типы данных jsString
Number
Boolean
undefined
null
и сложный тип данныхobject
(добавлен ES6symbol
).
Для сложных типов данныхobject
,фактическиtypeof null
также вернулсяobject
, потому что по существуnull
Это объект-заполнитель. С другой стороны, массивыArray
также нельзя использоватьtypeof
Проверьте тип данных, потому что то же самое вернетсяobject
.
Поэтому, если вы хотите обнаружитьbar
не так лиobject
, может быть так:
console.log((bar !== null) && (tiopnuiop[yuiop[]\\]poi456/ypeof bar ==='object'))
//当然,如果认为function也是 object,可以用下面的语句
console.log((bar !== nul)&& (typeof bar ==='object')||(typeof bar ==='function'))
Кроме того, есть такие случаи, как Array, потому что Array также вернетobject
, если мы не думаем, что массив считается объектом, мы должны действительно распознать массив.Методы предпочтения массива:
console.log( bar instanceof Array) // 如果数组,返回true
console.log( Array.isArray(bar)) //ES5方法
console.log( Ojbect.prototype.toString.call(arr) === '[object Array]')
2) Эквивалентны ли следующие две функции?
function foo1()
{
return {
bar: "hello"
};
}
function foo2()
{
return
{
bar: "hello"
};
}
Ответ: Не эквивалентно! !
Обратите внимание, что вторая функция возвращаетundefined
console.log(foo1()); // {bar : "hellp"}
console.log(foo2()); // undefined
Вот почему, когда функция возвращает объект или пишет фигурные скобки, поместите{
Запишите это в сторону, потому что вторая функция js вернет то, что возвращается по умолчанию (она пуста), что эквивалентно
return undefined
{xxx}
//后面当然,当然是写了也白写
3) NaN
Что это такое? Как проверить, является ли переменнаяNaN
?
Ответ: NaNNot A Number
, но на самом деле этоNumber
Типыtypeof NaN
вернусьNumber
.
Эта вещь более мощная, потому что
NaN === NaN //false
Вы обнаружите, что она не равна самой себе, поэтому судить, является ли переменная ею, по ней нельзя.===
.
Можно использовать метод isNaN.
//检查变量是否是nan
isNaN(bar);
Object.is(bar,NaN); //ES6方法,这个方法会修正JS中的一些小bug
Метод Object.is() требует строгого равенства, и Object.is(NaN, NaN) вернет true.
2. Вопросы, связанные с областью применения
Что выводит следующая программа:
(function(){
var a = b = 3;
})();
console.log("a defined? " + (typeof a !== 'undefined'));
console.log("b defined? " + (typeof b !== 'undefined'));
Отвечать:
определено?
b defined? true
Суть понимания этого вопроса заключается в том, как понятьvar a = b = 3
Это предложение, по сути, эквивалентно
var a;
b = 3;
Таким образом, фактически b объявляется в глобальной переменной (компилятор объявляет ее за вас в прекомпиляции, но в строгом режиме это невозможно) a — локальная переменная, поэтому она не определена вне функции.
3.это&объект&массив
1) Что выводит следующая программа
var myObject = {
foo: "bar",
func: function() {
var self = this;
console.log("outer func: this.foo = " + this.foo);
console.log("outer func: self.foo = " + self.foo);
(function() {
console.log(this);
console.log("inner func: this.foo = " + this.foo);
console.log("inner func: self.foo = " + self.foo);
}());
}
};
myObject.func();
//答案
outer func: this.foo = bar
outer func: serl.foo = bar
inner func: this.foo = undefined
inner func: self.foo = bar
Анализ: Выясните, на что это указывает. Помните следующие правила
- Кто звонит, кто это указывает
xxx.fun()
- новый объект, это указывает на сам экземпляр
var c = new fun()
- Используйте call/apply/bind для изменения этого указателя.
посмотри тему,outer func
Очевидно, в первом случае, кто звонит, на кого это указывает, на этот раз мой Ojbect.
В функции немедленного выполнения здесь this не указывается привязкой и, естественно, принадлежит окну, поэтому здесь this.foo не определено
Дополнить это о стрелочных функциях
function a() {
return () => {
return () => {
console.log(this)
}
}
}
console.log(a()()())
Уведомление:Стрелочные функции на самом деле не имеют this.this в этой функции зависит только от this первой функции вне нее, которая не является стрелочной функцией. В этом примере, поскольку вызов соответствует первому случаю в предыдущем коде, это окно. И это, однажды привязанное к контексту, не будет изменено никаким кодом.
2) Фильтр массива, что является результатом следующего (оригинальное название интерфейса Pinduoduo 2018 г.)
var arr = [1,2,3];
arr[10] = 9;
arr.filter((item)=> {
return item === undefined?
})
//答案
[]
Анализ: да, ответ действительно [], нет[undefined x 7]
.
Прежде всего, посмотрите, что такое arr после выполнения первых двух предложений.
console.log(arr)
//[1,2,3, emptyx7, 9]
console.log(arr[5])
//undefined
Как видно из приведенных выше результатов, он действительно не определен в середине (тот, который отображается как пустой, не определен). Затем, после фильтра, он не должен возвращаться какundefined
данные?
Да, но когда массив не определен, массив пуст или[empty x 7] === []
Судя по комментариям бро眷你
а также异次元的废D
, вот обновление объяснения. На самом деле пустое и неопределенное разные.
Объяснение, процитированное с зарубежного технологического форума, выглядит следующим образом:
а) Это не приведет к сбою. Движок JavaScript сделает слоты массива с 3 по 9 «пустыми слотами».
б) Здесь a[6] выдаст undefined, но слот все равно останется пустым, а не заполненным undefined, в некоторых случаях это может быть важным нюансом, например, при использовании map() пустые слоты останутся пустыми в карте () , но неопределенные слоты будут переназначены с помощью переданной ему функции:
var b = [undefined];
b[2] = 1;
console.log(b); // (3) [undefined, empty × 1, 1]
console.log(b.map(e => 7)); // (3) [7, empty × 1, 7]
Перевод заключается в том, что undefined и пустой слот, зарезервированный массивом, не эквивалентны, даже если мы распечатаем соответствующие данные,undefined
, но с jsundefined
Это отличается, кроме arr.filter, в том числе функция arr.map() будет резервировать пустой слот.
4. Ошибка неточности в десятичном исчислении JS
Каково возвращаемое значение следующего кода
console.log(0.1 + 0.2);
console.log(0.1 + 0.2 == 0.3);
//答案: 0.30000000000000004
false
Анализ: Для подробного анализа см. соединение, вот решение0.1+0.2 != 0.3
//解决办法
parseFloat((0.1+0.2).toFixed(10));
5. Алгоритм/идея, связанная
1) Обсудите реализацию функции, которая определяет, является ли переменная целым числом.isInter(x)
реализация
Ответ: В ES6 есть готовый методNumber.isInteger
пригодный для использования. Если вы делаете это сами, в чем идея?
//1 异或运算
function isInter(x) {
return x ^ 0 === x
}
//2 取整
return Math.round(x) === x //同样可以用floor ceil
//取余
return (typeof x === 'number')&&(x % 1 === 0)
2) Напишите метод суммы, который может реализовать следующие два метода вызова.
console.log(sum(2,3)) //5
console.log(sum(2)(3)) //5
Отвечать:
//方法1
var sum = function(x,y) {
if(y === undefined) {
return function(y) {
return x + y;
}
}else {
return x + y;
}
}
//方法2
var sum = function(x){
if( arguments.length === 1) {
return function (y) {
return x + y;
}
} else {
console.log('here');
return arguments[0] + arguments[1];
}
}
3) Используйте рекурсивный метод для преобразования obj в формат obj2 (вопросы письменного теста интерфейса Pinduoduo 2018)
obj = [
{id:1,parent:null},
{id:2,parent:1},
{id:3,parent:2}
]
obj2 = {
obj:{
id: 1,
parent: null,
child: {
id: 2,
parent: 1,
child: {
id: ,3,
parent: 2
}
}
}
}
Ответ на этот вопрос оставляю для размышления моим друзьям, так как автор написал не очень красивую программу во время теста, поэтому я выложу ее после того, как разберусь.Приглашаю друзей к обсуждению в комментариях