前端Js常见的面试题

1、let、const、var 的区别

1.是否存在变量提升?
var声明的变量存在变量提升(将变量提升到当前作用域的顶部)。即变量可以在声明之前调用,值为undefined

let和const不存在变量提升。即它们所声明的变量一定要在声明后使用,否则报ReferenceError错

2.是否存在暂时性死区?
let和const存在暂时性死区。即只要块级作用域内存在 let 命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。

3.是否允许重复声明变量?
var允许重复声明变量。
let和const在同一作用域不允许重复声明变量。

2、BOM、DOM有什么区别?

(1)DOM文档对象模型(DOM,Document Object Model)是一个应用编程接口(API),用于在HTML中使用扩展的HTML。DOM将整个页面抽象为一组分层节点。
DOM通过创建表示文档的树,让开发者可以随心所欲的控制网页的内容和结构。使用DOM API可以轻松地删除、添加、替换、修改节点。
对浏览器而言,DOM就是使用ECMAScript实现的,如今已经成为JavaScript语言的一大组成部分。
言而言之,DOM提供与网页内容交互的方法和接口。

(2)BOM IE3和Netscape Navigator3提供了浏览器对象模型(BOM)API,用于支持访问和操作浏览器的窗口。使用BOM,开发者可以操控浏览器显示页面之外的部分。

3、JavaScript中代码后加不加分号;有什么区别?
  • 加分号有助于防止省略造成的问题
  • 避免输入内容不完整
  • 便于开发者通过删除空行来压缩代码(如果没有结尾的分号,只删除空行,则会导致语法错误)
  • 加分号有助于提升性性能,因为解析器会尝试在合适的位置补上分号以纠正语法错误。
4、数据类型
  • 空值(null):用于未知的值 —— 只有一个 null 值的独立类型。
  • 未定义(undefined): 用于未定义的值 —— 只有一个 undefined 值的独立类型。
  • 布尔值(boolean):用于 true 和 false。
  • 数字(number):用于任何类型的数字:整数或浮点数,在 ±(253-1) 范围内的整数。
  • 字符串(string):用于字符串:一个字符串可以包含 0 个或多个字符,所以没有单独的单字符类型。
  • 符号(symbol):用于唯一的标识符。
  • BigInt:一种数字类型,可以表示任意精度格式的整数

引用类型(复杂数据类型):引用类型的值是保存在内存中的对象。

  • 对象(Object)
    数组对象(Array)
    函数对象(Function)
    布尔对象(Boolean)
    数字对象(Number)
    字符串对象(String)
    日期对象(Date)
    正则对象(RegExp)
    错误对象(Error)
5、原始值和引用值有什么区别?
  1. 原始值大小固定,保存在栈内存中
  2. 从一个变量到另一个变量复制原始值,会创建该值得第二个副本
  3. typeof操作费可以确定值的原始类型,instanceof操作符用于确保值得引用类型
  4. 引用值是对象,存储在堆内存中
  5. 从一个变量到另一个变量复制引用值,只会复制指针,因此结果是两个变量都指向同一个对象
6、检测数据类型的常用方法
  • typeof
  • instanceof
  • constructor
  • Object.prototype.toString.call()
6.1 typeof
console.log(
  typeof 100, //"number"
  typeof undefined, //"undefined"
  typeof null, //"object"
  typeof function () {
    console.log("aaa");
  }, //"function"
  typeof new Number(100), //'object'
  typeof new String("abc"), // 'string'
  typeof new Boolean(true) //'boolean'
);

typeof 可以正常检测出:number、boolean、string、object、function、undefined、symbol、bigint…

6.2 instanceof

基本数据类型中:Number,String,Boolean。字面量值不可以用 instanceof 检测,但是构造函数创建的值可以

注意:null 和 undefined 都返回了 false,这是因为它们的类型就是自己本身,并不是 Object 创建出来它们,所以返回了 false。

console.log(
  100 instanceof Number, //false
  undefined instanceof Object, //false
  [1, 2, 3] instanceof Array, //true
  new Error() instanceof Error //true
);

6.3 constructor

constructor 是 prototype 对象上的属性,指向构造函数。根据实例对象寻找属性的顺序,若实例对象上没有实例属性或方法时,就去原型链上寻找,因此,实例对象也是能使用 constructor 属性的。可以检测出字面量方式创建的对象类型.

console.log(new Number(123).constructor);
//ƒ Number() { [native code] }

6.4 Object.prototype.toString.call()检测对象类型
const toString = Object.prototype.toString;

toString.call(123); //"[object Number]"
toString.call(undefined); //"[object Undefined]"
toString.call(null); //"[object Null]"
toString.call(/^[a-zA-Z]{5,20}$/); //"[object RegExp]"
toString.call(new Error()); //"[object Error]"

未完待续…
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值