一文了解JavaScript的数据类型

在JavaScript中有六种不同的数据类型,六种数据类型又分为5种简单数据类型(基本数据类型)和1中复杂数据类型(引用数据类型),基本数据类型分为:字符串类型(string)、数值类型(number)、布尔类型(bnoolean)、为定义类型(undefined)、空类型(null),复杂数据类型为对象类型(object)

一、如何获取数据类型

二、字符串类型(String)

1、字面量表示

2、转义字符

3、字符串的特点

4、模版字符串(ES6)

三、数值类型(number)

1、字面量表示

2、进制转换

3、浮点数

4、浮点数的运算

5、数值范围

6、NaN

四、布尔类型(boolean)

五、未定义类型(undefined)

六、空类型(null)

七、对象类型(object)

八、类型转换

1、字符串类型转换

1.1、隐式转换

 1.2、显式转换

2、数值类型转换

2.1、隐式转换

2.2、显式转换 

3、布尔类型转换

九、Symbol类型(ES6)

1、Symbol类型的创建

2、Symbol类型的特性

3、获取已创建的Symbol类型


一、如何获取数据类型

JavaScript是弱类型语言,当声明一个变量时无需设置数据类型,所以开发者无法通过一个变量名来获取其数据类型,js给我们提供了一个运算符typeof用来获取数据类型

typeof '知数SEO';  //string
typeof 100;  // number
typeof true; // boolean
typeof undefined;  // undefined;
typeof null;  // object;  将null看作是空对象
typeof {age:19}; // object
typeof function(){}; // function 派生自object

二、字符串类型(String)

string类型是使用中最广泛的一种类型,javascript将字符串类型定义为0个或者多个16位无符号整数组成的有序数列,每个字符来自Unicode字符集,字符串可以使用英文下的单引号或双引号表示

1、字面量表示

// 字面量又称直接量,在js中如果想创建一个指定值的字符串,则直接通过单引号或双引号将指定值括起来即可,这种创建字符串的方式叫做字符串字面量

'知数SEO';
"品牌推广专家";

2、转义字符

反斜线被用作转义使用

常用转义字符

转义字符含义
\oNULL字符
\b退格符
\t制表符
\n换行符
\r回车符
\v垂直制表符
\"双引号
\'单引号
\\反斜线
\xXX由2位十六进制数XX指定的Lantin-1字符
\uXXXX由4位十六进制数XXXX指定的Unicode字符

3、字符串的特点

// 1、字符串一旦创建便无法修改,有关字符串的一些方法,比如字符串替换、字符串填充等,其实是删除了原来的字符串,新建了一个字符串

// 2、字符串类型中每个字符都对应一个下标,字符串自左向右由数字0依次递增,这个下标通常被称为索引

// js提供了获取指定索引字符的方法: 变量[索引]
var str = '知数SEO_品牌推广专家';
alert(str[0])

4、模版字符串(ES6)

// 模版字符串(template String)相当于增强版的字符串,用反引号(`)标识,它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量

// 使用区块作用域
var str = "知数SEO";
var zs = '品牌推广专家 + str + '专注品牌营销推广';
console.log(zs);

// 使用模版字符串
var str = "知数SEO";
var zs = `品牌推广专家${str}专注品牌营销推广`;
console.log(zs);

三、数值类型(number)

数值类型用于表示数值,其格式有浮点数(小数)、整数以及多种不同进制。js没有将浮点数和整数分为不同的数据类型,这与其它编程语言有所不同。

1、字面量表示

// 在js中,如果需要使用一个数值,通常将变量直接赋值为数字,那么这个变量存储的数据就是一个数值类型的值
var num = 806331888;

// 在计算机语言中,表达一个数值其实并没有那么容易,可能设计到进制的问题,目前比较常用的有: 二进制、八进制、十进制、十六进制

2、进制转换

在声明一个普通数值时,js默认会以十进制格式进行存储,十进制的含义是数字以 0-9之间的数值表示,当数值超过9则向上一位进1,其余的进制于此一致

