JavaScript面试题:数据类型与内存空间

一、数据类型部分

1、JavaScript有哪些数据类型?

JavaScript是一种弱类型的脚本语言,它有两类数据类型:基本类型与对象类型

  • 基本类型:String、Number、Boolean、undefined、null

  • 对象类型:Object、Array、function等

2、判断数据类型的方式有几种?

有三种基本的判断方式:typeof、===、instanceof

方式 可以判断 无法判断
typeof String、Number、Boolean、undefined、function null与Object、Object与Array
instanceof 判断对象的具体类型,返回boolean值 30
=== undefined、null 30

具体示例请参见文章:JavaScript基础—数据类型

3、undefined与null的区别

  • undefined:表示未定义

  • null:表示定义了未赋值,通常用来表示这个变量在将来会保存对象类型的数据

  • undefined与null作为判断条件的时候,结果都是false

4、== 与 ===的区别

  • ==:称为“相等”,如果两个操作数不是同一类型,那么相等运算符会尝试一些类型转换,然后进行比较;

  • ===:称为“严格相等”,表示恒等,首先比较两边的变量数据类型是否相等,其次比较两边的变量的数值是否相等

这里提到了一个概念“类型转换”,将在下一篇文章中进行介绍,下面请先根据前面的概念理解一下表达式

null == undefined; // true
null === undefined; // false
1 == '1'; // true
1 == '01.0' // true
1 === '1'; //false

以上是数据类型的一些经典的面试题,你是否都掌握了呢。下面我们来举一反三,留两个相关的练习题:

  1. 使用typeof bar ===“object”来确定bar是否是一个对象时有什么潜在的缺陷?这个陷阱如何避免?

  2. 自己写一个获取变量具体数据类型的方法,要求如下

// 判断类型的方法
 function getDataType(ac_data){
    //……
    return 'xxx'; // xxx是具体的类型
 }
 getDataType('1') // string
 getDataType(1)   // number
 getDataType(true)   // boolean
 getDataType(undefined)   // undefined
 getDataType([1,2,3])   // array
 getDataType(function(){})   // function

 

二、赋值与内存部分

1、var a = xxx,a内存中到底保存的是什么

根据xxx的情况而定

  • xxx是基本类型数据,保存的就是这个数据

  • xxx是对象类型的数据,保存的就是这个对象数据的地址值

  • xxx是一个变量,保存的是这个变量的内存内容

2、引用变量赋值的问题

var obj1 = {name:'神奇的小提莫',age:1}
 var obj2 = obj1;
 obj1.name = '前端小菜的进阶之路';
 
 //obj2.name数据什么,又是为什么呢
 console.log(obj2.name); //?
 
 obj1 = {name:'我是小提莫的小蘑菇',age:0};
 
 //obj1.name和obj2.name数据分别又是什么,为什么呢?
 console.log(obj2.name); //?
 console.log(obj1.name); //?
  • 两个引用变量指向同一个对象,通过一个引用变量修改对象内部数据,另一个引用变量也看得见

  • 两个引用变量指向同一个对象,让一个引用变量指向另一个对象,另一个引用变量还是指向原来的对象

具体示例请参见文章:JavaScript基础—内存空间

3、数据传递:在JavaScript中调用函数时,传递变量参数时,是值传递还是引用传递?

var a = 3;
 function fn(a){
     a=a+1
 }
 fn(a)
 console.log(a);  //?
 
 var b = {name:'神奇的小提莫',age:28};
 function fn2(b){
    b.name = 'fn2'
 }
 fn2(b)
 console.log(b.name);  //?

控制台依次输出:3, fn2

  • 理解1:只有值传递, 没有引用传递, 传递的都是变量的值, 只是这个值可能是基本数据, 也可能是地址(引用)数据,这种理解可以参见内存空间文章

  • 理解1:如果后一种看成是引用传递, 那就值传递(传递的是基本数据)和引用传递(传递的是地址值)都可以有

4、JS引擎如何管理内存

  • 内存生命周期:分配内存空间 ——> 存储数据,进行操作 ——> 释放对应内存

  • 释放内存:

    • 为执行函数分配的栈空间内存: 函数执行完自动释放

    • 存储对象的堆空间内存: 当内存没有引用指向时, 对象成为垃圾对象, 垃圾回收器后面就会回收释放此内存,通常给保存引用对象的变量赋值为null,那么这个对象就没有了变量引用(指向它),自然就被回收了

以上是关于的JavaScript基础—数据类型JavaScript基础—内存空间的8个经典题目,希望对你的工作和学习有所帮助。当然也可以关注我,和我一起学习,一起进步,一起分享你的经验。

欢迎关注同步微信公众号:前端小菜的进阶之路

公众号:Mr-Small_Teem