前端面试知识的整理

前端面试知识的整理

JavaScript

原始数据类型和复杂数据类型存储有什么区别?

原始数据类型存储在栈内存,存储的是值。

复杂数据类型存储在堆内存,存储的是地址。当我们把对象赋值给另外一个变量的时候,复制的是地址,指向同一块内存空间,当其中一个对象改变时,另一个对象也会变化。

typeof 是否正确判断类型? instanceof呢?

typeof 能够正确的判断基本数据类型,但是除了 null, typeof null输出的是object。

但是对象来说,typeof 不能正确的判断其类型, typeof 一个函数可以输出 ‘function’,而除此之外,输出的全是 object

instanceof可以准确的判断复杂数据类型,但是不能正确判断基本数据类型。

for of , for in 和 forEach,map 的区别

  1. for…of循环:具有 iterator 接口,就可以用for…of循环遍历它的成员(属性值)。for…of循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象、Generator 对象,以及字符串。对于普通的对象,for…of结构不能直接使用,会报错。
  2. for…in循环:遍历对象自身的和继承的可枚举的属性, 不能直接获取属性值。
  3. forEach: 只能遍历数组,没有返回值(或认为返回值是undefined),不修改原数组。
  4. map: 只能遍历数组,返回值是修改后的数组,不修改原数组。

解释 []==![]

==规则:

1.首先判断两者类型是否相同,如果相等,判断值是否相等.

2.如果类型不同,进行类型转换

3.判断两者是否是 null 或者是 undefined, 如果是, 返回 true .

4.判断两者类型是否为 string 和 number, 如果是, 将string 转换成 number

5.判断其中一方是否为 boolean, 如果是, 将 boolean 转为 number 再进行判断

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol , 如果是, 将 object 转为原始类型再进行判断

[]==![]为true的分析:

  1. 引用类型转换成布尔值都是true,因此 ![]是false
  2. 根据上面的比较步骤中的第五条,其中一方是 boolean,将 boolean 转为 number 再进行判断,false转换成 number,对应的值是 0.
  3. 根据上面比较步骤中的第六条,有一方是 number,那么将object也转换成Number,空数组转换成数字,对应的值是0.(空数组转换成数字,对应的值是0,如果数组中只有一个数字,那么转成number就是这个数字,其它情况,均为NaN)
  4. 0 == 0; 为true