JavaScript基础 第四章 数据类型

四、数据类型

4.1 数据类型简介

  • 为什么需要数据类型?

    在计算机中,不同的数据所需占用的存储空间是不同的,为了便于把数据分成所需内存大小不同的数据,充分利用存储空间,于是定义了不同的数据类型。
    简单来说,数据类型就是数据的类别型号。比如姓名“张三”,年龄18,这些数据的类型是不一样的。

  • 变量的数据类型

    变量是用来存储值的所在处,它们有名字和数据类型。变量的数据类型决定了如何将代表这些值的位存储到计算机的内存中。JavaScript 是一种弱类型或者说动态语言。这意味着不用提前声明变量的类型,在程序运行过程中,类型会被自动确定

    示例

    var age = 10;        // 数字型
    var areYouOk = '是的';   // 字符串型
    

    在代码运行时,变量的数据类型是由 JS引擎 根据 = 右边变量值的数据类型来判断 的,运行完毕之后, 变量就确定了数据类型。JavaScript 拥有动态类型,同时也意味着相同的变量可用作不同的类型:

    var x = 6;           // x 为数字
    var x = "Bili";      // x 为字符串    
    

4.2 数据类型的分类

JS 把数据类型分为两类:

  • 简单数据类型 (number,string,boolean,undefined,uull,symbol),symbol为ES6新增数据类型

  • 复杂数据类型 (Object,Array,Map,Set,Date等)

4.3 简单数据类型

简单数据类型(基本数据类型)

JavaScript 中的简单数据类型及其说明如下:

在这里插入图片描述

4.3.1 数字型 number

JavaScript 数字类型既可以保存整数,也可以保存小数(浮点数)。

var age = 21;       // 整数
var Age = 21.3747;  // 小数     
  1. 数字型进制

    最常见的进制有二进制、八进制、十进制、十六进制。

      // 1.八进制数字序列范围:0~7
     var num1 = 07;   // 对应十进制的7
     var num2 = 019;  // 对应十进制的19
     var num3 = 08;   // 对应十进制的8
      // 2.十六进制数字序列范围:0~9以及A~F
     var num = 0xA;   
    

    现阶段我们只需要记住,在JS中八进制前面加0,十六进制前面加 0x

  2. 数字型范围

    JavaScript中数值的最大和最小值

    • 最大值:Number.MAX_VALUE,这个值为: 1.7976931348623157e308

    • 最小值:Number.MIN_VALUE,这个值为:5e-32

  3. 数字型三个特殊值

    • Infinity ,代表无穷大,大于任何数值

    • -Infinity ,代表无穷小,小于任何数值

    • NaN ,Not a number,代表一个非数值

  4. isNaN 方法判断变量是否为数字型

    用来判断一个变量是否为非数字的类型,返回 true 或者 false

var usrAge = 21;
var isOk = isNaN(userAge);
console.log(isNum);          // false ,21 不是一个非数字

var usrName = "andy";
console.log(isNaN(userName));// true ,"andy"是一个非数字
4.3.2 字符串型 String

字符串型可以是引号中的任意文本,其语法为 双引号 “” 和 单引号’’