在js中可以通过字面量或者系统提供的方法来表示不同进制的数值,比如八进制和十六进制的数值,其字面量表示形式与普通数值不同,需要使用特殊前缀进行定义

// 在js数值的字面量表示方法中可以看到是有特殊格式的,如八进制字面量表示使用前导0 十六进制则使用0x

// 在ES6中提供了二进制和八进制的新的写法 分别用)0b(0B)和0o(0O)表示

var num = 017; // 八进制
var num = 17; // 十进制
var num = 0x17; // 十六进制

3、浮点数

// 所谓浮点数,在形式上与数学的小数一样,浮点数包含整数部分、小数点、小数部分,其整数部分可以省略
0.01; // 浮点数0.01
.01; // 省略整数部分的浮点数,与0.01一致
 
// 对于极大的浮点数或整数,可以使用科学记数法表示(用e 或 E表示)
1.23e-7;  // 1.23乘以10的-7次方     0.000000123

// 注意:声明一个浮点数,在内存中占用的空间为整数的两倍。因此js的机制中会自动将浮点数转换为整数,这种情况发生在浮点数本身就是整数的情况下,如1.0 1

4、浮点数的运算

浮点数存在精度差,最高精度为17位小数,所以在运算中使用浮点数进行计算时可能会导致无法预知的错误

5、数值范围

由于内存的限制,js中的数值类型不能保存世界上所有的数值,数值类型有两个边界值:最大值MAX_VALUE 和最小值 MIN_VALUE,这两个值分别通过Number.MAX_VALUENumber.MIN_VALUE方式获取

如果超出了这个范围就会显示为Infinity(正无穷)或者-Infinity(负无穷),我们可以使用isFinity()函数来确定一个数是否在最大值和最小值之间,如果在允许的范围内则返回true 否则返回 false

6、NaN

NaN(Not a Number)这个数值用于表示一个本来要返回数值的操作但未返回数值的情况,例如在数学中除数不能为0,在js中0除以0会返回NaN 

NaN作为一个特殊的值,它有两个规则:

1、它与任何值都不想等,包括其本身

2、任何设计NaN的运算均会返回NaN值

针对NaN这个特殊的值,js特地定义了isNaN()函数,这个函数接收一个参数,起作用就是判断这个 参数是否时NaN值,如果是就返回true

四、布尔类型(boolean)

布尔类型是js中使用最多的数据类型,该值只有true和false两个值,分别代表真和假,通常情况下开发者不会自己定一个布尔值,而是通过一个表达式或者多个表达式返回一个布尔值,这些表达式通常会作为条件出现在流程控制的逻辑判断中。

var num = 1;
if(num ==1){
    alert('二者相等');
}else {
    alert('二者不相等');
}

五、未定义类型(undefined)

underfined(未定义)是一种特殊的数据类型,该类型中仅有一个值就是其本身,当变量未被初始化赋值的时候会默认为undefined,当没有声明变量num同时使typeof测试时,会提示undefined,需要注意的是直接在语句中使用未声明的变量时会报错

六、空类型(null)

null类型和undefined类型有共同之处,null类型仅有一个值就是其本身,从逻辑上看null表示一个空对象的指针,这也就是为什么使用typeof检测null为object类型的原因

在项目开发中,如果定义的变量准备用来保存对象,那么最好将其赋值为null,这样一来从语义上就能很清楚的知道该变量是准备用来存储对象的

七、对象类型(object)

对象类型又称为引用数据类型、复杂数据类型,先对于之前提及的五种基本数据类型,它显得复杂和重要,对象其实就是一组相关联的数据和功能的集合,可以通过字面量的形式创建对象,在创建时可以为其赋多个数据值

// 语法:{属性名:属性值,属性名:属性值,...}

var obj = {name,"知数SEO"};  // 定义对象

obj.name; // 知数SEO  获取属性名

八、类型转换

在实际开发中,经常会遇到不同的数据类型相互转换的问题

1、字符串类型转换

