js基础的面试题

163 阅读5分钟

我是大帅子,今天闲来无事给大家总结⑩几道面试题,希望大家可以消化吸收,看看自己会几道


image.png

1. 基本数据类型

Number , String , Boolean , null , undefined , object , array , function

2. 判断数据类型的返回值的方法

(1) typeof()

typeof(要检测的数据) 返回值是数据类型 , 但是不能检测 null , null的返回值是object

(2) instanceof ()

要检测的数据 instanceof 数据类型 , 返回的值是Boolean值

(3) Object.prototype.toString.call()

Object.prototype.toString.call(要检测的数据) 这种检测方式又叫做万能检测方式 , 返回值是一个数组,第一个值是Object,第二个值是检测的数据类型

3. 创建函数的几种方式

  1. 声明式 function num(niu,ma){}
  2. 函数表达式 let num = function (niu,ma) {}
  3. 函数对象方式 let num = new function (niu,ma) {}

4. 创建对象的几种方式

字面量 , 原型 , Object关键字 , 构造函数

5. javaScript 中的宿主对象跟原生对象的区别

  1. 原生对象 : "是独立于宿主环境的 ECMAScript 实现" 提供的对象

    例如 : Object , Function , Array , String , Boolean , Number .....

  2. 宿主对象 : BOM 和 DOM

6. javaScript 内置的常用对象有哪些 ? 还有他们的常见的方法

Array 数组
`length` 属性 动态获取数组的长度
`join()` 将一个数组转成字符串  , 返回一个字符串
`reverse()` 反转
`pop()` 删除数组的最后一个元素 , 返回的是删除的那个值
`push()` 向数组的尾部添加元素 , 返回值是添加完的新数组的长度
`shift()` 删除数组的第一个元素, 返回的是删除的那个值
`unshift()` 向数组的头部添加元素 , 返回值是添加完的新数组长度
`concat()` 连接数组
`slice`(第一个元素的索引,结束元素的索引) 返回数组的一部分
`sort()` 对元素进行排序 按照abc,123
`splice`(从那个元素下标开始,删除的个数,替换或添加的元素) 插入,删除或者替换数组的元素 , 返回值是被删除的元素
`toString()` 将数组转化为一个字符串
`forEach` 是没有返回值的;
`find` 的返回值是找符合条件的元素,找到符合条件的就立即返回;
`findIndex`  的返回值是符合条件的下标,找到符合条件的就立即返回;
`map` 是找到符合条件的元素,可以就给他添一点东西,返回出去;
`set` 是去重的
`reduce` 多数用来求和,还可用来数组扁平化等一些;
`some` 是找到有没有符合条件的元素,如果有一个就返回true,都没有就返回fasle
`every` 每个元素都符合条件才会返回true,否则就返回fasle
`filter` 过滤符合条件的元素, 返回值是符合条件的元素组成的新数组
string 字符串对象

`length` 获取字符串的长度
`toLowerCase()` 将元素中的字母全都小写
`toUpperCase()` 将元素中的字母全都大写
`split()` 将字符串转化为一个数组
`concat()` 可以连接字符串

其中还有 Boolean , Function , Math , Number , Object , RegExp这种都不怎么常用,想要用的话我们可以直接上百度

7. === 跟 == 的区别

=== : 比较值又比较类型

== : 比较值

这边可以扩展一个点 , 0.1 + 0.2 == 0.3 ? 这里是不相等的 , 因为会有精度丢失

8. null 跟 undefined 的区别
  1. null 表示这个值被声明了但是暂时还没有使用它, null 是一个空对象
  2. undefined 表示不存在这个值 , 声明了但是没有赋值
9 . 如何区分数组跟对象
1. Array.isArray

Array.isArray([])   // true
Array.isArray({})   // fasle
2. instanceof

[] instanceof Array     //true
{} instanceof Array     //false
3. constructor

{}.constructor      //Object
[].constructor      //Array
4. Object.prototype.toString.call()

Object.prototype.toString.call([])   //['Object,Array']
Object.prototype.toString.call({})   //['Object,Array']
10. 多维数组降维的几种方法
1.   let arr = [1,2,3,4,5,6,7,8,[1,2,3,5,[1,3,5,6,7]]]
        arr += ''
        arr = arr.split(',')
        console.log(arr)
    这种是我认为最简单的方法
2.   let arr = [1,2,3,4,5,6,7,8,[1,2,3,5,[1,3,5,6,7]]]
    arr.flat()  //每次都会降维一层
11. 怎么判断两个对象是否相等
  1. 判断两个对象是否指向同一内存
  2. 使用 Object.getOwnPropertyNames 获取对象所有的键名组成数组
  3. 判断两个对象的键名数组是否相等
  4. 遍历键名 , 判断键值是否相等
12. 强制缓存类型转换 和 两种隐式类型转换
1. 强制

(1) 转换为字符串 toString() String()

(2)转换数字类型 Number() parseInt() parseFloat()

(3) 转换成布尔类型 Boolean()

2. 隐式

拼接字符串 + - * / % ==

13. 什么是类数组(伪数组), 如何讲伪数组转化为真实的数组
伪数组
  1. 具有length属性
  2. 按照索引方式存储数据
  3. 不具备数组的push pop 等方法
伪数组 -> 真实数组
  1. Array.from() --ES6
  2. [].slice.call(eleArr) 或者 Array.prototype.slice.call(eleArr)
14. 如何遍历数组的对象
  1. 遍历自身可枚举的属性 Object.keys()
  2. 遍历自身的所有属性 Object.getOwnpropertyNames()
  3. 遍历可枚举的自身属性跟继承属性 for in 遍历对象的属性
15. javaScript 中的作用域,预解析与变量声明提升
作用域
  1. 全局作用域 : 最外层函数定义的变量拥有全局作用域 , 任何内部函数都可以访问
  1. 局部作用域 : 局部作用域一般只在固定的代码片段中猜可以访问到, 而对函数为外部是无法访问到的
  2. 块级作用域 : 凡事代码块就可以划分变量的作用域,这种作用域的规则就叫做块级作用域
预解析
  1. 把变量的声明提升到当前作用域的最前面,只会提升声明不会提升赋值
  1. 把函数的声明提升到当前作用域的最前面,只会提升声明不会提升调用
变量提升

定义变量的时候,变量的声明会被提升到作用域的最上面, 变量的赋值不会提升

16. 什么是作用域链

由子级作用域返回父级作用域找变量就叫做作用域链

17. 如何延长作用域链
  1. try - catch
  2. with语句
18. src跟href区别

src向的是外部资源位置

href 指向的是网络资源所在位置