«Поиск недостатков и устранение утечек» дает вам 54 вопроса для собеседования по JavaScript.

JavaScript
«Поиск недостатков и устранение утечек» дает вам 54 вопроса для собеседования по JavaScript.

предисловие

Всем привет,меня зовут TianTian,я любитель акмеров,люблю метания и алгоритмы.Я перебрал несколько хороших тем JS.Посмотрев его,много почерпнул.Поделюсь с вами ❤️

Вопросы в основном из вопросов, подверженных ошибкам, которые были замечены, а также из классических"44 JavaScript-головоломки!", отОригинальная ссылка

"stackoverflow"Есть много хороших вопросов по этому поводу, вы можете сделать хорошую основу

Вопросы по JS, подверженные ошибкам, долго не будут обновляться, TypeScript отсутствует, TS действительно благоухает

➡️Дайте небольшое предложение, вы можете сначала прочитать первый вопрос, если нет проблем, вы можете в принципе пропустить последний

Репозиторий GitHub нажмите здесь

Давайте начнем👇

«Поиск и заполнение утечек» отправит вам 18 вопросов браузерного интервью (1,6 Вт слов).

. VS =приоритет оператора

  let a = {n : 1};
        let b = a;
        a.x = a = {n: 2};

        
        console.log(a.x)
        console.log(b.x)

Каков результат?

Вы действительно хотите понять?

Отвечать

undefined


{ n : 2}

ты действительно понимаешь масштаб

  var a = 0,  
            b = 0;
        function A(a) {
            A = function (b) {
                console.log(a + b++)
            }
            console.log(a++)
        }
        A(1)
        A(2)