字符串类型转换分为隐式转换(自动转换)和显式转换(强制转换)

1.1、隐式转换
// 隐式转换就是当程序运行时期望值为一个字符串时就会讲非字符串类型自动转换为字符串类型
// 字符串连接使用“+”符号,该符号在js中同时扮演着算数运算符和字符串连接符的角色

var str = "知数SEO" + 8 + "年专品牌推广";
document.write('<h2>',typeof str,'</h2>');

 1.2、显式转换
// 显式转换也称为强制转换,这种转换是可控的,js给我们提供了几个方法来实现字符串的类型转换
// 全局函数String()
var num =1;
var bool = true;
String(bool);
String(num);

// toString()对象方法,除了undefined和null外每种数据类型都有
bool.toString();
num.toString();

// 除了上面的两种方式还有一种取巧方式转换字符串,即使用“+”连接一个空字符串
var name = "shishu";
console.log(typeof name+"");

2、数值类型转换

数值类型转换与字符串相同,具有隐式转换和显式转换之分

2.1、隐式转换
var num1 = 1;
var num2 = 2;
document.write('<h2>',num1 + num2,'</h2>');
2.2、显式转换 
// 除了隐式转换js提供了三个函数用于非数值类型转换为数值类型

// Number()

// parseInt()  支持第二参数,如果第二参数为进制数,则会讲第一个参数解析为指定进制的数值

// parseFloat()

 

Number()函数的转换规则

参数类型参数值转换
booleantrue/false1/0
number返回相同的值
nullnull0
undefinedundefinedNaN
string只包含数字返回对应的值
string包含有效的浮点数返回对应的浮点数
string包含有效的十六进制数将十六进制转换为十进制并返回
string包含有效的八进制数讲八进制转换为十进制并返回
string字符串为空0
string除以上格式外NaN
object首先调用valueOf()方法,如果为NaN则调用toString()方法一般为NaN

3、布尔类型转换

布尔值同样存在两种类型转换方式,隐式转换在逻辑判断中对表达式的处理等会用到

显式转换用到Boolean() 

Boolean()函数的转换规则

数据类型转换为true转换为false
string非空字符串空字符串
number非零数字0和NaN
booleantruefalse
null永远转换为false
undefined永远转换为false
object任何对象(包括空对象)null

九、Symbol类型(ES6)

ES6中引入了Symbol类型,这是因为在ES6之前,对象属性名称都是字符串,比如你使用别人提供的对象,又想为这个对象添加新方法,新方法的名字就很有可能与现有的对象属性存在冲突,于是Symbol就应运而生了

1、Symbol类型的创建

// 语法 Symbol();

// 在使用Symbol()函数生成一个Symbol类型的值的同时,可以传入一个参数用于进行对该值进行描述,但对于值本身是没有任何影响的

Symbol('知数SEO');

2、Symbol类型的特性

// 特性1: Symbol()函数每次使用都会生成一个独一无二的值,因此尽管变量使用的生成函数是相同的,但是其值时不同的
var num1 = Symbol();
var num2 = Symbol();
console.log(num1 == num2);  // false


// 特性2: Symbol()函数生成的Symbol类型的值无法隐式转换成字符串

// 特性3: Symbol()函数接收一个参数,但该参数对结果不产生影响,仅作为描述信息

3、获取已创建的Symbol类型

// Symbol()函数每次使用都会生成一个独一无二的值,不过有时我们会用到之前生成的Symbol值

// Symbol.for()方法用来实现这种效果
Symbol.for(key);

//该方法接收一个参数,当使用该方法时会自动寻找是否有以该字符串为参数的Symbol值,如果有则返回该Symbol值,否则创建一个Symbol值
var num1 = Symbol.for('zhishu');
var num2 = Symbol.for('zhishu');
console.log(num1 == num2);  // true

注意:只有使用Symbol.for()生成的Symbol值才能被用于此方法,当使用Symbol()函数生成一个Symbol值时不具备这个特点

