首页 > 编程语言 >JavaScript有哪些数据类型?

JavaScript有哪些数据类型?

时间:2024-09-26 10:24:12浏览次数:8  
标签:输出 JavaScript console log 哪些 Symbol Object 数据类型 object

JavaScript共有八种数据类型,分别是 Undefined、Null、Boolean、Number、String、Object、Symbol、BigInt。

Symbol 和 BigInt

其中Symbol 和 BigInt 是 ES6+(ECMAScript 2015+)中新增的数据类型:

  • Symbol 可以理解为一个独特的标识符。想象一下,你有一把独一无二的钥匙,这把钥匙就是 Symbol。它的主要用途是避免在使用对象属性时发生意外的名字冲突。比如,如果你和别人合作开发一个大型项目,你们都想给一个对象添加一个叫"id"的属性,使用 Symbol 可以确保你们的"id"不会互相覆盖。
  • BigInt 是专门用来处理特别大的整数的。普通的 Number 类型在JavaScript中有一个最大安全整数(9007199254740991),超过这个数字可能会出现计算错误。而 BigInt 可以安全地表示和计算任意大的整数,就像是给了数字一个无限的跑道。比如,当你需要精确计算天文数字或者处理非常大的金融数据时,BigInt 就非常有用。

这两种数据类型的加入,使得 JavaScript 能够更好地处理独特标识和超大整数,增强了语言的功能性和适用范围。

简单类型和复杂类型

JavaScript 的数据类型可以分为两大类:简单类型和复杂类型。

  1. 简单类型(也叫原始类型)

    • 这些类型就像是一个个小盒子,每个盒子里直接装着一个值。
    • 包括:Undefined、Null、Boolean、Number、String、Symbol 和 BigInt。
    • 它们存储在计算机的"栈"内存中,就像一摞盘子,取用方便快捷。
  2. 复杂类型(也叫引用类型)

    • 这些类型更像是大箱子,里面可以装很多东西。
    • 主要是 Object 类型,包括普通对象、数组和函数。
    • 它们存储在"堆"内存中,就像一个大仓库,可以存放更多、更复杂的数据。

简单来说,简单类型就是单纯的数据,复杂类型则可以包含更多信息和功能。

两种类型的区别在于存储位置的不同:

  • 栈内存:原始数据类型就像是小纸条,上面写着简单的信息(如数字或文字)。这些小纸条直接放在一个叫"栈"的抽屉里。这个抽屉很小,但是拿东西特别快,所以经常用到的小纸条就放在这里。
  • 堆内存:引用数据类型则像是大箱子,里面可能装着很多东西(如各种衣物)。这些大箱子放在一个叫"堆"的大仓库里。因为箱子太大了,不能直接放在小抽屉里,所以我们在小抽屉里放了一张写有箱子位置的便利贴。当我们需要箱子里的东西时,先在抽屉里找到便利贴,然后按照便利贴上的位置信息去仓库里找到对应的箱子。

数据类型检测

  • typeof: 7种基础数据类型中除了 null 返回的是 object,其他都能准确返回(包括 Symbol 返回 symbol,BigInt 返回 bigint),复杂数据类型中 Function 类型的数据返回 function,其他都返回 object;

console.log(typeof 42);           // 输出: "number"
console.log(typeof "Hello");      // 输出: "string"
console.log(typeof true);         // 输出: "boolean"
console.log(typeof Symbol());     // 输出: "symbol"
console.log(typeof 42n);          // 输出: "bigint"
console.log(typeof null);         // 输出: "object"
console.log(typeof {});           // 输出: "object"
console.log(typeof []);           // 输出: "object"
console.log(typeof function(){}); // 输出: "function"
  • instanceof: 复杂数据类型如Array等都准确返回相应的boolean值,对于基本数据类型则是返回 false (只有是通过new运算符来进行初始化,然后通过instanceof来判断是否是某个类的实例,才会返回true,比如"var k = new Number(11); console.log(k instanceof Number)",其返回true);

console.log([] instanceof Array);               // 输出: true
console.log({} instanceof Object);              // 输出: true
console.log(new Date() instanceof Date);        // 输出: true
console.log(42 instanceof Number);              // 输出: false
console.log(new Number(42) instanceof Number);  // 输出: true
  • 使用constructor检测:上面的instanceof对于直接声明如:"var a = 1;" 不能进行判断,我们可以通过使用constructor来实现判断,如 "a.constructor==Number" (其返回true,不过对于"1.constructor==Number"这类直接用数值来访问 constructor 的情况是会报错的),但对于null则仍然无法判断 ,而且会报错,比如"var k = null; console.log(k.constructor==Object)";

console.log((42).constructor === Number);        // 输出: true
console.log("Hello".constructor === String);     // 输出: true
console.log([].constructor === Array);           // 输出: true
console.log(({}).constructor === Object);        // 输出: true
// console.log(null.constructor === Object);     // 这行会报错
  • 使用Object.prototype.toString.call使用:这个方法可以获取所有的类型(包括null型),不过其返回的是类似"object Array"的形式的字符串。

