JavaScript 数据类型

JavaScript 共有八种数据类型,分别是 Undefined、Null、Boolean、 Number、String、Object、Symbol、BigInt
其中 Symbol 和 BigInt 是 ES6 中新增的数据类型:

类型

基本数据类型

String

js里,单引号和双引号都是字符串

字符串也可以进行嵌套,但是只允许单引号里嵌套双引号或者双引号里嵌套单引号,同一种引号不允许嵌套

JS里,两个字符串之间直接比较,不会先把字符串转化为数字再进行比较,而是直接采用字符串的比较规则进行比较

字符串比较大小,是将字符串对应位置上的字符对应的ASCII码的值进行大小比较,如果相同,比较后一个字符,直到比较出大小为止.如果每个位置上的值都相等,则这两个字符串相等

Number

数值范围:

  • 5e324 ~ 1.7976931348623157e+308
  • 如果超过范围,会表示为 Infinity 或者 -Infinity

特殊的数值NaN:

  • NaN是 number类型,是一个数值
  • 特点1:NaN与任何数进行任何运算结果都是NaN
  • 特点2:NaN与任何数都不相等,包括自己

相关函数:

  • isNaN() 判断数据是否是 NaN, 是返回true,否则返回false
  • isFinite() 判断数据是否在范围内,在范围内返回true,否则false

Boolean

布尔类型,一种非真即假的数据类型,该数据类型只有两个值: true(真)和false(假);

Null

空值类型

表示没有对象,此处无值 使用typeof获取null的类型值是object

Undefined

未定义类型 

表示缺少值,本来应该有值但没定义 ;未定义类型,表示变量声明但未赋值

Symbol

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

BigInt

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

BigInt 的提案

JavaScript 中 Number.MAX_SAFE_INTEGER 表示最⼤安全数字,计算结果是 9007199254740991,即在这个数范围内不会出现精度丢失(⼩ 数除外)。但是⼀旦超过这个范围,js 就会出现计算不准确的情况, 这在⼤数计算的时候不得不依靠些第三库进解决,因此官提 出了 BigInt 来解决此问题。

引用数据类型

Object

Object 对象系列-CSDN博客

Date()时间系列-CSDN博客

数组方法系列-CSDN博客

Object是个大类,function函数、array数组、date日期...等都归属于Object

区别

:基本数据类型
:引用数据类型

基本数据类型直接存储在栈(stack)中的简单数据段,占据空间 小、大小固定,属于被频繁使用数据,所以放入栈中存储;
栈区内存由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈

引用数据类型存储在堆(heap)中的对象,占据空间大、大小不固定。如果存储在栈中,将会影响程序运行的性能;引用数据类型在栈 中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引 用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。 堆和栈的概念存在于数据结构和操作系统内存中。
在数据结构中:
  • 在数据结构中,栈中数据的存取方式为先进后出
  • 堆是一个优先队列,是按优先级来进行排序的,优先级可以按照大小来规定
  • 堆区内存一般由开发着分配释放,若开发者不释放,程序结束时可能由垃圾回收机制回收。

堆和栈的区别

堆和栈是计算机科学中用于管理内存的两种主要数据结构。它们在内存管理方式、数据访问速度、存储内容等方面有显著的区别:

  • 内存管理方式不同。栈是一种先进后出的数据结构,通常由操作系统自动管理,用于存储局部变量、函数参数和函数调用的上下文。当函数执行完毕或超出其作用域时,栈上的数据会自动清除。堆是一种树形结构,通常由程序员手动管理,用于动态分配和释放较大的数据结构,如动态数组、对象等。程序员需要显式地释放堆上的内存,否则可能导致内存泄漏。
  • 数据访问速度不同。栈上的数据通常直接存放在系统内存中,访问速度快。堆上的数据需要通过指针进行间接访问,访问速度相对较慢。
  • 存储内容不同。栈主要存储局部变量、函数参数和函数调用的上下文,其生命周期通常与其作用域相对应。堆主要用于存储动态分配的对象和数据结构,其生命周期由程序员控制。
  • 内存大小不同。栈的大小通常受到限制,受到操作系统和编译器的影响,一般只有几百KB到几MB的空间。堆的大小可以较大,受到系统资源的限制,通常比栈要大得多。
  • 内存分配和释放的不同。栈的内存分配和释放是由系统自动管理的,通常比较快。堆的内存分配和释放需要较多的开销,通常比较慢。

此外,在多线程环境下,栈的线程独享,不会发生竞争问题,而堆则需要考虑多线程并发访问时的同步和互斥机制。

数据类型判断

typeof

数组、对象、null 都会被判断为 object,其他判断都正确。

console.log(typeof 2);
console.log(typeof true);
console.log(typeof 'string');
console.log(typeof undefined);
console.log(typeof null);
console.log(typeof {});
console.log(typeof []);
console.log(typeof function(){});

instanceof

instanceof 只能正确判断引用数据类型,而不能判断基本数据类型。instanceof 运算符可以用来测试一个对象在其原型链 中是否存在一个构造函数的 prototype 属性。
console.log(2 instanceof Number);                //false
console.log(true instanceof Boolean);            //false
console.log('string' instanceof String);         //false
console.log([] instanceof Array);                //true
console.log({} instanceof Object);               //true
console.log(function() {} instanceof Function);  //true

constructor

constructor 有两个作用,一是判断数据的类型,二是对象实例通过 constrcutor 对象访问它的构造函数。需要注意,如果创建一个对象 来改变它的原型,constructor 就不能用来判断数据类型了:
console.log((2).constructor === Number);
console.log(true.constructor === Boolean);
console.log('string'.constructor === String);
console.log([].constructor === Array);
console.log({}.constructor === Object);
console.log(function() {}.constructor === Function);

Object.prototype.toString.call()

Object.prototype.toString.call() 使用 Object 对象的原型方法 toString 来判断数据类型:
同样是检测对象 obj 调用 toString 方法,obj.toString()的结果和 Object.prototype.toString.call(obj)的结果不一样,这是为什么?
这是因为 toString 是 Object 的原型方法,而 Array、function 等类 型作为 Object 的实例,都重写了 toString 方法。不同的对象类型调 用 toString 方法时,根据原型链的知识,调用的是对应的重写之后的 toString 方法(function 类型返回内容为函数体的字符串,Array 类型返回元素组成的字符串…),而不会去调用 Object 上原型 toString 方法(返回对象的具体类型),所以采用 obj.toString() 不能得到其对象类型,只能将 obj 转换为字符串类型;
因此,在想要 得到对象的具体类型时,应该调用 Object 原型上的 toString 方法。
const a = Object.prototype.toString
console.log(a.call(2));
console.log(a.call(true));
console.log(a.call('string'));
console.log(a.call([]));
console.log(a.call({}));
console.log(a.call(function() {}));
console.log(a.call(undefined));
console.log(a.call(null));

数据类型之间的转换

数字与字符串

显式转化

数字转字符串 String()方法

字符串转数字 Number()方法

隐式转化(只适合js)

数字转字符串 加上一个空字符串即可

例:console.log(123+"")

字符串转数字 用字符串做除了加法之外的四则运算(-0,*1,/1)

例:console.log("123"-0)

其他数据类型转布尔

显示转化

Boolean()

隐式转化

在某些结果是布尔值的有运算符参与的式子里,系统会即将最终计算的结果自动转化为布尔值

数字非0即为真,0为假

字符串非非空即为真,空字符串为假

null为假

undefned为假

NaN为假

对象为真

快捷操作 !!

!!

!!5    true   !!0  false

!!'a'   true   !!''  false

有错误请小伙伴们指出啊~~

  • 32
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值