Symbol.for()与Symbol()这两种写法都会生成新的Symbol值,它们的区别在于前者被登记在全局环境中供搜索,后者不会,Symbol.for()方法不会每次被调用就返回一个新的Symbol类型的值,而是会先检查给定的key是否已经存在,如果不存在则会创建一个新值

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/318406.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python对自动驾驶进行模拟

使用了 Pygame 库来创建一个简单的游戏环境,模拟了一辆自动驾驶汽车在道路上行驶。汽车的位置和速度通过键盘控制&#xff0c;可以左右移动和加速减速。道路的宽度和颜色可以根据需要进行调整。 import pygame import random # 游戏窗口大小 WINDOW_WIDTH 800 WINDOW_HEIG…

华为路由器OSPF动态链路路由协议配置

R1配置 interface GigabitEthernet0/0/0ip address 10.1.12.1 255.255.255.252 interface LoopBack0ip address 1.1.1.1 255.255.255.255 ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 1.1.1.1 0.0.0.0 network 10.1.12.0 0.0.0.3 R2配置 interface GigabitEthernet0/0/0i…

互联网资讯精选:科技爱好者周刊 | 开源日报 No.145

ruanyf/weekly Stars: 37.4k License: NOASSERTION 记录每周值得分享的科技内容&#xff0c;提供大量就业信息。欢迎投稿、推荐或自荐文章/软件/资源&#xff0c;并可通过多种方式进行搜索。 提供丰富的科技内容每周更新可以提交工作/实习岗位支持投稿和推荐功能 GyulyVGC/…

132基于matlab的采集信号模极大值以及李氏指数计算

基于matlab的采集信号模极大值以及李氏指数计算&#xff0c; 1)计算信号的小波变换。 2)求出模极大曲线。 3)计算其中两个奇异点的Lipschitz指数&#xff0c;程序已调通&#xff0c;可直接运行。 132matlab模极大曲线Lipschitz (xiaohongshu.com)

RTSP协议实现发送ACC音频数据

一.AAC音频格式介绍 AAC音频格式&#xff1a;Advanced Audio Coding&#xff08;高级音频解码&#xff09;&#xff0c;是一种由MPEG—4标准定义的有损音频压缩格式。音频压缩编码的输出码流&#xff0c;以音频帧的形式存在。每个音频帧包含若干个音频采样的压缩数据&#xff0…

C语言--单链表的创建及使用详解

C语言--单链表的创建及使用详解 1. 单链表定义1.1 工作原理1.2 优点 2. 单链表的创建2.1 文件创建2.2 节点创建2.3 链表显示 3. 链表操作3.1 尾插3.2 头插3.3 尾删3.4 头删3.5 指定数据寻找3.6 指定位置前插入3.7 指定位置删除 4. 单链表总内容4.1 test.c文件4.2 SList.h文件4.…

canvas设置圆锥形渐变

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

2024年Flag

管理自己 2024年是一个科技迅速发展的时期&#xff0c;作为一个技术人员&#xff0c;我将有很多事情要做。在这一年里&#xff0c;我计划立下以下几个flag&#xff0c;来提升自己的技术能力。 学习人工智能和机器学习 首先&#xff0c;我计划深入学习人工智能和机器学习。随着…

在线的货币兑换平台源码下载

在线的货币兑换平台&#xff0c;可帮助全球各地的个人和企业将货币从一种货币兑换为另一种货币。该货币兑换平台是 Codecanyon 中最先进的脚本。 源码下载&#xff1a;https://download.csdn.net/download/m0_66047725/88728084

js中try...catch捕捉错误

文章目录 一、前言二、场景2.1、setTimeout2.2、Promise 三、最后 一、前言 说到try...catch都觉得非常熟悉了&#xff0c;不就是用来捕捉代码块中的错误嘛&#xff0c;平时也用得比较多的 二、场景 try...catch只能捕捉到同步执行代码块中的错误 2.1、setTimeout try {setT…

【LabVIEW FPGA入门】没有CompactRIO时进行编程测试