Оставьте это вам, чтобы подумать, но я сделал это неправильно в первый раз (;'⌒`)

"Ответы 1 4"

Подумайте об этом, и вы будете ошеломлены.

длина массива

  var obj = {
            "2" : 3,
            "3" : 4,
            "length" : 2,
            "splice" : Array.prototype.splice,
            "push" : Array.prototype.push
        }
        obj.push(1)
        obj.push(2)
        console.log(obj)

Каков результат выполнения этого кода?

答案:Object(4) [empty × 2, 1, 2, splice: ƒ, push: ƒ]
类数组length
длина массива
解释就是第一次使用push,obj对象的push方法设置obj[2] = 1,obj.length++

解释就是第一次使用push,obj对象的push方法设置obj[3] = 2,obj.length++

使用console.log()方法输出的时候,因为obj上有length属性和splice方法,故将其作为数组输出打印

打印时因为数组未设置下标为0和1的值,故打印的结果就是empty,主动获取obj[0] = undefined

Неанонимная самовыполняющаяся функция, имя функции доступно только для чтения

  var b = 10;
        (function b(){
            // 'use strict'
            b = 20
            console.log(b)
        })()

Каков результат вывода?

Function b
- 如标题一样,非匿名自执行函数,函数名不可以修改,严格模式下会TypeError,
- 非严格模式下,不报错,修改也没有用。
- 查找变量b时,立即执行函数会有内部作用域,会先去查找是否有b变量的声明,有的话,直接复制
- 确实发现具名函数Function b(){} 所以就拿来做b的值
- IIFE的函数内部无法进行复制(类似于const)

Неанонимная самоисполняющаяся функция II

  var b = 10;
        (function b(){
            // 'use strict'
            var b = 20
            console.log(window.b) 
            console.log(b)
        })()

Каков результат?

10
20
// 访问b变量的时候,发现var b = 20;在当前作用域中找到了b变量,于是把b的值作为20

Неанонимная самоисполняющаяся функция III

  var b = 10;
        (function b(){
            console.log(b)
            b = 5
            console.log(window.b)
            var b = 20
            console.log(b)
        })()

Каков результат на выходе?

Этот вопрос не должен быть трудным, я оставлю его вам подумать над ним.

переменное продвижение

var name = 'World!';
(function () {
    if (typeof name === 'undefined') {
        var name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();

В JavaScript, Fun и var подняты

эквивалентно

var name = 'World!';
(function () {
    var name;
    if (typeof name === 'undefined') {
        name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
})();

Чтобы закрепить:

 var str = 'World!';   
    (function (name) {
    if (typeof name === 'undefined') {
        var name = 'Jack';
        console.log('Goodbye ' + name);
    } else {
        console.log('Hello ' + name);
    }
    })(str);
    答案:Hello World 因为name已经变成函数内局部变量

максимальное целое число

var END = Math.pow(2, 53);
var START = END - 100;
var count = 0;
for (var i = START; i <= END; i++) {
    count++;
}
console.log(count);

Точка знаний:Infinity

在 JS 里, Math.pow(2, 53) == 9007199254740992 是可以表示的最大值. 最大值加一还是最大值. 所以循环不会停.

Разреженные и плотные массивы

var ary = [0,1,2];
ary[10] = 10;
ary.filter(function(x) { return x === undefined;});

Каков результат выполнения?

Чтобы изучить эту тему, вам нужно понимать разреженные массивы и плотные массивы.

Студенты, которые прочитали исходный код, должны знать, что в исходном коде фильтра будет оцениваться, является ли значение индекса массива атрибутом массива.Заинтересованные студенты могут прочитать эту статью, которую я написал о массивах:[Галантные товары👍] От детальной работы массива js до анализа array.js в v8

0 in ary; => true
3 in ary; => false
10 in ary; => true
也就是说 从 3 - 9 都是没有初始化的'坑'!, 这些索引并不存在与数组中. 在 array 的函数调用的时候是会跳过这些'坑'的.

Итак, ответ []

операции с плавающей запятой

var two   = 0.2
var one   = 0.1
var eight = 0.8
var six   = 0.6
[two - one == one, eight - six == two]

Как вы думаете, какой будет результат? Как ответить на этот вопрос в интервью?

[true,false]

Ознакомьтесь с этими статьями:

Switch

function showCase(value) {
    switch(value) {
    case 'A':
        console.log('Case A');
        break;
    case 'B':
        console.log('Case B');
        break;
    case undefined:
        console.log('undefined');
        break;
    default:
        console.log('Do not know!');
    }
}
showCase(new String('A'));

Каков результат операции?

switch 是严格比较, String 实例和 字符串不一样.
答案自然是'Do not know' 
所以一般情况下,写switch语句,也建议写default

String("A")

function showCase2(value) {
    switch(value) {
    case 'A':
        console.log('Case A');
        break;
    case 'B':
        console.log('Case B');
        break;
    case undefined:
        console.log('undefined');
        break;
    default:
        console.log('Do not know!');
    }
}
showCase2(String('A'));

Что с беговым результатом?

答案:Case A
解析:String('A')就是返回一个字符串

% оператор

function isOdd(num) {
    return num % 2 == 1;
}
function isEven(num) {
    return num % 2 == 0;
}
function isSane(num) {
    return isEven(num) || isOdd(num);
}
var values = [7, 4, '13', -9, Infinity];
values.map(isSane);

Каков результат операции?

答案:[true, true, true, false, false]
解析:%如果不是数值会调用Number()去转化
     '13' % 2       // 1
      Infinity % 2  //NaN  Infinity 是无穷大
      -9 % 2        // -1
巩固: 9 % -2        // 1   余数的正负号随第一个操作数

Что такое прототип массива

Array.isArray( Array.prototype )

Каков результат выполнения этого кода?

答案:true
解析:Array.prototype是一个数组
数组的原型是数组,对象的原型是对象,函数的原型是函数

свободное равенство ==

[]==[]

какой ответ

答案:false
解析:两个引用类型, ==比较的是引用地址

== и !

[]== ![] 

Какой результат?

(1)! 的优先级高于== ,右边Boolean([])是true,取返等于 false
(2)一个引用类型和一个值去比较 把引用类型转化成值类型,左边0
(3)所以 0 == false  答案是true

Складывать и вычитать числа и строки

'5' + 3
'5' - 3

Какой результат?

答案:53  2
解析:加号有拼接功能,减号就是逻辑运算
巩固:typeof (+"1")   // "number" 对非数值+—常被用来做类型转换相当于Number()

Волна действия + - + + + - +

1 + - + + + - + 1

какой результат

答案:2
解析:+-又是一元加和减操作符号,就是数学里的正负号。负负得正哈。 
巩固: 一元运算符还有一个常用的用法就是将自执行函数的function从函数声明变成表达式。
      常用的有 + - ~ ! void
      + function () { }
      - function () { }
      ~ function () { }
      void function () { }

Опять разреженный массив? Массив.прототип.карта()

var ary = Array(3);
ary[0]=2
ary.map(function(elem) { return '1'; });

Каков результат на выходе?

稀疏数组

题目中的数组其实是一个长度为3, 但是没有内容的数组, array 上的操作会跳过这些未初始化的'坑'.

所以答案是 ["1", empty × 2]

Вставьте полифил Array.prototype.map сюда.

Array.prototype.map = function(callback, thisArg) {

        var T, A, k;

        if (this == null) {
            throw new TypeError(' this is null or not defined');
        }

        var O = Object(this);
        var len = O.length >>> 0;
        if (typeof callback !== 'function') {
            throw new TypeError(callback + ' is not a function');
        }
        if (arguments.length > 1) {
            T = thisArg;
        }
        A = new Array(len);
        k = 0;
        while (k < len) {
            var kValue, mappedValue;
            if (k in O) {
                kValue = O[k];
                mappedValue = callback.call(T, kValue, k, O);
                A[k] = mappedValue;
            }
            k++;
        }
        return A;
    };

Как хранится JS

var a = 111111111111111110000,
b = 1111;
a + b;

Каков результат выполнения этого кода?

答案:11111111111111111000
解析:在JavaScript中number类型在JavaScript中以64位(8byte)来存储。
这64位中有符号位1位、指数位11位、实数位52位。
2的53次方时,是最大值。
其值为:9007199254740992(0x20000000000000)。
超过这个值的话,运算的结果就会不对.

Размер сравнения массивов

var a = [1, 2, 3],
    b = [1, 2, 3],
    c = [1, 2, 4]
a ==  b
a === b
a >   c
a <   c

Каков результат выполнения этого кода?

答案:false, false, false, true
解析:相等(==)和全等(===)还是比较引用地址
     引用类型间比较大小是按照字典序比较,就是先比第一项谁大,相同再去比第二项。

Тернарный приоритет оператора

var val = 'smtg';
console.log('Value is ' + (val === 'smtg') ? 'Something' : 'Nothing');

Каков результат выполнения этого кода?

答案:Something
解析:字符串连接比三元运算有更高的优先级 
     所以原题等价于 'Value is true' ? 'Somthing' : 'Nonthing' 
     而不是 'Value   is' + (true ? 'Something' : 'Nonthing')
巩固:
    1 || fn() && fn()   //1  
    1 || 1 ? 2 : 3 ;    //2  

прототип

var a = {}, b = Object.prototype;
[a.prototype === b, Object.getPrototypeOf(a) === b] 

Каков результат выполнения?

答案:false, true
解析:Object 的实例是 a,a上并没有prototype属性
     a的__poroto__ 指向的是Object.prototype,也就是Object.getPrototypeOf(a)。a的原型对象是b

Прототип 2

function f() {}
var a = f.prototype, b = Object.getPrototypeOf(f);
a === b         

Каков результат выполнения этого кода?

答案:false
解析:a是构造函数f的原型 : {constructor: ƒ}
b是实例f的原型对象 : ƒ () { [native code] }

имя функции

function foo() { }
var oldName = foo.name;
foo.name = "bar";
[oldName, foo.name]     

Каков результат выполнения кода?

答案:["foo", "foo"]
解析:函数的名字不可变.

[typeof null, null instanceof Object]

答案:["object", false]
解析:null代表空对象指针,所以typeof判断成一个对象。可以说JS设计上的一个BUG
     instanceof 实际上判断的是对象上构造函数,null是空当然不可能有构造函数
巩固:null == undefined //true    null === undefined //flase

[ [3,2,1].reduce(Math.pow), [].reduce(Math.pow) ]

答案:Error
解析:Math.pow (x , y)  x 的 y 次幂的值
     reduce(fn,total)
     fn (total, currentValue, currentIndex, arr) 
         如果一个函数不传初始值,数组第一个组默认为初始值.
         [3,2,1].reduce(Math.pow)
         Math.pow(3,2) //9
         Math.pow(9,1) //9

巩固题,可以做一做:
  [].reduce(Math.pow)       //空数组会报TypeError
     [1].reduce(Math.pow)      //只有初始值就不会执行回调函数,直接返回1
     [].reduce(Math.pow,1)     //只有初始值就不会执行回调函数,直接返回1
     [2].reduce(Math.pow,3)    //传入初始值,执行回调函数,返回9

replace

"1 2 3".replace(/\d/g, parseInt)

Каков результат?

答案:"1 NaN 3"
解析:replace() 回调函数的四个参数:
      1、匹配项  
      2、与模式中的子表达式匹配的字符串  
      3、出现的位置  
      4、stringObject 本身 。
如果没有与子表达式匹配的项,第二参数为出现的位置.所以第一个参数是匹配项,第二个参数是位置
 parseInt('1', 0)
 parseInt('2', 2)  //2进制中不可能有2
 parseInt('3', 4)

оценочное использование

function f() {}
var parent = Object.getPrototypeOf(f);
f.name // ?
parent.name // ?
typeof eval(f.name) // ?
typeof eval(parent.name) //  ?  

Каков результат выполнения этого кода?

答案:"f", "Empty", "function", error
解析:f的函数名就是f
     parent是f原型对象的名字为"" ,
     先计算eval(f.name) 为 f,f的数据类型是function
     eval(parent.name) 为undefined, "undefined"

new Date()

var a = new Date("2014-03-19"),
b = new Date(2014, 03, 19);
[a.getDay() === b.getDay(), a.getMonth() === b.getMonth()]

Каков результат выполнения этого кода?

答案:[false, false]
解析: var a = new Date("2014-03-19")    //能够识别这样的字符串,返回想要的日期
      Wed Mar 19 2014 08:00:00 GMT+0800 (CST)
      b = new Date(2014, 03, 19);       //参数要按照索引来
      Sat Apr 19 2014 00:00:00 GMT+0800 (CST)
      月是从0索引,日期是从1 
      getDay()是获取星期几
      getMonth()是获取月份所以都不同
巩固: [a.getDate() === b.getDate()] //true

new Date() II

var a = Date(0);
var b = new Date(0);
var c = new Date();
[a === b, b === c, a === c]

Каков результат выполнения этого кода?

答案:[false, false, false]
解析:当日期被作为构造函数调用时,它返回一个相对于划时代的对象(JAN 01 1970)。
当参数丢失时,它返回当前日期。当它作为函数调用时,它返回当前时间的字符串表示形式。
a是字符串   a === b // 数据类型都不同,肯定是false
b是对象     b === c // 引用类型,比的是引用地址
c也是对象   a === c // 数据类型都不同,肯定是false

new Date() III

var a = new Date("epoch")

Как вы думаете, какой будет результат?

答案:Invalid Date {}
解析:您得到“无效日期”,这是一个实际的日期对象(一个日期的日期为true)。但无效。这是因为时间内部保持为一个数字,在这种情况下,它是NA。
      在chrome上是undefined 
      正确的是格式是var d = new Date(year, month, day, hours, minutes, seconds, milliseconds);

Function.length

var a = Function.length,
b = new Function().length
a === b

Каково выполнение этого кода?

答案:false
解析:首先new在函数带()时运算优先级和.一样所以从左向右执行
     new Function() 的函数长度为0
巩固:function fn () {
         var a = 1;
      }
      console.log(fn.length) 
      //0 fn和new Function()一样

Если вы читали эту предыдущую статью[Полная искренность✍]Приглашаем вас заполнить несколько ям JS, подверженных ошибкам.Вы можете поставить мне лайк👍, следуйте за ним, следующее содержание является содержанием этой статьи.

[1,2,5,10].sort()

Если вы не пишете функцию обратного вызова, каков порядок?

JavaScript использует буквенно-цифровую сортировку по умолчанию. Итак, результат [1,10,2,5]

Если сортировать правильно, это должно быть [1,2,5,10] .sort ((a, b) => a-b)

"b" + "a" + +"a" + "a"

Как вы думаете, что на выходе?

Приведенное выше выражение эквивалентно 'b'+'a'+(+'a')+'a', поскольку (+'a') равно NaN, поэтому:

'b'+'a'+ (+'a')+'a' = 'b'+'a'+ "NaN"+'a'='baNaNa'

Закрытие

Это классический вопрос на собеседовании по JavaScript.

  let res = new Array()
        for(var i = 0; i < 10; i++){
            res.push(function(){
                return console.log(i)
            })
        }
        res[0]() 
        res[1]()
        res[2]()

Ожидаемый результат — 0, 1, 2, но это не так. Причина в том, что он включает"сфера", как решить?

  • [x] Используйте let вместо var для формирования области блока
  • [x] Использовать функцию привязки.
res.push(console.log.bind(null, i))

Есть и другие решения, такие как использование IIFE, формирование приватной области и так далее.

Еще одна классическая проблема закрытия

function fun(n,o) {
  console.log(o)
  return {
    fun:function(m){
      return fun(m,n);
    }
  };
}
var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);//undefined,?,?,?
var b = fun(0).fun(1).fun(2).fun(3);//undefined,?,?,?
var c = fun(0).fun(1);  c.fun(2);  c.fun(3);//undefined,?,?,?

"оставить вас думать"

неявное преобразование

var a = [0];
if (a) {
  console.log(a == true);
} else {
  console.log("wut");
}

Как вы думаете, какой ответ? Этот вопрос связан с неявным преобразованием, я сам восполню эту яму.

// ответ: ложь

"Еще раз?"

function fn() {
    return 20;
}
console.log(fn + 10); // 输出结果是多少
function fn() {
    return 20;
}
fn.toString = function() {
    return 10;
}
console.log(fn + 10);  // 输出结果是多少?
function fn() {
    return 20;
}

fn.toString = function() {
    return 10;
}

fn.valueOf = function() {
    return 5;
}

console.log(fn + 10); // 输出结果是多少?

"В конце концов, преобразование типов JS хорошо составлено"

ты действительно понимаешь операторов

[1<2<3,3<2<1]
//[false,false]
//[true,true]
//[false,true]
//[true,false]

Выберите один, оператор сравнения или оператор присваивания, который имеет более высокий приоритет?

0.1+0.2 !== 0.3 ?

Во время интервью, если вам задают этот вопрос, если ответ неправильный, считается, что интервьюер очень подозрительно относится к основам! ! !

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

Поговорив об этом, вы можете обратиться к максимальному безопасному числу, например, каково максимальное безопасное целое число JavaScript.Если оно превышает этот диапазон, как решить проблему точности?

Какую проблему решает недавно предложенный BigInt в спецификации ES, и какие подводные камни вы обнаружили в BigInt?

Как решить проблему точности?

Рекомендуется здесьNumber-PrecisionБиблиотека размером менее 1К.

arguments

  function sidEffecting(ary) {
            ary[0] = ary[2];
        }
        function bar(a, b, c) {
            c = 10
            sidEffecting(arguments);
            return a + b + c;
        }
        function demo (arg) {
            arg.name = 'new Name'
        }
        console.log(bar(2, 2, 2))

Когда дело доходит до грамматики ES6, ответ на этот вопрос определенно будет 22, но, если немного изменить вопрос, он будет более ямочным....

  function sidEffecting(ary) {
            ary[0] = ary[2];
        }
        function bar(a, b, c = 4) {
            c = 10
            sidEffecting(arguments);
            return a + b + c;
        }
        function demo (arg) {
            arg.name = 'new Name'
        }
        console.log(bar(2, 2, 2))

Какой ответ? Согласно более точному определению аргумента на MDN, см.argument

Когда функция в нестрогом режиме"имеют"Включаютостальные параметры,параметры по умолчаниюиприсваивание деструктуризации,Такargumentsзначение в объекте"Не буду"Отслеживание значения параметра (и наоборот).

Найдите это предложение, функция bar имеет параметры по умолчанию, и в нестрогом режиме, поэтому значение параметра не будет отслеживаться, естественный результат 14

"Читателям предлагается испытать"

История путаницы в браузерах

  let demo1 = {class: "Animal", name: 'sheet'};
        console.log(demo1.class)

Мошенник, это связано с браузерами, класс - это зарезервированное слово (теперь класс - это ключевое слово), ответ не имеет значения, важно стараться избегать зарезервированных слов при взятии имен атрибутов. Если вы используете его, пожалуйста, добавьте кавычки ['класс'].

"Зарезервированные слова против ключевых слов"

Насколько я понимаю лично, ключевое слово имеет особое значение и не используется как имя переменной. Например

let class = 123;

Сейчас это кажется неправильным, так на что мы должны обратить внимание?

let undefined = 123;

Таким образом, ошибка не будет сообщена. Это как-то связано с браузером. Похоже, что undefined не является ключевым словом. Так что просто на всякий случай,"Предполагается, что если вы оцениваете, является ли переменная неопределенной, попробуйте использовать void 0 === undefined"Очень вероятно, что undefined будет присвоено как переменная

"значение void 0 не определено"

["1", "2", "3"].map(parseInt)

Это должен быть часто встречающийся вопрос, очень просто понять, как использовать функцию карты и как использовать функцию parseInt.

По поводу массивов Array я писал статью ранее, из"Угловой анализ исходного кода большинства методов"

Нажмите, чтобы просмотреть его еще раз:[Галантные товары👍] От детальной работы массива js до анализа array.js в v8

map принимает два параметра, один callback, один this, то есть this указывает на при вызове функции, где callback функция обратного вызова это три параметра, одно currentValue, index, array;

parseInt принимает два параметра: строка, основание (основание)

Есть два случая, когда возвращается NaN

  • radixменьше, чем2или больше, чем36,или
  • Первый символ, не являющийся пробелом, не может быть преобразован в число.
  • Когда основание равно 0 или не определено, это особый случай, особенно асинхронный.MDN
parseInt('1', 0);
parseInt('2', 1);
parseInt('3', 2);

Если их объединить, результат, естественно, очевиден: [1,NaN,NaN]

Почему Math.min() больше, чем Math.max()?

  Math.min() < Math.max() // false

По общему замыслу должно быть верно, ведь минимальное значение должно быть меньше максимального, а реальная ситуация ложная

причина:

  • Аргументы для Math.min равны нулю или больше. Если несколько параметров легко понять, верните наименьший из параметров.
  • Если 0 аргументов или нет аргументов, возврат"Infinity".
  • И Math.max() возвращает -Infinity, когда аргументы не передаются.

Если интервьюер задает этот вопрос, э. . . .

[].concat[1,2,3]

Какой вывод? Обратите внимание, что не [].concat([1,2,3])

// [1,2,3]

// Uncaught SyntaxError: ....

// undefined

Ответ не определен, в чем причина?

  1. Первый шаг вычисляет [].concat, результатом является Array.prototype.concat

  2. На втором этапе выполняется оператор запятой, который оценивает каждый из своих операндов (слева направо) и возвращает значение последнего операнда.

    >1,2,3
    返回3
    
  3. Третий шаг выполняет операцию доступа к массиву или операцию доступа к свойству.

Таким образом, приведенный выше [].concat[1,2,3] эквивалентен Array.prototype.concat[3]

Тогда результат закономеренundefined.

[1,2,NaN,3].indexOf(NaN)

//2 or -1

  • Метод indexOf выполнит строгое суждение о равенстве
  • NaN !== NaN

Как это сделать?

let realIsNaN = value => typeof value === 'number' && isNaN(value);

Тип должен оцениваться в первую очередь, потому что преобразование строки сначала будет преобразовано в число, а ошибка преобразования будет NaN. Таким образом, он равен NaN.

isNaN('jjjj') —> true

Второй метод

let realIsNaN = value => value !== value;

Number.isFinite & isFinite

Number.isFinite('0') === isFinite('0')

Number.isFinite(0) === isFinite('0')

Каков результат печати, можно подробнее?

Number.isFinite() обнаруживает конечные значения, только по сравнению с глобальной функцией isFinite(), этот метод не заставляет нечисловой параметр преобразовываться в числовое значение, что означает, что возвращаются только значения числового типа. если есть конечноеtrue.

Естественный ответ ложный, истинный

Легко упускаемый из виду вопрос на собеседовании

function Foo() {
    getName = function () { alert (1); };
    return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}

//请写出以下输出结果:
Foo.getName();
getName();
Foo().getName();
getName();
new Foo.getName();
new Foo().getName();
new new Foo().getName();

метод проталкивания

let newList = [1,2,3].push(4)
console.log(newList.push(4))

Как вы думаете, что на выходе?

// Error

Причина в том, что Array.prototype.push() возвращает длину нового массива, поэтому 4.push(5) естественно Ошибка


Автоматическая вставка точки с запятой

function foo1()
{
 return {
     bar: "hello"
 };
}

function foo2()
{
 return
 {
     bar: "hello"
 };
}
var a=foo1();
var b=foo2();
console.log(a) //Object {bar: "hello"}
console.log(b) //underfind
//仔细看就知道了
// 会在第10行加入一个`;`

Автоматически добавит точку с запятой в строке 10, поэтому возврат не определен.


let var

function foo() {
let a = b = 0;
a++;
return a;
}
foo();
typeof a; // => ???
typeof b; // => ???

Приведенное выше пусть a = b = 0 эквивалентно window.b = 0, пусть a = b;


проблема со зрением

const length = 4;
const numbers = [];
for (var i = 0; i < length; i++);{
  numbers.push(i + 1);
}

numbers; // => ???

Единственное, что нужно знать, этоfor语句вернул;скульптура из песка

добавлять;, он будет считать, что выполнение for завершено, поэтому все указанные операторы пусты, а окончательные числа равны [5]


Получить определенный символ индекса в строке

console.log('Hello World'[4])

Квадратная скобка используется для получения символа по определенному индексу строки.Стоит отметить, что более ранняя версия IE7 использует charAt()

Таким образом, этот вопрос выводит o


!==

const name = 'TianTianUp'
console.log(!typeof name === 'string')
console.log(!typeof name === 'object')

typeof name возвращает «строку», строка «строка» является истинным значением. следовательно! typeof name возвращает логическое значение false. так

ложь === 'строка'

и false === 'object' возвращает false

(Чтобы определить значение типа, мы должны использовать !== вместо !typeof)


forEach

const nums = [1, 2, 3, 4, 5, 6];
let firstEven;
nums.forEach(n => {
  if (n % 2 ===0 ) {
    firstEven = n;
    return n;
  }
});
console.log(firstEven);

Единственное, на что следует обратить внимание, так это на то, как написан исходный код forEach.Любой, кто читал исходный код, знает, что forEach не может использовать return для завершения цикла.Иными словами, каждый раз, когда вызывается callback-функция, текущая вызывается. завершен, а не весь цикл.

Результат естественно 6


❤️ Всем спасибо

Если вы считаете этот контент полезным:

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

  2. Вы можете поделиться со мной своими мыслями в области комментариев, и вы также можете записать свой мыслительный процесс в области комментариев.

  3. Если вы считаете, что это хорошо, вы также можете прочитать предыдущие статьи:

    [«Поиск и заполнение утечек» отправит вам 18 вопросов браузерного интервью (1,6 Вт слов).

    [Галантные товары👍] От детальной работы массива js до анализа array.js в v8

    [1.2W word👍] Читы на девушку - как работает браузер (Часть 1)

    [1.1W word] Читы на девушку - как работает браузер (процесс рендеринга)

    [Предложение👍] Продолжайте с 100 ответными вопросами JS, кислыми и крутыми (всего 1,8 Вт слов + консолидация основы JS)

    9 основных операций связанного списка "алгоритмы и структуры данных"

В этой статье используетсяmdniceнабор текста