也可以使用模板字符串,模板字符串(template string)是增强版的字符串,用反引号(`)标识。ES6 新增

var strMsg = "我爱北京天安门~";  // 使用双引号表示字符串
var strMsg2 = '我爱吃猪蹄~';    // 使用单引号表示字符串

// 常见错误
var strMsg3 = 我爱大肘子;       // 报错,没使用引号,会被认为是js代码,但js没有这些语法

// 模板字符串 
var strTem = `模板字符串`

因为 HTML 标签里面的属性使用的是双引号,JS 这里我们更推荐使用单引号

  1. 字符串引号嵌套

    JS 可以用单引号嵌套双引号 ,或者用双引号嵌套单引号 (外双内单,外单内双)

    var strMsg = '我是"高帅富"程序猿';   // 可以用''包含""
    var strMsg2 = "我是'高帅富'程序猿";  // 也可以用"" 包含''
    
    //  常见错误
    var badQuotes = 'What on earth?"; // 报错,不能 单双引号搭配
    
  2. 字符串转义符

    类似HTML里面的特殊字符,字符串中也有特殊字符,我们称之为转义符。

    转义符都是 \ 开头的,常用的转义符及其说明如下:

    转义符解释说明
    \n换行符,n 是 newline 的意思
    \\斜杠 \
    \’’ 单引号
    \"” 双引号
    \ttab 缩进
    \b空格 ,b 是 blank 的意思
  3. 字符串长度

    字符串是由若干字符组成的,这些字符的数量就是字符串的长度。通过字符串的 length 属性可以获取整个字符串的长度

    var strMsg = "我是帅气多金的程序猿!";
    alert(strMsg.length); // 显示 11
    
  4. 字符串拼接

    多个字符串之间可以使用 + 进行拼接,其拼接方式为 字符串 + 任何类型 = 拼接之后的新字符串

    拼接前会把与字符串相加的任何类型转成字符串,再拼接成一个新的字符串

    //1.1 字符串 "相加"
    alert('hello' + ' ' + 'world'); // hello world
    
    //1.2 数值字符串 "相加"
    alert('100' + '100'); // 100100
    
    //1.3 数值字符串 + 数值
    alert('11' + 12);     // 1112 
    

    + 号总结口诀:数值相加 ,字符相连

  5. 字符串拼接加强

    console.log('我' + 18);        // 我18 只要有字符就会相连 
    var age = 18;
    
    console.log('我age岁啦');      // 这样不行哦!
    console.log('我' + age);         // 我18
    console.log('我' + age + '岁啦'); // pink老师18岁啦
    
    • 经常会将字符串和变量来拼接,变量可以很方便地修改里面的值

    • 变量是不能添加引号的,因为加引号的变量会变成字符串

    • 如果变量两侧都有字符串拼接,口诀“引引加加”,变量写加中间

    在这里插入图片描述

4.3.3 布尔型 boolean

布尔类型有两个值:truefalse ,其中 true 表示真(对),而 false 表示假(错)。

布尔型和数字型相加的时候, true 的值为 1 ,false 的值为 0。

console.log(true + 1);  // 2
console.log(false + 1); // 1
4.3.4 undefined 和 null

一个声明后没有被赋值的变量会有一个默认值 undefined ( 如果进行相连或者相加时,注意结果)

var variable;
console.log(variable);           // undefined
console.log('你好' + variable);  // 你好undefined
console.log(11 + variable);     // NaN
console.log(true + variable);   //  NaN

一个声明变量给 null 值,里面存的值为空

var vari = null;
console.log('你好' + vari);  // 你好null
console.log(11 + vari);     // 11
console.log(true + vari);   //  1

4.4 获取变量数据类型

typeof 关键字可用来获取检测变量的数据类型

var num = 18;
console.log(typeof num) // 结果 number      

不同类型的返回值

18

4.5 字面量

字面量(literal)是用于表达一个固定值的表示法,又叫常量

通俗的理解,字面就是所见即所得,js 程序执行到代码中的字面量,会立即知道它是什么类型的数据,值是多少

可以用于表示固定值,比如:数字、字符串、undefined、布尔类型的字面值等

  • 数字字面量:8, 9, 10
  • 字符串字面量:‘你好’, “前端”
  • 布尔字面量:true,false

4.6 数据类型转换

什么是数据类型转换?

使用表单、prompt 获取过来的数据默认是字符串类型的,此时就不能直接简单的进行加法运算,而需要转换变量的数据类型。

通俗来说,就是把一种数据类型的变量转换成另一种数据类型,通常会实现3种方式的转换:

  1. 转换为字符串类型
  2. 转换为数字
  3. 转换为布尔
4.6.1 转换为字符串

在这里插入图片描述

  • toString() 和 String() 使用方式不一样。

    var num = 10;
    
    num.toString()
    String(num)
    
  • 三种转换方式,更多使用第三种加号拼接字符串转换方式, 这一种方式也称之为隐式转换

4.6.2 转换为数字型

在这里插入图片描述

  • 注意 parseIntparseFloat 单词的大小写
4.6.3 转换为布尔型

在这里插入图片描述

  • 代表空、否定的值会被转换为 false ,如 ‘’、0、NaN、null、undefined

  • 其余值都会被转换为 true

    console.log(Boolean('')); // false
    console.log(Boolean(0)); // false
    console.log(Boolean(NaN)); // false
    console.log(Boolean(null)); // false
    console.log(Boolean(undefined)); // false
    console.log(Boolean('小白')); // true
    console.log(Boolean(12)); // true
    
4.6.4 隐式转换

隐式转换:在进行算数运算的时候,JS 自动转换了数据类型

字符串数字相加(+),结果是字符串

字符串数字减、乘、除(- * /),结果是数字

console.log('88' + 1);	//881
console.log('88' - 0);	//88
console.log('88' * 1);	//88
console.log('88' / 1);	//88

还有其它的隐式转换,这里不过多介绍

4.7 数据类型与堆栈

4.7.1 简单数据类型

简单类型基本数据类型值类型):在存储时变量中存储的是值本身,包括string ,number,boolean,undefined,null

4.7.2 复杂数据类型

复杂数据类型(引用类型):在存储时变量中存储的仅仅是地址(引用),通过 new 关键字创建的对象(系统对象、自定义对象),如 Object、Array、Date等;

4.7.3 堆栈

堆栈空间分配区别:

1、:由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈;简单数据类型存放到栈里面

2、:存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bzIvIDPf-1635514312739)(JavaScript%E5%9F%BA%E7%A1%80.assets/%E5%9B%BE%E7%89%8711.png)]

简单数据类型的存储方式

值类型变量的数据直接存放在变量(栈空间)中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tvlCwNRi-1635514312741)(JavaScript%E5%9F%BA%E7%A1%80.assets/%E5%9B%BE%E7%89%8712.png)]

复杂数据类型的存储方式

引用类型变量(栈空间)里存放的是地址,真正的对象实例存放在堆空间中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fofuuPRd-1635514312742)(JavaScript%E5%9F%BA%E7%A1%80.assets/image-20211029203202783.png)]

4.7.4 简单类型传参

函数的形参也可以看做是一个变量

当我们把一个值类型变量作为参数传给函数的形参时,其实是把变量在栈空间里的值复制了一份给形参,那么在方法内部对形参做任何修改,都不会影响到的外部变量。

function fn(a) {
    a++;
    console.log(a); 
}
var x = 10;
fn(x);
console.log(x)

运行结果为: 11 10

4.7.5 复杂数据类型传参

当我们把引用类型变量传给形参时,其实是把变量在栈空间里保存的堆地址复制给了形参,形参和实参其实保存的是同一个堆地址,所以操作的是同一个对象。

function Person(name) {
    this.name = name;
}
function f1(x) { // x = p
    console.log(x.name); // 2. 这个输出什么 ?    
    x.name = "张学友";
    console.log(x.name); // 3. 这个输出什么 ?    
}
var p = new Person("刘德华");
console.log(p.name);    // 1. 这个输出什么 ?   
f1(p);
console.log(p.name);    // 4. 这个输出什么 ?  

运行结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UmlIyHLK-1635514312743)(JavaScript%E5%9F%BA%E7%A1%80.assets/%E5%9B%BE%E7%89%8715.png)]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值