2023最新模块化前端面试题汇总(解答)

本文详细介绍了前端面试中关于模块化的常见问题,包括数据类型的分类、判断方法、深拷贝与浅拷贝的差异、JavaScript函数执行顺序、垃圾回收与内存管理、Vue面试题等核心知识点。深入讲解了JavaScript中的数据类型、作用域、闭包、内存管理,以及Vue的底层实现原理,是前端开发者面试复习的重要参考资料。
摘要由CSDN通过智能技术生成
  • JS面试:

与数据类型有关的内容

1、数据类型的分类

  • 基本数据类型

Number、String、Boolean、Null、Undefined、Symbol、bigInt

数据保存在栈中

  • 引用数据类型

object、Array、Date、Function、RegExp

数据保存在堆中,object对象在栈里存储的是地址,地址指向堆中存储的数据

2、判断数据类型的方法

js数据类型的判断主要有三种方法: typeof ,instanceof,Object.prototype.toString.call()

1).typeof(有局限性,主要用来判断基本数据类型)

  • 判断一个字段是否存在:if(typeof a != 'undefined'),而不是使用if(a),因为如果a不存在的话,这样写会报错
  • typeof 无法判断 null,array,object,因为返回的都是object
  • typeof它返回值是一个字符串,该字符串说明运算数的类型。返回结果只有以下几种:number,string,boolean,object,undfined,function
  • typeof console.log() //'undefined'
  • typeof console.log   //'function'
  • typeof(NaN)//'number'
console.log(typeof(1));  //number
console.log(typeof(NaN));  //number
console.log(typeof("123"));  //string
console.log(typeof("123" + 12));  //string
console.log(typeof("123" + Date));  //string
console.log(typeof(true));  //boolean
console.log(typeof(window));  //object
console.log(typeof(document));  //object
console.log(typeof(null));  //object
console.log(typeof([8]));  //object
console.log(typeof({a:1}));  //object
console.log(typeof(Date));  //function
console.log(typeof(sss));  //undefined
console.log(typeof(undefined));  //undefined

2).instanceof(是用来 判断数据是否是某个对象的实例,返回一个布尔值,主要用来判断引用数据类型,所有引用类型的祖先都是 Object 对象

// 判断 p 是否为 Person 的实例
function Person(name) {
 this.name = name
}
const p = new Person('sunshine')
p instanceof Person // true

// 这里的 p 是 Person 函数构造出来的,所以顺着 p 的原型链可以找到Object的构造函数
p.__proto__ === Person.prototype // true
p.__proto__.__proto__ === Object.prototype // true
let arr = [1,2,3]
console.log(Object.prototype.toString.call(arr) === '[object Array]') // true
console.log(arr instanceof Array) // true
console.log(arr instanceof Object) // true
let fn = function(){}
console.log(fn instanceof Object)  // true

3). Object.prototype.toString.call()   (对基本数据类型和引用数据类型都管用,无法区分自定义对象类型)

  • 判断基本类型
Object.prototype.toString.call('stjd')
//"[object String]"
 
Object.prototype.toString.call(1)
//"[object Number]"
 
Object.prototype.toString.call(true)
//"[object Boolean]"

Object.prototype.toString.call(null)
//"[object Null]"

Object.prototype.toString.call(undefined)
//"[object Undefined]"
  • 判断引用数据类型
Object.prototype.toString.call(function(){})  //这个方法就建立在js任何类型皆可视为对象**
// "[object Function]"
var date = new Date();
Object.prototype.toString.call(date);
//”[object Date]”
Object.prototype.toString.call([2])
//"[object Array]"
Object.prototype.toString.call({q:8})
//"[object Object]"
var reg = /[hbc]at/gi;
Object.prototype.toString.call(reg); 
// "[object RegExp]"
function Person(name, age) {
    this.name = name;
    this.age = age;
}
var person = new Person("Rose", 18);
Object.prototype.toString.call(person); 
//”[object Object]”
  • 自定义封装
// 判断数据类型的函数
function getType(data) {
  return Object.prototype.toString.call(data).slice(8, -1);
}

// 使用
  if(this.getType(json) == 'Object'){
   console.log('Object类型')
  }else if (this.getType(json) == 'Array'){
   console.log('Array类型')
  } 

4).其他实用性也很强的方法:

  • js中的isArray()是Array类型的一个静态方法,使用它可以判断一个值是否为数组。返回一个布尔值。
var arr = [1,2,3]
console.log(Array.isArray(arr))  //true

  • 等号判断(===)

=:赋值运算符

==:判断是否相等:忽略了类型进行值的比较。