console.log(Object.prototype.toString.call(42));           // 输出: "[object Number]"
console.log(Object.prototype.toString.call("Hello"));      // 输出: "[object String]"
console.log(Object.prototype.toString.call(true));         // 输出: "[object Boolean]"
console.log(Object.prototype.toString.call(null));         // 输出: "[object Null]"
console.log(Object.prototype.toString.call(undefined));    // 输出: "[object Undefined]"
console.log(Object.prototype.toString.call([]));           // 输出: "[object Array]"
console.log(Object.prototype.toString.call({}));           // 输出: "[object Object]"
console.log(Object.prototype.toString.call(function(){})); // 输出: "[object Function]"

注意事项

  1. null的类型检测:

    • 使用typeof null会返回"object",这是 JavaScript 的一个历史遗留 bug。
    • 要准确检测null,可以使用严格相等:value === null
  2. 原始值包装对象:

    • JavaScript 会自动为原始值创建包装对象,这就是为什么我们可以在原始值上调用方法。
    • 例如:"hello".toUpperCase()实际上 JavaScript 会临时创建一个 String 对象。
  3. Symbol 的特殊性:

    • Symbol 值是唯一的,即使描述相同,两个 Symbol 也不相等。
    • 例如:Symbol('foo') !== Symbol('foo')
  4. BigInt 的使用:

    • BigInt 数字后面要加n,例如:const bigInt = 1234567890123456789012345678901234567890n;
    • BigInt 不能与普通数字进行混合运算。
  5. 类型转换:

    • JavaScript 中的类型转换可能会导致意外结果,例如:

console.log([] + []); // 输出空字符串 ""
console.log([] + {}); // 输出 "[object Object]"
console.log({} + []); // 输出 0 (在某些环境下)

 

原创参考链接:原创参考链接

标签:输出,JavaScript,console,log,哪些,Symbol,Object,数据类型,object
From: https://www.cnblogs.com/dreamtt/p/18432928

相关文章

  • 基本数据类型怎么转化
    在编程语言中,基本数据类型的转换通常可以分为自动类型转换(隐式类型转换)和强制类型转换(显式类型转换)。一、自动类型转换自动类型转换是在满足一定条件下,由编程语言自动进行的类型转换,无需程序员显式地指定。转换规则:转换通常是从低精度数据类型向高精度数据类型进行。例如,从较......
  • java基本数据类型
    1、整数数据类型byte:1个字节,8位,256种状态,取值范围为【-128,127】short:2个字节,16位,65536种状态,取值范围为【-32768,32767】int:4个字节,32位,整数类型默认是int类型,取值范围约21亿long:8个字节,64位,long类型表示long类型常量,要加L或者l,建议加L2、小数数据类型float:4个字节,32位,单......
  • Java中到底有哪些锁
    乐观锁和悲观锁不是具体的锁,是指看待并发同步的角度悲观锁:对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。乐观锁:乐观锁不是真......
  • javascript
    letconst\(let\)局部声明$const$全局声明StringNumberBooleannullundefined字符串,数字,布尔值,空值,未定义console.log(typeofA);//A的类型连接&模板字符串constusername="dzk";constage=20;consthello=`Mynameis${username}andIam${age}......
  • 0924-25,QT的数据类型,实现一个井字棋和计算器(只输入)
    day-01#include"mainwindow.h"#include<stdio.h>#include<iostream>#include<QApplication>#include<QDebug>#include<QPoint>#include<QLine>intmain(intargc,char*argv[]){QApplicationa(argc,......
  • javaScript 值的比较
    值的比较值的比较是指判断两个数的大小,返回一个布尔值。  比较运算符列表:   大于>  小于<  大于等于>= 小于等于<= 等于== 严格等于===不进行类型转换不等于!= 严格不等于!==不进行类型转换 字符串比较大小字符串间的比较大小遵循以下规则:1比较字符串首字母的大小。......
  • JavaScript中if嵌套 assert
    在JavaScript中,通常我们不会直接使用assert这个词,因为JavaScript标准库中并没有直接提供assert函数(尽管在一些测试框架如Jest、Mocha中经常看到)。但是,我们可以模拟一个assert函数的行为,即当某个条件不满足时抛出一个错误。结合if语句进行嵌套判断时,可以在每个需要断言的地方调用这......
  • JavaScript中if嵌套assert的方法
    在JavaScript中,通常我们不会直接使用assert这个词,因为JavaScript标准库中并没有直接提供assert函数(尽管在一些测试框架如Jest、Mocha中经常看到)。但是,我们可以模拟一个assert函数的行为,即当某个条件不满足时抛出一个错误。结合if语句进行嵌套判断时,可以在每个需要断言的地方调用这......
  • 【解决了一个小问题】aws s3 sdk 中的自定义header设置哪些不参与aws v4 签名
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯在通过代理访问s3服务端的时候,s3服务端返回类似的错误信息:<?xmlversion="1.0"encoding="UTF-8"standalone="yes"?><Error><Code>AuthorizationQueryParametersE......
  • javascript向数组添加元素
    javascript向数组添加元素,比较常用的是两种方法,一种是向数组后面添加元素,一种是在数组前面添加元素。向数组后面添加元素,一般用push语句,它返回的是添加新元素之后的数组长度。push语法格式是数组名.push('要添加的数组元素')比如有一个数组名字叫arr,要向数组后面添加一个'g......