我是大帅子,今天闲来无事给大家总结⑩几道面试题,希望大家可以消化吸收,看看自己会几道
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. 创建函数的几种方式
- 声明式 function num(niu,ma){}
- 函数表达式 let num = function (niu,ma) {}
- 函数对象方式 let num = new function (niu,ma) {}
4. 创建对象的几种方式
字面量 , 原型 , Object关键字 , 构造函数
5. javaScript 中的宿主对象跟原生对象的区别
-
原生对象 : "是独立于宿主环境的 ECMAScript 实现" 提供的对象
例如 : Object , Function , Array , String , Boolean , Number .....
-
宿主对象 : 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 的区别
- null 表示这个值被声明了但是暂时还没有使用它, null 是一个空对象
- 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. 怎么判断两个对象是否相等
- 判断两个对象是否指向同一内存
- 使用 Object.getOwnPropertyNames 获取对象所有的键名组成数组
- 判断两个对象的键名数组是否相等
- 遍历键名 , 判断键值是否相等
12. 强制缓存类型转换 和 两种隐式类型转换
1. 强制
(1) 转换为字符串 toString() String()
(2)转换数字类型 Number() parseInt() parseFloat()
(3) 转换成布尔类型 Boolean()
2. 隐式
拼接字符串 + - * / % ==
13. 什么是类数组(伪数组), 如何讲伪数组转化为真实的数组
伪数组
- 具有length属性
- 按照索引方式存储数据
- 不具备数组的
pushpop等方法
伪数组 -> 真实数组
- Array.from() --ES6
- [].slice.call(eleArr) 或者 Array.prototype.slice.call(eleArr)
14. 如何遍历数组的对象
- 遍历自身可枚举的属性 Object.keys()
- 遍历自身的所有属性 Object.getOwnpropertyNames()
- 遍历可枚举的自身属性跟继承属性 for in 遍历对象的属性
15. javaScript 中的作用域,预解析与变量声明提升
作用域
- 全局作用域 : 最外层函数定义的变量拥有全局作用域 , 任何内部函数都可以访问
- 局部作用域 : 局部作用域一般只在固定的代码片段中猜可以访问到, 而对函数为外部是无法访问到的
- 块级作用域 : 凡事代码块就可以划分变量的作用域,这种作用域的规则就叫做块级作用域
预解析
- 把变量的声明提升到当前作用域的最前面,只会提升声明不会提升赋值
- 把函数的声明提升到当前作用域的最前面,只会提升声明不会提升调用
变量提升
定义变量的时候,变量的声明会被提升到作用域的最上面, 变量的赋值不会提升
16. 什么是作用域链
由子级作用域返回父级作用域找变量就叫做作用域链
17. 如何延长作用域链
- try - catch
- with语句
18. src跟href区别
src向的是外部资源位置
href 指向的是网络资源所在位置