# 计算机程序可以处理大量的数据,为什么要给数据分类?

  • 更加充分和高效的利用内存
  • 也更加方便程序员的使用数据

# JS的数据类型整体分为两大类:

  • 简单数据类型(值类型)

    • Number
    • Boolean
    • String
    • null
    • undefined
  • 复杂数据类型(引用类型)

    • Object

# 简单数据类型

# Number(数字型)

  1. JavaScript中的正数、负数、小数等统一称为数字类型。

  2. 在控制台输出 蓝色

  3. 小数与小数相加存在精度问题,例如:0.1 + 0.2 ≠ 0.3

最大值:Number.MAX_VALUE,这个值为: 1.7976931348623157e+308

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

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

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

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


# Boolean(布尔型)

  1. 表示肯定或否定时在计算机中对应的是布尔类型数据。
  2. 它有两个固定的值 truefalse,表示肯定的数据用 true(真),表示否定的数据用 false(假)。
  3. 在控制台输出 蓝色
  4. 布尔值很少是直接赋值得到的,都是从结果中得到,主要利用布尔值进行判断。

# String(字符串型)

  1. 字符串是个伪数组。
  2. 通过 单引号('')双引号("")反引号(``)包裹的数据都叫字符串,单引号和双引号没有本质上的区别。
  3. 在控制台输出 黑色
  4. 单引号或双引号一定要成对使用,支持互相嵌套,使用规则:外双内单外单内双
  5. 必要时可以使用转义符 \,输出单引号或双引号。
# 模版字符串

符号:``

优点:支持换行,使开发更高效。

//内容拼接变量时,用 ${} 包住变量
document.write(`姓名:${name},年龄${age}`)
# 转义字符
转义符 解释说明
\n 换行符,n是newline的意思
\ \ 斜杠 \
\' '单引号
\" "双引号
\t tab缩进
\b 空格,b是blank的意思

# null(空值)

  1. null用于定义一个空对象,即如果变量要用来保存引用类型,可以在初始化时将其设置为null。
  2. 在控制台输出 灰色
//null表示值为空
let obj = null

/*
	通常都是在结果中得到的
	如果点取消,就得到null
	如果什么都没输入,点确认,变量里相当于存了空字符串
*/
let age = prompt('请输入年龄:')
# null 和 undefined 区别:
  • null表示变量没有值
  • undefined表示变量已被声明,但是并未赋值。
# null开发中的使用场景:
  • 官方解释:把null作为尚未创建的对象
  • 大白话:看将来有个变量里面存放一个对象,如果还没准备好对象,可以放个null

# undefined(未定义)

  1. 未定义是比较特殊的类型,只有一个值undefined。

  2. 只声明变量,不赋值的情况下,变量的默认值就是undefined。(一般很少直接为某个变量赋值为undefined)

  3. 在控制台输出 灰色

  4. 未赋值与未定义的变量值都为 undefined ,建议声明变量设置初始值,以便区分变量状态。

let age   //声明变量但未赋值
document.write(age)   //输出undefined
# undefined开发中的使用场景:
  • 定义变量未给值就是 undefined
  • 开发中经常声明一个变量,等待传送过来的数据,如果检测变量是undefined就说明没有值传递过来

# 复杂数据类型

# Object(对象)

# 什么是对象

对象(object):JavaScript里的一种数据类型,可以理解为是一种无序的数据(键值对)集合。

特点:可以详细的描述某个事物,是一个能够具体做事情的事物

作用:描述复杂的数据、封装代码

# 对象使用

//声明语法:
//构造函数写法
let 对象名 = new Object();

//字面量写法
let 对象名={
	属性名:属性值,
	方法名:函数(匿名函数)
}
  • 对象由属性和方法组成

    • 属性:信息或叫特征(名词)。
      • 比如:手机尺寸、颜色等
    • 方法:功能或叫行为(动词)。
      • 比如:手机打电话、发短信等
    • 注意:
      • 属性
        • 属性都是成对出现的,包括属性名和值,它们之间使用英文:分隔
        • 多个属性之间使用英文,分隔
        • 属性就是依附在对象上的变量(外面是变量,对象内是属性)
        • 属性名可以使用""或'',一般情况下省略,除非名称遇到特殊符号如空格、中横线等。
      • 方法
        • 方法是由方法名和函数两部分构成,它们之间使用:分隔
        • 多个属性之间使用英文,分隔
        • 方法是依附在对象中的函数
        • 方法名可以使用""或'',一般情况下省略,除非名称遇到特殊符号如空格、中横线等。
  • 属性

    • 添加属性

      //第一种
      对象名.属性名 =//第二种
      对象名[属性名] =
    • 属性访问

      声明对象,并添加了若干属性后,可以使用.或[]获得对象中属性对应的值,我们称之为属性访问。简单理解就是获得对象里面的属性值。

    console.log(对象.属性名)
    console.log(对象['属性名'])
    
  • 方法

    • 添加方法

      //第一种
      对象名.方法名 = function(){	}
      
      //第二种
      对象名[方法名] = function(){ }
      
    • 方法访问

      声明对象,并添加了若干方法后,可以使用.调用对象中函数,我们称之为方法调用。

      对象.方法名()
      

