JavaScript面试题
1-10
1.JavaScript
有哪些数据类型,它们的区别
JavaScript共有八种数据类型,分别是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。
其中 Symbol 和 BigInt 是ES6 中新增的数据类型:
Symbol 代表创建后独一无二且不可变的数据类型,它主要是为了解决可能出现的全局变量冲突的问题。
BigInt 是一种数字类型的数据,它可以表示任意精度格式的整数,使用 BigInt 可以安全地存储和操作大整数,即使这个数已经超出了 Number 能够表示的安全整数范围。
这些数据可以分为原始数据类型和引用数据类型:
栈:原始数据类型(Undefined、Null、Boolean、Number、String)
堆:引用数据类型(对象、数组和函数)
2.数据类型检测的方式有哪些
1)typeof
console.log(typeof 2); // number console.log(typeof true); // boolean console.log(typeof 'str'); // string console.log(typeof []); // object console.log(typeof function(){}); // function console.log(typeof {}); // object console.log(typeof undefined); // undefined console.log(typeof null); // object其中数组、对象、null都会被判断为object,其他判断都正确。
3.null和undefined区别
首先 Undefined 和 Null 都是基本数据类型,这两个基本数据类型分别都只有一个值,就是 undefined 和 null。
undefined 代表的含义是未定义,null 代表的含义是空对象。一般变量声明了但还没有定义的时候会返回 undefined,null主要用于赋值给一些可能会返回对象的变量,作为初始化。
undefined 在 JavaScript 中不是一个保留字,这意味着可以使用 undefined 来作为一个变量名,但是这样的做法是非常危险的,它会影响对 undefined 值的判断。我们可以通过一些方法获得安全的 undefined 值,比如说 void 0。
当对这两种类型使用 typeof 进行判断时,Null 类型化会返回 “object”,这是一个历史遗留的问题。当使用双等号对两种类型的值进行比较时会返回 true,使用三个等号时会返回 false。
4.typeof null 的结果是什么,为什么
typeof null 的结果是Object。
有两种特殊数据类型:
undefined的值是 (-2)30(一个超出整数范围的数字);
null 的值是机器码 NULL 指针(null 指针的值全是 0)
那也就是说null的类型标签也是000,和Object的类型标签一样,所以会被判定为Object。
5.intanceof介绍 以及intanceof 操作符的实现原理及实现
instanceof是JavaScript中的一个操作符,用于检查一个对象是否属于某个类或构造函数的实例。它返回一个布尔值,如果对象是指定类的实例,则返回true;否则返回false。
使用语法如下:
object instanceof constructor其中,
object
是要检查的对象,constructor
是要检查的类或构造函数。instanceof操作符的实现原理如下:
首先,它会判断
constructor
是否为一个函数,如果不是函数,则会抛出一个TypeError。然后,它会检查
object
的原型链上是否存在与constructor.prototype
相等的对象。它会从object.__proto__
开始,一直沿着原型链向上查找,直到找到null为止。如果找到了与constructor.prototype
相等的对象,则返回true;否则返回false。
6.为什么0.1+0.2 ! == 0.3,如何让其相等
在开发过程中遇到类似这样的问题:
let n1 = 0.1, n2 = 0.2 console.log(n1 + n2) // 0.30000000000000004这里得到的不是想要的结果,要想等于0.3,就要把它进行转化:
(n1 + n2).toFixed(2) // 注意,toFixed为四舍五入
toFixed(num)
方法可把 Number 四舍五入为指定小数位数的数字。那为什么会出现这样的结果呢?计算机是通过二进制的方式存储数据的,所以计算机计算0.1+0.2的时候,实际上是计算的两个数的二进制的和。0.1的二进制是
0.0001100110011001100...
(1100循环),0.2的二进制是:0.00110011001100...
(1100循环),这两个数的二进制都是无限循环的数。那JavaScript是如何处理无限循环的二进制小数呢?一般我们认为数字包括整数和小数,但是在 JavaScript 中只有一种数字类型:Number,它的实现遵循IEEE 754标准,使用64位固定长度来表示,也就是标准的double双精度浮点数。在二进制科学表示法中,双精度浮点数的小数部分最多只能保留52位,再加上前面的1,其实就是保留53位有效数字,剩余的需要舍去,遵从“0舍1入”的原则。
根据这个原则,0.1和0.2的二进制数相加,再转化为十进制数就是:
0.30000000000000004
。
7.== 操作符的强制类型转换规则
对于
= =
来说,如果对比双方的类型不一样,就会进行类型转换。假如对比x
和y
是否相同,就会进行如下判断流程:
首先会判断两者类型是否相同,相同的话就比较两者的大小;
类型不相同的话,就会进行类型转换;
会先判断是否在对比
null
和undefined
,是的话就会返回true
判断两者类型是否为
string
和number
,是的话就会将字符串转换为number
8.什么是 JavaScript 中的包装类型
在 JavaScript 中,基本类型是没有属性和方法的,但是为了便于操作基本类型的值,在调用基本类型的属性或方法时 JavaScript 会在后台隐式地将基本类型的值转换为对象,如:
const a = "abc"; a.length; // 3 a.toUpperCase(); // "ABC"JavaScript
Copy
在访问
'abc'.length
时,JavaScript 将'abc'
在后台转换成String('abc')
,然后再访问其length
属性。
9.箭头函数与普通函数的区别
(1)箭头函数比普通函数更加简洁
(2)箭头函数没有自己的this
(3)箭头函数继承来的this指向永远不会改变
10.箭头函数的this指向哪里
箭头函数不同于传统JavaScript中的函数,箭头函数并没有属于自己的this,它所谓的this是捕获其所在上下文的 this 值,作为自己的 this 值,并且由于没有属于自己的this,所以是不会被new调用的,这个所谓的this也不会被改变。
11-20
11.对闭包的理解
函数 A 内部有一个函数 B,函数 B 可以访问到函数 A 中的变量,那么函数 B 就是闭包。闭包存在的意义就是让我们可以间接访问函数内部的变量