Теплый предварительный письменный тест/интервью/заметки (руководство)

внешний интерфейс JavaScript опрос

слова, написанные впереди

Я не мастер, но тоже новичок. В процессе обучения я всегда забываю, запоминаю, практикуюсь и забываю неоднократно.Поэтому я решил потихоньку обобщить пройденные ямы и письменный тест, который я испытал, и буду продолжать обновлять и добавлять. находится на 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
            }
        }
    }
}

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