# 计算机程序可以处理大量的数据,为什么要给数据分类?
- 更加充分和高效的利用内存
- 也更加方便程序员的使用数据
# JS的数据类型整体分为两大类:
简单数据类型(值类型)
- Number
- Boolean
- String
- null
- undefined
复杂数据类型(引用类型)
- Object
# 简单数据类型
# Number(数字型)
JavaScript中的正数、负数、小数等统一称为数字类型。
在控制台输出 蓝色。
小数与小数相加存在精度问题,例如:0.1 + 0.2 ≠ 0.3
最大值
:Number.MAX_VALUE,这个值为: 1.7976931348623157e+308
最小值
:Number.MIN_VALUE,这个值为:5e-32
Infinity
:代表无穷大,大于任何数值
-Infinity
:代表无穷小,小于任何数值
NaN
:Not a number,代表一个非数值
# Boolean(布尔型)
- 表示肯定或否定时在计算机中对应的是布尔类型数据。
- 它有两个固定的值
true
和false
,表示肯定的数据用 true(真),表示否定的数据用 false(假)。 - 在控制台输出 蓝色。
- 布尔值很少是直接赋值得到的,都是从结果中得到,主要利用布尔值进行判断。
# String(字符串型)
- 字符串是个伪数组。
- 通过
单引号('')
、双引号("")
或反引号(``)
包裹的数据都叫字符串,单引号和双引号没有本质上的区别。 - 在控制台输出 黑色
- 单引号或双引号一定要成对使用,支持互相嵌套,使用规则:外双内单或外单内双。
- 必要时可以使用转义符
\
,输出单引号或双引号。
# 模版字符串
符号:``
优点:支持换行,使开发更高效。
//内容拼接变量时,用 ${} 包住变量
document.write(`姓名:${name},年龄${age}`)
# 转义字符
转义符 | 解释说明 |
---|---|
\n | 换行符,n是newline的意思 |
\ \ | 斜杠 \ |
\' | '单引号 |
\" | "双引号 |
\t | tab缩进 |
\b | 空格,b是blank的意思 |
# null(空值)
- null用于定义一个空对象,即如果变量要用来保存引用类型,可以在初始化时将其设置为null。
- 在控制台输出 灰色。
//null表示值为空
let obj = null
/*
通常都是在结果中得到的
如果点取消,就得到null
如果什么都没输入,点确认,变量里相当于存了空字符串
*/
let age = prompt('请输入年龄:')
# null 和 undefined 区别:
- null表示变量没有值
- undefined表示变量已被声明,但是并未赋值。
# null开发中的使用场景:
- 官方解释:把null作为尚未创建的对象
- 大白话:看将来有个变量里面存放一个对象,如果还没准备好对象,可以放个null
# undefined(未定义)
未定义是比较特殊的类型,只有一个值undefined。
只声明变量,不赋值的情况下,变量的默认值就是undefined。(一般很少直接为某个变量赋值为undefined)
在控制台输出 灰色。
未赋值与未定义的变量值都为
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()
数据 + ' '
null
和undefined
都不能使用.toString()
转字符串- 数字转字符串要放在 括号 里,例如:(123).toString()
# 转换为布尔型
- Boolean()
# 有6个值当false来看的
数据类型 | 转换成布尔值 |
---|---|
undefined | false |
null | false |
0 和 NaN | false |
布尔值 false | false |
' ' | false |
对象 | true |
# 隐式转换
某些运算符被执行时,系统内部自动将数据类型进行转换,这种转换称为隐式转换。
# 转换规则:
+
号两边只要有一个是字符串,都会把另外一个转成字符串除了
+
以外的算术运算符 比如-
*
/
等都会把数据转成数字类型在没有字符串类型的前提下,其他类型使用
+
也会存在一些隐式转换1、数字 + 字符串 :将数字转换为字符串 2、数字 + boolean :将 boolean 转换为 number类型 3、数字 + undefined :结果为 NaN,NaN的类型为 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