1.新建一个空白项目。 2.新建cRIO终端。 要添加仿真的远程实时目标&#xff0c;请选择项目名称&#xff0c;右击并选择新建>>目标和设备(Targets and Devices)。 3.新建终端和设备&#xff0c;选一个cRIO型号 接下来&#xff0c;当添加目标和设备窗口出现时&#xff0c;请…

第 2 课 ROS 系统安装和环境搭建

第 2 课 ROS 系统安装和环境搭建 1.版本选择 不同的 Ubuntu 安装的 ROS 版本不同&#xff0c;其中 Ubuntu18.04 的 ROS 对应版本为Melodic。 Ubuntu版本ROS版本Ubuntu16.04KineticUbuntu18.04MelodicUbuntu20.04Noetic 2.检查 Ubuntu 的软件和更新源 找到系统中的“软件和…

Python+Django+MySQL的图书馆管理系统【附源码,运行简单】

PythonDjangoMySQL的图书馆管理系统【附源码&#xff0c;运行简单】 总览 1、《图书馆管理系统》1.1 方案设计说明书设计目标需求分析工具列表 2、详细设计2.1 登录2.2 注册2.3 程序主页面2.4 图书新增界面2.5 图书信息修改界面2.6 其他功能贴图 3、下载 总览 自己做的项目&am…

mysql从入门到放弃之数据库体系结构与管理

文章目录 前言一、体系结构1、mysql c/s结构介绍2、mysql实例组成3、mysqld程序运行原理3.1、mysqld守护进程结构3.2、 引入sql语句结构化的查询语言3.3、探索一条SQL语句的执行过程 二、mysql逻辑存储结构三、mysql物理存储结构3.1、innodb存储引擎的段、区、页之间的关系 四、…

YZ虚拟资源下载源码-支持对接公众号-对接支付

这款系统内置的模板是电脑系统下载站的类型&#xff0c;当然你也可以用作其他类型&#xff0c;例如软件下载&#xff0c;其他类型的资源下载&#xff0c;知识付费下载等&#xff0c;改下文字内容即可。 支持商城系统&#xff0c;后台可配置支付。青狐修改增加了很多可用性。 …

C++学习笔记(十九)

一、vector容器 1. vector基本概念 功能&#xff1a;vector数据结构和数组非常相似&#xff0c;也称为单端数组 vector与普通数组区别&#xff1a;不同之处在于数组是静态空间&#xff0c;而vector可以动态扩展 动态扩展&#xff1a;并不是在原空间之后续接新空间&#xff…

VMware 安装及创建一个 CentOS Stream 的详细指南

文章目录 1. 简介2. 下载和安装1&#xff09;通过官网安装2&#xff09;通过电脑管家安装 3. 下载操作系统镜像包4. 创建虚拟机结语 1. 简介 在过去&#xff0c;服务器通常是运行单一操作系统和应用程序的物理设备。这就导致了硬件资源浪费和管理复杂性的增加。为了解决这些问…

注册中心--zookeeper 安装并启动

zookeeper 安装/启动 注册中心--zookeeper安装步骤zookeeper常用命令 注册中心–zookeeper zookeeper官方下载地址 最早由雅虎开发&#xff0c;用来解决分布式系统中的一致性问题。功能&#xff1a;包括配置管理、集群的扩容和缩容、分布式锁等等。 安装步骤 1&#xff09;…

C++学习笔记(二十八):c++ 静态库及动态库的使用

静态库的使用 库的使用会很大程度减少我们的工作&#xff0c;本节对c中静态库和动态库的使用进行简单的介绍。静态链接库意味着这个库会被放到可执行文件中&#xff0c;在生成的exe中。动态链接库是在程序运行时链接的&#xff0c;可以在程序运行时调用加载库函数的方法来实现&…

Java项目:07 Springboot的客户管理系统

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 springboot客户管理系统 功能模块&#xff1a;登录修改密码客户列表充值列表消费记录客户类型 环境&#xff1a;IDEAjdk1.8Tomcat9MySQL5.7maven3.6…