14 02 月 2019 Memoization 是什么? 2019-02-14 回答 Memoization 是用来缓存函数调用的输出结果,以便减少后续再次调用时的运算,进而加快运算速度的一种优化技术。Memoization 在再次调用有相同输入的同一函数时将直接返回缓存的该函数的输出结果,但第一次的计算当然是必不可少的。JavaScript 对此的一个基本实现如下:constmemoize=fn=>{constcache=newMap()returnvalue=>
13 02 月 2019 命令式编程和声明式编程有什么区别? 2019-02-13 回答这两种编程可以简单的概括为:命令式编程:如何命令计算机完成声明式编程:我要完成什么声明式编程的一个常见例子是 CSS。开发人员只需要指定 CSS 的属性就可以描述出元素的样子,而不需要去关心如何让他成为这个样子。如何由你来命令浏览器完成。另一方面,命令式编程还涉及完成某些事情所需的步骤。在 JavaScript 中,两者区别如下:命令式编程 constnumbers=[1,2,3,4,5
12 02 月 2019 什么是函数式编程? 2019-02-12 回答函数式编程是一种编程范式,他使用纯函数来构建声明方式以避免状态的共享、数据的易变及一些副作用。函数式编程的核心是:同一个函数中只要输入相同,其返回值就必然相等,且不会产生任何副作用。大多数程序员认为这是软件开发的最佳方法,因为这可以减少 bug 并增加易读性。加分回答与使用命令式或面向对象编程的代码相比,函数式编程的代码更加简洁、清晰、可预测及易于测试。String.protot
11 02 月 2019 什么是事件驱动编程? 2019-02-11 回答事件驱动编程是一种涉及通过发送和接受事件来构建应用程序的范式。当程序触发事件时,他可以通过运行注册到该事件和上下文中的任意回调函数来进行响应,同时还可以将相关数据传递给响应的函数。在这种模式下如果程序没有订阅任何函数,当事件被触发时也不会因为事件被发送到"异次元空间"而抛出错误。一个常见的例子就是 DOM 元素上的事件监听,如 click 和 mouseenter,当点击或鼠标事件发生
10 02 月 2019 什么是闭包?请给出一个有用的示例 2019-02-10 回答闭包是一个定义在其他函数内部的函数,他由函数及创建该函数的词法环境组合而成,这个环境包含了这个闭包创建时所能访问的所有局部变量。闭包可以访问三种作用域中的变量:自身函数内声明的变量父函数作用域中的变量全局中声明的变量在 JavaScript 中所有函数都是闭包的,因为他们都可以访问外部作用域,但是大部分函数都没有充分利用闭包的优势:状态持久化。因此闭包有时也被称为一个有状态的函数
09 02 月 2019 什么是大 O 符号? 2019-02-09 回答大 O 符号在计算机科学中用来描述算法的时间复杂度。执行速度快且复杂性低的算法视为优秀的算法。算法的运行次数并不是每次都相同,大部分取决于所提供的数据。在某些情况下,他们执行的很快,但某些情况下,他们却执行的很慢(哪怕他们的数据是一样多)。以下示例中,我们假设基准时间为:1element=1msO(1)arr[arr.length-1]//1000elements=1ms 时间复
08 02 月 2019 `var`、`let`、`const` 和没有关键字的声明有什么区别? 2019-02-08 回答无关键字在变量赋值之前如果没有关键字的话,则会把变量分配给全局变量或覆盖已经声明的变量。在非严格模式下,如果变量还没有被声明的话,他将会把变量做为全局对象(浏览器中的 window)的一个属性。在严格模式下,他将抛出异常以防止创建不需要的全局变量。varvar 是 ES2015 以前声明变量的默认语句。他在函数作用域内创建的变量可以在该作用域中被重新赋值和重新声明。但是,由于缺少块作
08 02 月 2019 什么是 JavaScript 数据类型? 2019-02-07 回答最新的 ECMAScript 标准定义了 7 种数据类型,其中含有 Boolean、Null、Undefined、Number、String 和 Symbol6 种原始类型和 Object 非原始类型。加分回答 Array、Date 和 function 都是 object 类型。Symbol 是 ES6 中新引入的原始数据类型,Symbol()可创建独一无二的值。函数在 JavaScript 中具有可调用能力的对象
06 02 月 2019 typeof 2019-02-06 提问以下代码的执行结果是什么?typeoftypeof0 回答执行结果为 stringtypeof0 返回字符串 number,因此 typeof'number'的结果为 string。加分回答 typeof 可能的返回值类型结果 undefinedundefinednullobjectbooleanbooleannumbernumberstringstringSymbol()symbol 函数 fu
05 02 月 2019 JavaScript 中的短路计算是什么? 2019-02-05 回答由于逻辑表达式的运算顺序是从左到右,并且他可以提前结束。使用这一规则便可进行短路计算。true||false 以上使用逻辑或的示例中,由于表达式的计算结果为 true,JavaScript 并不会计算执行第二个操作 false。这就是短路计算。这也适用于逻辑与 false&&true 在逻辑运算过程中如果有一个表达式执行抛出异常,程序也不会受到影响,如:true||nonexistent
05 02 月 2019 在 JavaScript 中同步和异步代码有什么区别? 2019-02-04 回答同步意味着每一个操作必须等待前一个操作完成后才能执行。异步意味着操作不需要等待其他操作完成后才开始执行。在 JavaScript 中,由于单线程的特性导致所有代码都是同步的。但是,有些异步操作(例如:XMLHttpRequest 或 setTimeout)并不是由主线程进行处理的,他们由本机代码(浏览器 API)所控制,并不属于程序的一部分。但程序中被执行的回调部分依旧是同步的。加分回
03 02 月 2019 JavaScript 是否需要分号? 2019-02-03 回答有时候是不需要的,有时候是需要的。这主要取决于 JavaScript 的自动插入分号的机制,解释器会在大多数语句后自动添加分号。也就是说在大多数情况下,我们是不需要分号的。但是,在某些情况下我们是需要分号的。通常块元素开头是不需要分号的,但是下面代码片断就需要分号:以[开头的行 constpreviousLine=3;[1,2,previousLine].map(n=>n*2)以(
03 02 月 2019 ASI (automatic semicolon insertion) - 自动插入分号 2019-02-02 题目执行以下函数将输入什么?functiongreet(){return{message:"hello"}}回答执行 greet()将输出 undefined。因为 JavaScript 的 ASI(automaticsemicoloninsertion),即自动插入分号会使编译器在语法分析时在 return 关键字后放一个分号,所以在不产生错误的情况下,他将输出 undefined。加分回答在
03 02 月 2019 原始值和引用值的比较 2019-02-01 题目以下代码将输入什么?consta=[1,2,3]constb=[1,2,3]constc="1,2,3"console.log(a==c)console.log(a==b)回答第一个 console.log 输出为 true,因为 JavaScript 编译器在两个等号时会执行类型转换,a 将进行 a.toString()转换为"1,2,3",所以 a 和 c 相等。第二个 console.log 输
31 01 月 2019 原型继承和经典继承有什么区别? 2019-01-31 回答在原型继承中,对象实例直接从其他对象继承。通常使用工厂模式或 Object.create()来创建对象实例。在经典继承中,对象实例从类中继承他们的属性和函数。通常使用构造函数和 new 关键字来创建对象实例。加分回答代码中原型链过长时,应将其分解,以避免出现性能问题。原生原型不应该被扩展,除非为了与新的 JavaScript 特性兼容。在 ES6 中引入的 class 关键字只是语法糖,他仍然
30 01 月 2019 什么是 Promises? 2019-01-30 回答 Promise 对象在异步操作后可对其完成或失败进行回调,并展示其结果值。以下代码片断是一个 Promise 的示例:100ms 后使用标准输出流打印出'result'字符串。此外请注意 catch,他可以用于错误处理。Promise 是链式的。newPromise((resolve,reject)=>{setTimeout(()=>{resolve("result")},100)}).
29 01 月 2019 JavaScript 通过值还是引用传递? 2019-01-29 回答 JavaScript 是通过值进行传递的。然而对于对象而言,值是对象的引用。加分回答在值传递中,传递给函数的参数是函数被调用时所传实参的拷贝。在传值调用中实际参数被求值,其值被绑定到函数中对应的变量上(通常是把值复制到新内存区域)。在引用传递中,传递给函数的是他的实际参数的隐式引用而不是实参的拷贝。通常函数能够修改这些参数(比如赋值),而且改变对于调用者是可见的。返回总目录每天
29 01 月 2019 列举几种创建对象的方法,并说明每种方法的使用场景 2019-01-28 回答对象字面量通常用于存储一次性数据。constperson={name:"John",age:50,birthday(){this.age++}}person.birthday()console.log(person.age)//51 构造函数通常用于为一个对象创建多个实例的场景,每个实例都不会受到该对象的其他实例的影响,他们有自己独立的数据。new 关键字必须位于构造函数之前,否
27 01 月 2019 参数和 arguments 有什么区别 2019-01-27 回答参数是函数定义时的变量名,而 arguments 的值是函数调用时赋予的。functionmyFunction(parameter1,parameter2){console.log(arguments[0])//"argument1"}myFunction("argument1","argument2")加分回答 arguments 是一个类似数组的对象,他包含了函数调用时参数的有关
26 01 月 2019 `null` 和 `undefined` 有什么区别? 2019-01-26 回答在 JavaScript 中有两个值表示无——undefined 和 null。他们之间根本的区别在于 null 是显式的,而 undefined 是隐式的。当一个属性不存在或一个变量没有被赋值时,他们的值为 undefined。把 null 赋给一个变量时,就显式的表明这个变量“无值”。实际上,当明确知道没有对象或不应该有值时就使用 null,否则就使用 undefined。加分回答 typeof 结果