`null` 和 `undefined` 有什么区别?

2019-01-26 回答在 JavaScript 中有两个值表示无——undefined 和 null。他们之间根本的区别在于 null 是显式的,而 undefined 是隐式的。当一个属性不存在或一个变量没有被赋值时,他们的值为 undefined。把 null 赋给一个变量时,就显式的表明这个变量“无值”。实际上,当明确知道没有对象或不应该有值时就使用 null,否则就使用 undefined。加分回答 typeof 结果

词法作用域和动态作用域的区别?

2019-01-23 回答词法作用域指的是使用函数位置来确定变量值。于此相对的是动态作用域,他使用函数调用的位置来确定变量值。加分回答词法作用语也被成为静态作用域。在闭包中,JavaScript 依旧遵循词法作用域。大多数语言都使用词法范围,因为这样的源代码更加容易理解。JavaScript 实际上没有动态作用域,但 this 机制却和动态作用域类似:关注点都在于函数是如何被调用的。下列代码中,使用词法作用域

提升在 JavaScript 中是如何工作的?

2019-01-20 回答提升是 JavaScript 的一种机制,在编译阶段任意位置的变量和函数声明都会被放入内存中。也就是说不论函数和变量在何处被声明,他们的作用域是全局的还是局部的,他们的声明都会移动到作用域的顶部。这里需要注意的是,他们的初始化并不会被提升。因此如下等同的两段代码片断都将输出 undefinedconsole.log(hoist)//undefinedvarhoist="value"

数组方法 `map()` 和 `forEach()` 有什么区别?

2019-01-18 回答这两种方法都是对数组中的元素进行迭代。map()通过每个元素的回调函数将其映射到新的元素上,最终返回一个新的数组。forEach()虽然也为每一个元素准备了回调函数,但却不返回新的数组。forEach()在每一次迭代的使用中都会产生副作用,因此 map()是编程技术中常用的方法。加分回答如果你需要迭代一个数组,使其本身发生变化且不需要返回一个新数组时,可以使用 forEach()

`0.1 + 0.2 === 0.3` 的计算结果是什么?

2019-01-17 回答他的计算结果为 false,因为 JavaScript 中的 Math 遵循 IEEE754 标准使用了 64 位的浮点数。简言之:计算机使用二进制来存储小数,而大部分小数转换成二进制后都是无限循环的值,因此需要进行取舍,这样一来在进行十进制计算时就会导致精度丢失。0.1+0.2//0.30000000000000004 要解决精度问题,可以通过以下函数对误差进行忽略:constapproxEq

JavaScript 中的真值和假值是什么?

2019-01-15 回答一个值是真值(truthy)还是假值(falsy)具体取决于他在布尔上下文中的计算方式。假值意味着布尔上下文中转换后为假的值,真值意味着布尔上下文中转换后为真的值。本质上,当他们在执行某些操作时他们就会被强制转换为 true 或 false。JavaScript 中有以下 6 个假值:falseundefinednull"":空字符串 NaN0:包含-0 和 +0 除上面以外的其他所有值都被认为

JavaScript 的表达式和语句有什么区别?

2019-01-14 回答 JavaScript 有两种主要的语法:表达式和语句。还有一种是表达式语句,即在语句中写入表达式。可表述为:表达式:产生一个值语句:执行一个操作表达式语句:产生一个值并执行一个操作一般的经验法则:如果他有输出值或者可以把他赋值给一个变量,那么他就是一个表达式。否则就是一个声明。语句 letx=0functiondeclaration(){}if(true){}语句作为指令可以显示

介绍事件委托及其优点,并说明如何使用?

2019-01-13 回答事件委托是将事件委托给单个共同祖先的技术,这和事件冒泡相关。事件能在 DOM 树上进行冒泡是由于每一个祖先元素依次向上直至根节点所执行的回调都可能被监听到。DOM 事件提供了关于元素的有用信息:通过 Event.target 可以获取触发事件的元素。这允许父元素像目标元素监听事件一样去处理事件,而不是去监听处理父元素的所有子元素或单独处理父元素本身。事件委托有如下优点:不仅能提高性能,

JavaScript 中如何对比两个对象?

2019-01-11 回答使用==或===对两个不同却具有相同属性及属性值的对象进行比较,他们的结果却不会相等。这是因为等号比较的是他们的引用(内存地址),而不是基本类型。为了测试两个对象在结构上是否相等,需要一个辅助函数。他将遍历每个对象的所有属性,然后测试他们是否具有相同的值,嵌套对象也需如此。当然,也可以使用参数来控制是否对原型链进行比较。注意:此代码只对普通对象、数组、函数、日期和基本类型的数

如何克隆一个 JavaScript 对象?

2019-01-10 回答使用扩展运算符...可将对象自身的枚举属性复制到新对象中。但这只能进行浅拷贝,如:constobj={a:1,b:2}constshallowClone={...obj}使用这种技术将会忽略原型链。此外,嵌套对象并不会被克隆,只是复制了他们的引用,因此浅拷贝后嵌套对象和原始对象仍然指向同一个对象。加分回答克隆还可以使用以下几种方法:JSON.parse(JSON.string

请举例说明什么是回调?

2019-01-09 回答回调函数作为实参传入另一个函数内,当某种事件被触发或某些任务被完成时会在外部函数内被调用,通常用于异步编程。由于回调函数会被后来的代码所调用,因此在初始化的时候应注意先声明但不调用。当特定的事件发生时,事件监听器的异步回调才会被执行。如:document.addEventListener("click",()=>{console.log("Theuserclickedonth