前端基础 JavaScript数据类型相关知识

    本人大三最近开始准备明年春招 春招对于我们来说是非常重要的,如果有和本人一样大三学生一定要抓住这次机会,下面是我复习的JavaScript基础的知识

1.JavaScript数据类型

介绍js的基本数据类型

js一共有七种基本数据类型 分别是Undefined、Null、Boolean、Number、String  还有ES6中新增的Symbol 和 Es10中新增的BigInt类型,

Symbol 代表创建后独一无二且不可变的数据类型 它的出现我认为主要是解决可能出现的全局变量冲突的问题

BigInt是一种数字类型的数据 它可以表示任意精度格式的整数 使用BigInt可以安全的储存和操作最大整数 即使这个数已经超出了 Number 能够表示的安全整数范围。

堆栈池内存

  • 栈:原始数据类型(Undefined、Null、Boolean、Number、String)

  • 堆:引用数据类型(对象、数组和函数)

  • 池:  存放常量

Stack 在内存中自动分配内存空间的;Heap在内存中动态分配内存空间的,不一定会自动释放。一般我们在项目中将对象类型手动置 为 null 原因,减少无用内存消耗。

面试官: JavaScript 有几种类型的值?他们的区别是什么?

答:js 可以分为两种类型的值,一种是基本数据类型,一种是复杂数据类型。

基本数据类型....(参考开头)

复杂数据类型指的是 Object 类型,所有其他的如 Array、Date 等数据类型都可以理解为 Object 类型的子类。

两种类型间的主要区别是它们的存储位置不同,基本数据类型的值直接保存在栈中,而复杂数据类型的值保存在堆中,通过使用在栈中
保存对应的指针来获取堆中的值。

面试官:null 和 undefined 的区别?

答:首先Undefined和null都是基本数据类型 这两个基本数据类型都是只有一个值就是undefined和null
undefined代表的含义是未定义 null代表的是空对象 一般变量声明了但还没有定义的时候会返回undefined null主要用于赋值给一些可能会返回对象的变量作为初始化

undefined 代表的含义是未定义,null 代表的含义是空对象。一般变量声明了但还没有定义的时候会返回 undefined,null
主要用于赋值给一些可能会返回对象的变量,作为初始化。用void 0 可以安全的获得undefined

当我们对两种类型使用 typeof 进行判断的时候,Null 类型化会返回 “object”,这是一个历史遗留的问题。当我们使用双等
号对两种类型的值进行比较时会返回 true,使用三个等号时会返回 false。

2.判断变量的数据类型

面试官:一共有几种数据类型检测?
 一共有四种数据类型检测
typeof 
instanceof 
constructor 
Object.prototype.toString.call()

typeof

typeof是一元运算符 同样返回一个字符串类型 一般用来判断一个变量是否为空或者是什么类型,除了null类型以及object类型不能准确判断外 其他数据类型都可能返回正确的类型

面试官:为什么 typeof null 等于 Object?
不同的对象在底层原理的存储是用二进制表示的,在 javaScript 中,如果二进制的前三位都为 0 的
话,系统会判定为是 Object 类型。 null 的存储二进制是 000 ,也是前三位,所以系统判定 null 为 Object 类型。

000 :对象类型。
1 :整型,数据是31位带符号整数。
010 :双精度类型,数据是双精度数字。
100 :字符串,数据是字符串。
110 :布尔类型,数据是布尔值。

instanceof

instanceof 运算符用来测试一个对象在其原型链(又是一个很重要的知识点 大家要多看多理解)中是否存在一个构造函数的 prototype 属性。我们可以使用 instanceof 来进行判断某个对象是不是另一个对象的实例

instanceof 的原理是通过判断该对象的原型链中是否可以找到该构造类型的 prototype 类型。例如:

function Test(){} 

var test = new Test(); 

console.log(test instanceof Test); // true

constructor

