JS面试题

本文详细介绍了JavaScript中关于空数组、数据类型判断、数组与布尔值比较、Web Worker、盒模型、数据类型、浮点数精度问题、作用域链、闭包、内存管理、错误类型、继承方式、内存泄漏、异步编程、变量声明、事件处理等多个关键概念和面试常考点,深入讲解了JavaScript的特性和使用技巧。
摘要由CSDN通过智能技术生成

js 空数组是true还是false

js空数组用于判断条件时会被转化为true

js空数组与布尔值进行比较相当于false

任意值与布尔值比较,都会将两边的值转化为Number。
如arr与false比较,false转化为0,而arr为空数组,也转化为0: 

把js空数组转化为布尔值是true

在这里插入图片描述


JavaScript是单线程还是多线程

JavaScript的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript的主要用途是与用户互动,以及操作DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript同时有两个线程,一个线程在某个DOM节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

为了利用多核CPU的计算能力,HTML5提出Web Worker标准,允许JavaScript脚本创建多个线程,但是子线程完全受主线程控制,且不得操作DOM。所以,这个新标准并没有改变JavaScript单线程的本质。


w3c盒模型和IE盒模型的区别

w3c盒模型内容部分不包括内边距和边框,IE盒模型内容部分包括内边距和边框

css3的box-sizing属性给了开发者选择盒模型解析方式的权利。W3C的盒模型方式被称为“content-box”,IE的被称为“border-box”,使用box-sizing: border-box;就是为了在设置有padding值和border值的时候不把宽度撑开。


JavaScript中什么是基本数据类型什么是引用数据类型?以及各个数据类型是如何存储的?
基本数据类型有

Number
String
Boolean
Null
Undefined
Symbol(ES6新增数据类型)
bigInt
引用数据类型统称为Object类型,细分的话有

Object
Array
Date
Function
RegExp
基本数据类型的数据直接存储在栈中;而引用数据类型的数据存储在堆中,在栈中保存数据的引用地址,这个引用地址指向的是对应的数据,以便快速查找到堆内存中的对象。


在JS中为什么0.2+0.1>0.3?

因为在JS中,浮点数是使用64位固定长度来表示的,其中的1位表示符号位,11位用来表示指数位,剩下的52位尾数位,由于只有52位表示尾数位。

0.1转为二进制是一个无限循环数0.0001100110011001100......(1100循环)

由于只能存储52位尾数位,所以会出现精度缺失,把它存到内存中再取出来转换成十进制就不是原来的0.1了,就变成了0.100000000000000005551115123126,而为什么02+0.1是因为

0.1 和 0.2 都转化成二进制后再进行运算

转成十进制正好是 0.30000000000000004


那为什么0.2+0.3=0.5呢

0.2 和0.3分别转换为二进制进行计算:在内存中,它们的尾数位都是等于52位的,而他们相加必定大于52位,而他们相加又恰巧前52位尾数都是0,截取后恰好是0.5


那既然0.1不是0.1了,为什么在console.log(0.1)的时候还是0.1呢

console.log的时候会二进制转换为十进制,十进制再会转为字符串的形式,在转换的过程中发生了取近似值,所以打印出来的是一个近似值的字符串


判断数据类型有几种方法

1. typeof

缺点:typeof null的值为Object,无法分辨是null还是Object
2. instanceof

缺点:只能判断对象是否存在于目标对象的原型链上
3. constructor

4. Object.prototype.toString.call()

一种最好的基本类型检测方式 Object.prototype.toString.call() ;它可以区分 null 、 string 、

boolean 、 number 、 undefined 、 array 、 function 、 object 、 date 、 math 数据类型。

缺点:不能细分为谁谁的实例


instanceof原理

instanceof原理实际上就是查找目标对象的原型链


为什么typeof null是Object

因为在JavaScript中,不同的对象都是使用二进制存储的,如果二进制前三位都是0的话,系统会判断为是Object类型,而null的二进制全是0,自然也就判断为Object

这个bug是初版本的JavaScript中留下的,扩展一下其他五种标识位:

000 对象
1 整型
010 双精度类型
100字符串
110布尔类型


=====有什么区别

===是严格意义上的相等,会比较两边的数据类型和值大小

==是非严格意义上的相等,

两边类型相同,比较大小

两边类型不同,根据下方表格,再进一步进行比较。

Null == Undefined ->true
String == Number ->先将String转为Number,在比较大小
Boolean == Number ->现将Boolean转为Number,在进行比较
Object == String,Number,Symbol -> Object 转化为原始类型


call、apply、bind

call()、apply()、bind() 都是用来重定义 this 这个对象的

bind 返回的是一个新的函数,你必须调用它才会被执行

call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象,第二个参数差别就来了:

call 的参数是直接放进去的,第二第三第 n 个参数全都用逗号分隔,直接放到后面

apply 的所有参数都必须放在一个数组里面传进去 

bind 除了返回是函数以外,它 的参数和 call 一样


字面量创建对象和new创建对象有什么区别,new内部都实现了什么

字面量:

  • 字面量创建对象更简单,方便阅读
  • 不需要作用域解析,速度更快
  • 不会调用 Object构造函数, 简洁且性能更好
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值