===:判断是否相等:先进行值的比较,如果值相等,再去比较类型。即带有类型的值的比较。

5).扩展

  • null 和 undefined 的区别?【小tips:

    JavaScript中的undefined和null都表示没有值。

    undefined表示一个变量已经声明但是没有被赋值,或者一个对象属性不存在。

    null表示一个变量或者对象属性被明确地赋值为null,表示它没有值。

    在JavaScript中,undefined和null都被认为是false值,也就是说它们在布尔上下文中会被转换为false。】

相同:

在 if 语句中 null 和 undefined 都会转为false两者用相等运算符比较也是相等

首先 Undefined 和 Null 都是基本数据类型,这两个基本数据类型分别都只有一个值,就是 undefined 和 null。

不同:

undefined 代表的含义是未定义,

定义了形参(在定义函数阶段定义的参数, 叫形式参数, 简称形参(相当于变量名)),没有传实参(再调用函数的阶段传入的值, 叫实际参数, 简称实参(相当于变量值)),显示undefined

一般变量声明了但还没有定义的时候会返回 undefined

对象属性名不存在时,显示undefined

函数没有写返回值,即没有写return,拿到的是undefined

null 代表的含义是空对象。也作为对象原型链的终点

null 主要用于赋值给一些可能会返回对象的变量,作为初始化。

  • js数据类型转换

在JavaScript中类型转换有三种情况:

转换为数字(调用Number(),parseInt(),parseFloat()方法)

转换为字符串(调用.toString()或String()方法)

转换为布尔值(调用Boolean()方法) 还有隐式转换 注意:null、undefined没有.toString方法
 

​
转换为数字
Number():可以把任意值转换成数字,如果要转换的字符串中有不是数字的值,则会返回NaN
​
Number('1')   // 1
Number(true)  // 1
Number('123s') // NaN
Number({})  //NaN
​
​
parseInt(string,radix):解析一个字符串并返回指定基数的十进制整数,radix是2-36之间的整数,表示被解析字符串的基数。
parseInt('2') //2
parseInt('2',10) // 2
parseInt('2',2)  // NaN
parseInt('a123')  // NaN  如果第一个字符不是数字或者符号就返回NaN
parseInt('123a')  // 123
​
​
parseFloat(string):解析一个参数并返回一个浮点数
​
parseFloat('123a')
//123
parseFloat('123a.01')
//123
parseFloat('123.01')
//123.01
parseFloat('123.01.1')
//123.01
​
隐式转换
let str = '123'
let res = str - 1 //122
str+1 // '1231'
+str+1 // 124
​
转换为字符串
.toString()  ⚠️注意:null,undefined不能调用
​
Number(123).toString()
//'123'
[].toString()
//''
true.toString()
//'true'
​
​
String() 都能转
String(123)
//'123'
String(true)
//'true'
String([])
//''
String(null)
//'null'
String(undefined)
//'undefined'
String({})
//'[object Object]'
​
​
隐式转换:当+两边有一个是字符串,另一个是其它类型时,会先把其它类型转换为字符串再进行字符串拼接,返回字符串
​
let a = 1
a+'' // '1'
转换为布尔值
0, ''(空字符串), null, undefined, NaN会转成false,其它都是true
Boolean()
Boolean('') //false
Boolean(0) //false
Boolean(1) //true
Boolean(null) //false
Boolean(undefined) //false
Boolean(NaN) //false
Boolean({}) //true
Boolean([]) //true
​
条件语句
​
let a
if(a) {
  //...   //这里a为undefined,会转为false,所以该条件语句内部不会执行
}
​
隐式转换 !!
​
let str = '111'
console.log(!!str) // true
 
 
{}和[]的valueOf和toString的返回结果?
valueOf:返回指定对象的原始值
​
对象                  返回值 
Array               返回数组对象本身。
Boolean             布尔值。
Date                存储的时间是从 1970 年 1 月 1 日午夜开始计的毫秒数 UTC。
Function            函数本身。
Number              数字值。
Object              对象本身。这是默认情况。
String              字符串值。
                    Math 和 Error 对象没有 valueOf 方法。
​
toString:返回一个表示对象的字符串。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,
toString() 返回 "[object type]",其中 type 是对象的类型。
​
({}).valueOf()   //{}
({}).toString()  //'[object Object]'
[].valueOf()    //[]
[].toString()   //''
​

const a = {};

const b = JSON.parse(JSON.stringfy(a)); //深拷贝

JSON.stringify 方法将某个对象转换成 JSON 字符串形式

JSON.parse()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值