iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript数据结构常见面试问题整理
  • 605
分享到

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

JavaScript数据结构JavaScript数据结构面试问题 2022-11-13 14:11:25 605人浏览 八月长安
摘要

目录1.js有哪些数据类型有什么区别2.数据类型检测的方式3.判断是否是数组的方法4.null和undefined的区别5.手写instanceof方法6.为什么0.1+0.2 !=

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数据结构内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: JavaScript数据结构常见面试问题整理

本文链接: https://www.lsjlt.com/news/171805.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • JavaScript数据结构常见面试问题整理
    目录1.JS有哪些数据类型有什么区别2.数据类型检测的方式3.判断是否是数组的方法4.null和undefined的区别5.手写instanceof方法6.为什么0.1+0.2 !=...
    99+
    2022-11-13
    JavaScript 数据结构 JavaScript 数据结构面试问题
  • 常见的Java中数据结构面试题
    常见的Java中数据结构面试题?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。栈和队列的共同特点是(只允许在端点处插入和删除元素)4.栈通常采用的两种存储结构是(线性存储结构...
    99+
    2023-05-31
    java 数据结构 ava
  • R语言常见面试题整理
    尊敬的读者,这些R语言面试题是专门设计的,以便您应对在R语言相关面试中可能会被问到的问题。 根据我的经验,良好的面试官几乎不打算在你的面试中问任何特定的问题,通常都是以如下的问题为开...
    99+
    2024-04-02
  • PHP 数据结构实现的常见问题
    PHP 数据结构实现的常见问题 队列 问题:队列末尾入队操作慢。 解决方案:使用环形缓冲区,避免数组重新分配。 栈 问题:栈满时压栈操作会抛出异常。 解决方案:实现一个以...
    99+
    2024-05-07
    php 数据结构 社交网络
  • 分享JavaScript常见面试题
    这篇文章主要讲解了“分享JavaScript常见面试题”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“分享JavaScript常见面试题”吧!一、请解释 Ja...
    99+
    2024-04-02
  • Vista常见问题整理
    1、以下问题在Windows Vista Enterprise版本中测试通过。 2、首次问题整理发布。 1. 如何关闭UAC? 控制面板→用户帐户→打开或关闭用户账户控制→取消使用用户账户控...
    99+
    2023-05-23
    整理 常见问题 如何 设置 选中 菜单
  • 常见的Java面试问题
    JVMJava虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。什么是字节码采用字节码的好处是什么在 Java 中,J...
    99+
    2023-06-03
  • java面试常见问题---ConcurrentHashMap
    1、请你描述一下ConcurrentHashMap存储数据结构是什么样子呢? ConcurrentHashMap 内部的 map 结构和 HashMap 是一致的,都是由:...
    99+
    2024-04-02
  • 常见数据库优化面试题
    常见数据库面试题 一.在项目中如何定位慢查询 通过 druid 连接池的内置监控来定位慢 SQL。通过 MySQL 的慢查询日志查看慢 SQL。通过 show processlist,查看当前数据库 SQL 执行情况来定位慢 SQL。 二...
    99+
    2023-08-23
    数据库 mysql sql
  • Android中关于Binder常见面试问题小结
    目录1.简单介绍下binder2.Binder的定向制导,如何找到目标Binder,唤起进程或者线程3.Binder中的红黑树,为什么会有两棵binder_ref红黑树4.Binde...
    99+
    2024-04-02
  • JavaScript文件上传的常见问题整理
    文件上传:<input type="file" /> (IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持。) 1、允许上传文件数量 允许选择...
    99+
    2024-04-02
  • Java泛型常见面试题(面试必问)
    目录1、泛型的基础概念1.1 为什么需要泛型1.2 什么是泛型2、泛型的定义和使用2.1 泛型类\泛型接口2.2 泛型方法2.3 泛型类的继承2.4 类型通配符?及其上下限1...
    99+
    2024-04-02
  • Golang协程常见面试题小结
    目录交替打印奇数和偶数方法一:使用无缓冲的channel进行协程间通信方法二:使用有缓冲的channelN个协程打印1到maxVal交替打印字符和数字交替打印字符串方法一使用无缓冲的...
    99+
    2023-02-28
    Golang协程面试题 Golang协程
  • Redis中一些最常见的面试问题总结
    前言 经过长达一周的奔波和面试,电话面试,回首今天终于成功的入职了,总共面试了大概10家公司,包括阿里,京东,IBM等等,京东技术过了,学历因为非统招就被pass了,阿里面了2次电话面试就没下文了,估计是我...
    99+
    2024-04-02
  • Javascript中有哪些常见的数据结构
    本篇文章为大家展示了Javascript中有哪些常见的数据结构,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。1.Stack(栈)堆栈遵循LIFO(后进先出)的原则。...
    99+
    2024-04-02
  • 单片机面试常见问题
    1、中断的概念?简述中断的过程 (1)中断:指CPU在正常执行程序的过程中,由于内部/外部事件的触发或由程序的预先安排,引起CPU暂时中断当前正在运行的程序,转而执行为内部/外部事件或程序预先安排的事件的服务子程序,待中断服务子程序执行完毕...
    99+
    2023-09-04
    单片机 stm32 嵌入式硬件
  • JavaScript数据处理的常见问题有哪些
    这篇文章主要介绍“JavaScript数据处理的常见问题有哪些”,在日常操作中,相信很多人在JavaScript数据处理的常见问题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • 常见的JavaScript面试题有哪些
    这篇文章主要介绍常见的JavaScript面试题有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!JavaScript可以做什么1.可以使网页具有交互性,例如响应用户点击,给用户提供更好的体验。2.可以处理表单,检...
    99+
    2023-06-14
  • 有哪些常见的JavaScript面试题
    今天就跟大家聊聊有关有哪些常见的JavaScript面试题,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.this指向1.谁调用指向谁例:  function&...
    99+
    2023-06-15
  • C++中常见的数据结构问题及解决方法
    C++中常见的数据结构问题及解决方法数据结构是计算机科学中最基础、最核心的概念之一。在C++编程中,我们常常需要使用各种数据结构来解决实际问题。然而,有时候我们可能会遇到一些问题,如如何初始化一个栈或者链表,如何在二叉树中进行查找等。本文将...
    99+
    2023-10-22
    解决方法 - 链表 (Linked List) 数据结构问题 - 数组 (Array) - 栈和队列 (Stack an
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作