我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JavaScript数据结构常见面试问题整理

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JavaScript数据结构常见面试问题整理

1.JS有哪些数据类型有什么区别

答:JS共有八大数据类型,分别是:String、Number、Boolean、Object、Null、Undefined、Symbol、BigInt。其中Symbol(独一无二不可变)和BigInt(任意精度的数字)是ES6中新加入的数据类型。这些数据类型可以分为原始数据类型(String、Number、Boolean、Null、Undefined)和引用数据类型(Object、数组、函数等)。

**区别:**存储位置不同 原始数据类型直接存储在栈(stack)中的简单数据段,占据空间、大小固定,属于被频繁使用的数据,所以放在栈中存储;引用数据类型存储在堆中的对象,占据空间大、大小不固定,如果存储在栈中,将会影响程序运行的性能。

  • 在数据结构中,栈中数据的存取方式为先进后出。
  • 堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大小来规定。

2.数据类型检测的方式

答:JavaScript有4种方法判断变量的类型,分别是typeof、instanceof、Object.prototype.toString.call()(对象原型链判断方法)、 constructor (用于引用数据类型) 。typeof:常用于判断基本数据类型,对于引用数据类型除了function返回’function‘,其余全部返回’object’。 instanceof:主要用于区分引用数据类型,检测方法是检测的类型在当前实例的原型链上,用其检测出来的结果都是true,不太适合用于简单数据类型的检测,检测过程繁琐且对于简单数据类型检测不出来。 constructor:用于检测所有数据类型,检测方法是获取实例的构造函数判断和某个类是否相同,如果相同就说明该数据是符合那个数据类型的,这种方法不会把原型链上的其他类也加入进来,避免了原型链的干扰。 Object.prototype.toString.call():适用于所有类型的判断检测,检测方法是Object.prototype.toString.call(数据) 返回的是该数据类型的字符串。 这四种判断数据类型的方法中,各种数据类型都能检测且检测精准的就是Object.prototype.toString.call()这种方法。

加分回答 instanceof的实现原理:验证当前类的原型prototype是否会出现在实例的原型链__proto__上,只要在它的原型链上,则结果都为true。因此,instanceof 在查找的过程中会遍历左边变量的原型链,直到找到右边变量的 prototype,找到返回true,未找到返回false。 Object.prototype.toString.call()原理:Object.prototype.toString 表示一个返回对象类型的字符串,call()方法可以改变this的指向,那么把Object.prototype.toString()方法指向不同的数据类型上面,返回不同的结果

(1)typeof:返回数据的类型,但是数组、null、对象、函数,都只能返回object,所以typeof并不能区分出处理function的其他object中的几种不同类型。

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

衍生问题:为什么typeof null 是obect ?

原因是:在JS的第一个版本中,所有值都存储在32位的单元中,每个单元包含一个小的类型标签,以及当前要存储的真实数据,类型标签包括000(object)、1(int)、010(double)、100(string)、110(boolean)。而null的机器码全是0,所以被认为是object。

(2)instanceof:可以判断instanceof后面的类型是否正确,返回true / false,内部的运行机制是看能不能在原型链中找到该类型的原型。但是instanceof只能判断出引用数据类型,并且可以区分出数组、函数等,却不能判断基本数据类型。

console.log(2 instanceof Number);                    // false
console.log(true instanceof Boolean);                // false 
console.log('str' instanceof String);                // false 
console.log([] instanceof Array);                    // true
console.log(function(){} instanceof Function);       // true
console.log({} instanceof Object);                   // true

(3)constructor可以判断数据类型,还可以访问对象的构造函数。constructor可以把object分开来判断。分为(Array、Function、object)

console.log((2).constructor === Number); // true
console.log((true).constructor === Boolean); // true
console.log(('str').constructor === String); // true
console.log(([]).constructor === Array); // true
console.log((function() {}).constructor === Function); // true
console.log(({}).constructor === Object); // true

(4)Object.prototype.toString.call():使用Object对象的原型方法toString来判断数据类型