# 操作对象

对象本质是无序的数据集合,操作数据无非就是增、删、改、查。

  • 查询对象:

    对象.属性 或者 对象['属性']
    
    对象.方法()
    
  • 重新赋值:

    对象.属性 = 值
    
    对象.方法 = function(){}
    
  • 对象添加新的数据:

    对象.新属性名 = 新值
    
  • 删除对象中属性:

    delete 对象.属性名
    

新增一个属性时,首先会去对象里面找是否有这个属性,如果有则更改其值,如果没有则新增这个属性。

# 遍历对象

  • 对象没有像数组一样的length属性,所以无法确定长度。

  • 对象里面是无序的键值对,没有规律。不像数组里面有规律的下标

  • for in 循环,专门遍历对象的

    //语法:
    for (let 变量名 in 对象) {
    	console.log(对象[变量名])
    }
    
    //举例:
    let obj = {
    	uname:'小苏',
    	age:18
    }
    for (let k in obj) {
    	console.log(k)   //得到带字符串的属性名
    	console.log(obj[k])  //得到属性值
    }
    
    注意:
    	获取属性值是不用 对象名.k,会报undefined,应使用 对象名[k]
    	变量名一般用k表示,代表对象中的属性名,即k === 'uname' === 'age',所以当用obj[k]获取属性值时,k不能加''
    
  • 将其他类型转为字符串类型

    • null 和 undefined 不能够使用 .toString()
    • 只有对象类型才能 .toString()
    • 为什么数字类型和布尔类型可以使用
      • 因为数字和布尔类型也是对象的一种

# 内置对象

  • 内置对象是什么?

    JavaScript内部提供的对象,包含各种属性和方法给开发者调用

    document.write()
    console.log()
    
  • 内置对象Math

    • Math对象时JavaScript提供的一个“数学高手”对象

    • 提供一系列做数学运算的方法

    • 方法有:

      方法 含义
      random() 生成0-1之间的随机数(包含0不包含1)
      ceil() 向上取整(对0不公平,概率低,不推荐使用)
      floor() 向下取整
      round() 就近取整(.5往大取整) 四舍五入
      max() 找最大数
      min() 找最小数
      pow(x,y) 幂运算: x的y次方
      abs() 返回一个数的绝对值
  • 生成任意范围随机数

    • 生成0-10的随机数

      Math.floor(Math.random() * (10+1))
      
    • 生成5-10的随机数

      Math.floor(Math.random() * (5+1))+5
      
    • 生成N-M之间的随机数

      Math.floor(Math.random() * (M-N+1))+N
      

# 扩展

# 1. 术语解释
术语 解释 举例
关键字 在JavaScript中有特殊意义的词汇 let、var、function、if、else、switch、case、break
保留字 在目前的JavaScript中没意义,但未来可能会具有特殊意义的词汇 int、short、long、char
标识(标识符) 变量名,函数名的另一种叫法
表达式 能产生值的代码,一般配合运算符出现 10+3、age>=18
语句 一句代码也称之为一条语句,一般按用途还会分类:输出语句、声明语句、分支语句

# 2. 基本数据类型和引用数据类型
  • 简单数据类型又叫基本数据类型或者值类型,复杂类型又叫做引用类型

    • 值类型:简单数据类型/基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型
      • string、number、boolean、undefined、null
    • 引用类型:复杂数据类型,在存储时变量中存储的仅仅是地址(引用),因此叫做引用数据类型
      • 通过new关键字创建的对象(系统对象、自定义对象),如Object、Array、Date等
  • 堆栈空间分配区别:

    • 栈(操作系统):由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈;
      • 值类型(简单数据类型)的数据直接存放在变量(栈空间)中。
    • 堆(操作系统):存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。
      • 引用类型变量(栈空间)例存放的是地址,真正的对象实例存放在堆空间中。

# 数组(Object)

数组(Array)是一种可以按顺序保存多个数据的集合,属于对象类型的一种,数组是有长度的。

# 声明语法

1. 使用构造函数声明数组
let arr = new Array()

注意:
	构造函数内只有一个参数,则表示数组的长度
  let arr = new Array(10)  //数组的长度是10
  如果输入多个参数则表示数组的初始化
  let arr = new Array(10,'小苏',20)


2. []
let 数组名 = [数据1,数据2,数据3,,数据n]