对于引用类型,除此之外,还可以使用 xx.constructor.name 构造函数来判断 例如:

// constructor 构造来判断 

console.log(fn.constructor.name) // Function 

console.log(date.constructor.name)// Date 

console.log(arr.constructor.name) // Array 

console.log(reg.constructor.name) // RegExp

Object.prototype.toString.call()

一种最好的基本类型检测方式 Object.prototype.toString.call() ;它可以区分 null 、 string 、 boolean 、 number 、 undefined 、 array 、 function 、 object 、 date 、 math 数据类型。

// 判断基本类型 
Object.prototype.toString.call(null); // "[object Null]" 

Object.prototype.toString.call(undefined); // "[object Undefined]" 

Object.prototype.toString.call(“abc”);// "[object String]" 

Object.prototype.toString.call(123);// "[object Number]" 

Object.prototype.toString.call(true);// "[object Boolean]" 

// 判断引用类型 
function fn(){ 
    console.log(“yyf”); 
}
var date = new Date(); 

var arr = [1,2,3]; 

var reg = /[jyx]at/gi; 

Object.prototype.toString.call(fn); // "[object Function]" 
Object.prototype.toString.call(date); // "[object Date]" 
Object.prototype.toString.call(arr); // "[object Array]"
Object.prototype.toString.call(reg); // "[object RegExp]"

说到Object.prototype.toString.call() 就不得不说一说内部属性[[class]] 例如

// 我们自己创建的类就不会有这份特殊待遇,因为 toString() 找不到 toStringTag 属性时只好返回默认的 Object 标签
// 默认情况类的[[Class]]返回[object Object]
class Class1 {}
Object.prototype.toString.call(new Class1()); // "[object Object]"
// 需要定制[[Class]]
class Class2 {
  get [Symbol.toStringTag]() {
    return "Class2";
  }
}
Object.prototype.toString.call(new Class2()); // "[object Class2]"

比较常考的题:

判断空对象的方法

1.最常见的思路,for...in... 遍历属性,为真则为“非空数组”;否则为“空数组”
for (var i in obj) { // 如果不为空,则会执行到这一步,返回true
    return true
}
return false // 如果为空,返回false

2.通过 JSON 自带的 stringify() 方法来判断:JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。
if (JSON.stringify(data) === '{}') {
    return false // 如果为空,返回false
}
return true // 如果不为空,则会执行到这一步,返回true

3.ES6 新增的方法 Object.keys()  Object.keys() 方法会返回一个由一个给定对象的自身可枚举属性组成的数组。
function checkNullObj (obj) {
    return Object.keys(obj).length === 0
}

判断数组的方法

1.instanceof 操作符判断 instanceof 主要是用来判断某个实例是否属于某个对象
let arr = [];
console.log(arr instanceof Array); // true

2.对象构造函数的 constructor判断 用法:arr.constructor === Array
let arr = [];
console.log(arr.constructor === Array); // true

3.Array原型链上的 isPrototypeOf 用法:Array.prototype.isPrototypeOf(arr)
let arr= [];
console.log(Array.prototype.isPrototypeOf(arr));//true;

4.Object.getPrototypeOf   用法:Object.getPrototypeOf(arr) === Array.prototype  Object.getPrototypeOf() 方法返回指定对象的原型
let arr = [];
console.log(Object.getPrototypeOf(arr) === Array.prototype); // true

5.Object.prototype.toString.call(arr) === "[object Array]";
let arr = [];
console.log(Object.prototype.toString.call(arr) === "[object Array]"); // true

6.ES5新增的方法Array.isArray(arg) [[Class]] 内部属性值是 "Array", 则返回 true。
let arr = [];
console.log(Array.isArray(arr)); // true

   数据类型的基础知识我总结就这么多了 大家要差缺补漏 复习的时候不能光看 最好自己要敲一下验证一下 加深自己的印象 才能让自己的复习效率提高 大家都加油

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值