var a = Object.prototype.toString;
console.log(a.call(2));  //[object Number]
console.log(a.call(true)); //[object Boolean]
console.log(a.call('str')); //[object String]
console.log(a.call([])); //[object Array]
console.log(a.call(function(){})); //[object Function]
console.log(a.call({})); //[object Object]
console.log(a.call(undefined)); //[object Undefined]
console.log(a.call(null)); //[object Null]

3.判断是否是数组的方法

var b = new Array();
console.log(b instanceof Array); //true
console.log(Object.prototype.toString.call(b)); //[object Array]
console.log(Array.isArray(b)); //true
console.log(b.constructor===Array); //true
console.log(b.__proto__===Array.prototype); //true
console.log(Array.prototype.isPrototypeOf(b)); //true

4.null和undefined的区别

答:undefind 是全局对象的一个属性,当一个变量没有被赋值或者一个函数没有返回值或者某个对象不存在某个属性却去访问或者函数定义了形参但没有传递实参,这时候都是undefined。undefined通过typeof判断类型是’undefined’。undefined == undefined undefined === undefined 。 null代表对象的值未设置,相当于一个对象没有设置指针地址就是null。null通过typeof判断类型是’object’。null === null null == null null == undefined null !== undefined undefined 表示一个变量初始状态值,而 null 则表示一个变量被人为的设置为空对象,而不是原始状态。在实际使用过程中,不需要对一个变量显式的赋值 undefined,当需要释放一个对象时,直接赋值为 null 即可。 让一个变量为null,直接给该变量赋值为null即可。typeof null是object。

undefined == null   //true
undefined === null  //false
undefined !== null  //true

5.手写instanceof方法

function myInstanceof(left,right){
    let proto = Object.getPrototypeOf(left)
    let prototype = right.prototype;
    while(true){
        if(!proto) return false
        if(proto === prototype) return true
        proto = Object.getPrototypeOf(proto)
    }
}
console.log(myInstanceof("",Array)); //false
console.log(myInstanceof([1,2,3],Array)); //true

6.为什么0.1+0.2 !==0.3

答:首先要知道小数是如何转为二进制的,整数部分就是不断除2取余,小数部分就是乘二取整,超过1以后还是用小数部分乘,如下所示:

//不断的乘以二然后拿掉整数部分,直到积为0。
//但是结果是不可能为0的,所以是循环的
0.1 * 2 = 0.2 => 0
0.2 * 2 = 0.4 => 0
0.4 * 2 = 0.8 => 0
0.8 * 2 = 1.6 => 1
0.6 * 2 = 1.2 => 1
0.2 * 2 = 0.4 => 0

因此,0.1的二进制是0.0001 1001 1001 1001…无限循环,0.2的二进制是0.0011 0011 0011 0011…无限循环,所以0.3的二进制就是0.0100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100 1100,转换为十进制就是0.300000004,这就是精度丢失问题,所以0.1+0.2 !== 0.3。可以用toFixed(1)来解决,但也要注意,toFixed()返回的类型是String。

7.isNaN和Number.isNaN函数的区别

  • isNaN接受参数后,会尝试将这个参数转换为数值,任何不能转换的都会返回true,因此,非数字值传入也会返回true,会影响NaN的判断。
  • Number.isNaN会首先判断传入参数是否是数字,如果是数字再继续判断是否为NaN,不会进行数据类型的转换,更加准确。
console.log(isNaN(NaN)) //true
console.log(isNaN("123")); //false
console.log(isNaN("NaN")); //true
console.log(Number.isNaN(NaN)); //true
console.log(Number.isNaN("123")); //false
console.log(Number.isNaN("NaN")); //false

8.==操作符的强制类型转换规则

(1)类型相同的话就直接比较;

(2)类型不同的话,会进行类型转换;

(3)先判断是不是null 和 undefined,是的话就返回true;

(4)判断是否是string 和 number,string --> number;

(5)如果有一方是boolean,那么boolean --> number;

(6)如果一方是object,另一方是string number symbol,把object–> 原始类型。

console.log(NaN == NaN);    //false
console.log(null instanceof Object);   //false 因为null是原型链的顶端了,而instanceof是根据Object.getPrototypeof()实现的,找不到他的父类了
console.log(null == null);  //true
console.log(false == "");   //true
console.log(undefined == false);    //false