例:let names = ['小明','小刚','小红','小丽','小米']
  • 数组是按顺序保存,所以每个数据都有自己的编号
  • 计算机中的编号从0开始(索引、下标)
  • 在数组中,数据的编号也叫索引或下标
  • 数组可以存储任意类型的数据

# 赋值语法

数组名[下标] = 值

例如:
	let arr = []
	arr[0] = '小苏'
	arr[1] = '小旭'

如果想修改数组的值,找对应的索引重新赋值即可。
	arr[0] = '小苏同学'

# 取值语法

数组名[下标]

例如:
	//取值小苏
	let arr = ['小苏','小旭']
	console.log(arr[0])

# 类型检测

# typeof

js提供了一个可以返回数据类型的关键字:typeof

// typeof用法
typeof 数据;
typeof(数据);

/*
	区别:
		typeof 数据	 :是一个语句,从左到右,优先检测左边的数据,再进行后续操作。
		typeof(数据) :是一个函数,会先执行完小括号里面的语句,再检测数据。
*/

例子:

// 函数式
console.log(typeof(123));				// number
// 语句式
console.log(typeof 123);				// number
console.log(typeof '123');				// string
console.log(typeof false);				// boolean
console.log(typeof null);				// object
console.log(typeof undefined);			// undefined

# instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

也可以理解为是否为某个对象的实例,typeof 不能区分数组,但 instanceof 则可以。

# 值类型与对象

下面是使用字面量与对象方法创建字符串,返回的是不同类型。

let name1 = "xiaosutongxue";
let name2 = new String("xstx");
console.log(typeof name1, typeof name2); //string object

只有对象才有方法使用,但在JS中也可以使用值类型调用方法,因为它会在执行时将值类型转为对象。

let name1 = "xiaosutongxue";
let name2 = new String("xstx");
console.log(name1.length); //13
console.log(name2.length); //4

# 类型转换

那么为什么需要类型转换呢?

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

  • 类型转换就是把一种数据类型的变量转换成我们需要的数据类型。

# 显式转换

  • 编写程序时过度依赖系统内部的隐式转换是不严谨的,因为隐式转换规律并不清晰,大多是靠经验总结的规律。
  • 为了避免因隐式转换带来的问题,通常根逻辑需要对数据进行显示转换。
  • 概念:自己写代码告诉系统该转成什么类型。

# 转换为数字型

  • Number()

    // 只有包含纯数字的字符串能被转换出具体的数字,否则结果是NaN.
    // NaN也是number类型的数据,代表非数字。
    Number('3000')  // 3000
    Number(null);	// 0
    Number(undefined);	// NaN
    
  • parseInt()

    // 转整数,且开头必须为正负号或者数字开头,且是连续的数字,如果遇到非数字则停止。
    parseInt('+50000axcds123')  //+50000
    	
    
  • parseFloat()

    // 可以保留小数,经常用于过滤单位(只能识别数字开头的)
    // 转小数,注意科学记数法e。
    // 开头必须为正负号或者数字开头,且是连续的数字,遇到第一个小数点,向后检测,如果后面是连续的数字则转出,如果遇到非数字或者第二个小数点则停止。
    parseFloat('3.14')
    parseFloat('3e2')  //300
    

# 转换为字符型

  • String()

  • 变量.toString()

  • 数据 + ' '

  • nullundefined 都不能使用 .toString() 转字符串

    • 数字转字符串要放在 括号 里,例如:(123).toString()

# 转换为布尔型

  • Boolean()

# 有6个值当false来看的

数据类型 转换成布尔值
undefined false
null false
0 和 NaN false
布尔值 false false
' ' false
对象 true

# 隐式转换

某些运算符被执行时,系统内部自动将数据类型进行转换,这种转换称为隐式转换。

# 转换规则:

  • + 号两边只要有一个是字符串,都会把另外一个转成字符串

  • 除了+ 以外的算术运算符 比如 - * / 等都会把数据转成数字类型

  • 在没有字符串类型的前提下,其他类型使用 + 也会存在一些隐式转换

    1、数字 + 字符串 :将数字转换为字符串
    2、数字 + boolean :将 boolean 转换为 number类型
    3、数字 + undefined :结果为 NaNNaN的类型为 number
    4、字符串 + boolean :将boolean 转换为 字符串
    5、boolean + boolean :都转换成number在做相加运算
    
    • console.log(1 + true) //2

      • 将数字类型转换为布尔类型 只有true 或者 false
      • 把布尔类型 true 或者 false 转为数字类型的话,true转为1,false转为0
    • console.log(1 + null) //null转为0

    • console.log(1 + undefined) //undefined是NaN

    • 缺点:

      • 转换类型不明确,靠经验才能总结
    • 小技巧:

      • +号作为正号解析可以转换成Number