9.强制转换的规则

(1)其他值–>字符串:Null、Undefined、Boolean、Number、Symbol都是直接转换为字符串,加上双引号,对于普通对象来说,一般会用toString()转换为内部属性[[Class]]的值;

(2)其他值–>数字值:①Undefined类型的值转换为NaN,Null类型转换为0,true为1,false为0,String如果包含非数字就为NaN,否则为数字,空字符串为0,Symbol会报错;

(3)其他值–>布尔值:false值包括(undefined,null,false,+0,-0,NaN,“”),其他值都是真值。

10.Object.is()与比较操作符===和==的区别

答:==在进行判断时,如果两边类型不一致,会进行转换,转换以后再比较;===如果两边类型不一致,就不会进行强制类型转换,直接返回false;Object.is()一般情况下和三等号相同,但是-0和+0不再相等,两个NaN是相等的。

到此这篇关于JavaScript数据结构常见面试问题整理的文章就介绍到这了,更多相关JavaScript数据结构内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JavaScript数据结构常见面试问题整理

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JavaScript数据结构常见面试问题整理

在JavaScript中,数据结构是指相互之间存在一种或多种特定关系的数据元素的集合,是带有结构特性的数据元素的集合。常用的数据结构有:数组、列表、栈、队列、链表、字典、集合等等
2022-11-13

常见的Java中数据结构面试题

常见的Java中数据结构面试题?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.栈和队列的共同特点是(只允许在端点处插入和删除元素)4.栈通常采用的两种存储结构是(线性存储
2023-05-31

java常见面试题整理

面向对象的特征有哪些方面? 所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。封装是面向对象的特征之一,是对象和类概念的主要特性。 (推荐学习:java常见面试题)继承是指子类获得父类的
java常见面试题整理
2016-08-28

PHP 数据结构实现的常见问题

PHP 数据结构实现的常见问题队列问题:队列末尾入队操作慢。解决方案:使用环形缓冲区,避免数组重新分配。栈问题:栈满时压栈操作会抛出异常。解决方案:实现一个以数组为基础的栈,并在遇到容量限制时重新调整大小。优先队列问题:比较函数不一致导致
PHP 数据结构实现的常见问题
2024-05-07

常见数据库优化面试题

常见数据库面试题 一.在项目中如何定位慢查询 通过 druid 连接池的内置监控来定位慢 SQL。通过 MySQL 的慢查询日志查看慢 SQL。通过 show processlist,查看当前数据库 SQL 执行情况来定位慢 SQL。 二
2023-08-23

深入理解 PHP SPL 数据结构:解决常见问题的秘诀

PHP SPL 数据结构是解决复杂编程问题的强大工具。本文深入探讨这些数据结构,揭示它们如何简化代码并增强应用程序性能,为常见问题的解决方案提供指导。
深入理解 PHP SPL 数据结构:解决常见问题的秘诀
2024-02-16

C++中常见的数据结构问题及解决方法

C++中常见的数据结构问题及解决方法数据结构是计算机科学中最基础、最核心的概念之一。在C++编程中,我们常常需要使用各种数据结构来解决实际问题。然而,有时候我们可能会遇到一些问题,如如何初始化一个栈或者链表,如何在二叉树中进行查找等。本文将
2023-10-22

面试官:谈谈大数据采集和常见问题

离线数据采集主要包括从数据库中采集,如MySQL、Oracle、MongoDB等;从离线文件采集,如外部系统数据。

20个数据库常见面试题讲解()

20个数据库常见面试题讲解()进了互联网公司,整天也就是搬砖,等到了面试的时候,发现数据库方面,忘得一塌糊涂,抽时间整理了一些数据库方面的题。欢迎大家向我推荐你在面试过程中遇到的问题,我会把大家推荐的问题添加到下面的常用面试题清单中供大家参考。1.事务四大特性
20个数据库常见面试题讲解()
2020-05-06

大数据常见的面试题有哪些

这篇“大数据常见的面试题有哪些”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“大数据常见的面试题有哪些”文章吧。  1、hea
2023-06-02

编程热搜

目录