数据类型
1,为什么需要数据类型
a.在计算机中不同的数据占据的存储空间是不一样的,根据存储空间不同划分数据类型;
b.js是弱类型动态语言,js变数据类型只有在程序运行过程中,根据等号右边来判断的,
运行完毕后,变量就确定了数据类型;
c.js用于动态类型,同时也意味着相同的变量可用作不同类型
2,数据类型种类
一,基本数据类型
1,String 字符串
定义:JavaScript中无论单引号(‘ ’)还是双引号(“ ”) 反引号(` `)包裹起来的数据字符串;
a.字符串型可以是引号中的任意文本,单双引号本质上没有区别,但js中我们推荐使用单引号;
b.js单双引号可互相嵌套,但不能自己嵌套自己(外双内单,或者外单内双),而且单双引号必须成对使用;
c.字符串内换行需要转义符,都是用\开头,并且写到引号里面;
必要时可以使用转义符 \ ,输出单引号或双引号
var str1="我是一个'高富帅'\n程序员" (n 是newline的换行意思,\b是空格blank)
d.字符串的拼接:多个字符串之间可以使用*+进行拼接*,
//拼接方式:字符串+任何类型=拼接之后的字符串;
console.log('沙漠'+18); 输出:沙漠18
console .log('我今年‘+age+’岁'); 输出:我今年18岁
console .log(`我今年${age}岁`); 输出:我今年18岁 模板字符串 反引号 ${变量名}
e.运算符两侧如果有一个字符串和一个是数字 会把字符串转换成数字再去比较
console.log('2' > 19)
f.运算符两侧如果都是字符串的比较,那么会先进行第一个值的比较
'2'和'1'先做比较,如果'2'>'1',得出结果,就不会再往下去判断, 如果不行,就会判断'2'和'9'的值,一次类推
console.log('2' > '19')
2,Number 数值
在JS中所有的数值都是Number类型(整数和小数)
3,Boolean 布尔值
布尔型只有两个值:true和false
布尔类型和数字相加时,true的值为1,false的值为0;
任何非零数值都是true, 包括正负无穷大, 只有0和NaN是false
任何非空字符串都是true, 只有空字符串是false
任何对象都是true, 只有null和undefined是false
4,Null 空值
表示赋值了,但内容为空;
从语义上看null表示的是一个空的对象。所以使用typeof检查null会返回一个Object
undefined值实际上是由null值衍生出来的,所以如果比较undefined和null是否相等,会返回true
5,Undefined 未定义
Undefined这是一种比较特殊的类型,表示声明变量 未赋值,这种类型只有一种值就是undefined
二,引用数据类型
1,Object 对象
2,function 函数
3,array数组
三,基本数据 引用数据 区别
简单类型又叫做基本数据类型或者值类型,复杂类型又叫做引用类型。
值类型:简单数据类型/基本数据类型,在存储时变量中存储的是值本身,因此叫做值类型 string ,number,boolean,undefined,null
引用类型:复杂数据类型,在存储时变量中存储的仅仅是地址(引用),因此叫做引用数据类型 通过 new 关键字创建的对象(系统对象、自定义对象),如 Object、Array、Date等
堆栈空间分配区别:
(共同点:栈和堆都是存放数据的地方)
1、栈(操作系统):由操作系统自动分配释放存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈; 简单数据类型存放到栈里面
值类型(简单数据类型): string ,number,boolean,undefined,null 值类型变量的数据直接存放在变量(栈空间)中
适合存放具体大小的数据,这些数据一般不会太大
let num = 100;
let show = true;
let msg = '你好'
2、堆(操作系统):存储复杂类型(对象),一般由程序员分配释放,若程序员不释放,由垃圾回收机制回收。 引用数据类型存放到堆里面
引用类型(复杂数据类型):通过 new 关键字创建的对象(系统对象、自定义对象),如 Object、Array、Date等 引用类型变量(栈空间)里存放的是地址,真正的对象实例存放在堆空间中
适合存放可能经常改变大小的数据,这些数据变化比较大
let person = {}
person.name = '悟空' //增加数据的属性
delete person.name //删除了数据的属性
let arr = []
基本数据类型和引用数据类型 底层原理
#例1
//基本数据类型
let num = 10
function changNum(n){
let n = num //复制了一份数据给n
n = 100 //n的改变对num没有影响,m还是原来的值10
}
changeNum(num)
console.log(num) //输出 10
//对比 引用数据类型
let person = {
name:'悟空'
}
function changePerson(obj){
obj.name = '八戒'
}
changePerson(person) //输出 八戒
#例2
let num = 100 //基本数据类型 复制,新旧两个数据 互不影响
let num2 = num //num 复制了一份给 num2
num2 = 10000 //给num2重新赋值,但是不会影响原来的num
console.log(num) //100 num还是原来的值,不会受num2影响
let person = {userName:'悟空'} //引用数据类型
let person2 = person //引用地址的传递,person的值会受到person2后面变化的影响
person2.userName = '八戒'
console.log(person) //输出八戒
3,typeof检测数据类型
和C语言一样, 使用typeof关键字可以用来检查数据类型。
使用格式:typeof 数据,例如 typeof 123; typeof num;
let num = 1;
let userName = '翠花';
let isRain = true;
let foods;
let money = null;
console.log(typeof num); //num
console.log(typeof userName); //string
console.log(typeof isRain); //boolean
console.log(typeof foods); //undefined
console.log(typeof null ); //对象数据类型obj */
4,数据类型的转换
A 转换为字符串类型
1.将number类型转换为字符串类型;
2.将boolean类型转换为字符串类型;
3.将undefined类型转换为字符串类型;
4.将null类型转换为字符串类型;
在js中如果想将以上四种数据类型转换为数值类型,常用的三种方法:
1,变量名称.toString()
对于number和Boolean类型来说,可以通过 **变量名称.toString()**转换;
/*声明并赋值数字123给value*/
let value = 123;
/把value的值转换成字符串 并赋值给str
let str = value.toString();
//打印并输出value的值
console.log(str);
//检查value的数据类型,在谷歌浏览器控制台 字符串 的是number类型是 灰色的;
//检查value的数据类型,在谷歌浏览器控制台 数字 的是number类型是 蓝色的;
console.log(typeof str);
//错误写法: 注意点:不能使用常量直接调用.toString()方法,因为常量是不能改变的;
let str2 = 123.toString();
2,String(常量or变量)
通过String(常量or变量);转换为字符串;
let value = undefined;
console.log(value); //undefined
console.log(typeof value); // undefined;
//以下代码含义:根据传入的数据重新生成一个新的字符串,并不是修改原有的值;
let str = String(value);
console.log(str); // ’undefined‘
console.log(typeof str); //string
3, + 隐式转换
还可以通过 变量or常量 + (空字符串 " " / ' ') 利用+拼接字符串**的方法转换为字符串/隐式转换
+ 号两边只要有一个是字符串,都会把另一个转换为字符串;
//写法一:
//value通过隐式转换成字符串 并赋值给str
let value = 123;
let str = value+""; //通过加空字符串转换
console.log(str); //123
console.log(typeof str); //string;
//写法二:把 num1 转换成字符串
let num1 = 123;
let str = 123 + '' //通过加空字符串转换
console.log(str); //123
console.log(typeof str); //string;
B 转换为数字类型
1.将String类型转换为数值类型;
2.将Boolean类型转换为数值类型;
3.将undefined类型转换为数值类型;
4.将null类型转换为数值类型;
在js中如果想将以上四种数据类型转换为数值类型,常用的三种方法:
1,parseInt和parseFloat
parseInt,可以把字符型转变为整数数字型;
parseFloat,可以把字符型转变为浮点型数字型;
注意点:
parseIn/parseFloat都会从左至右的提取数值,一旦遇到非数值就会立即停止;
停止的时候如果还没有提取到数值,那么就会返回NaN;
parseIn/parseFloat都会将传入的数据当做字符串来处理
var age=prompt('请输入你的年龄');
console.log(parseInt(age));
console.log(parseInt('3.14')); //输出3,取整
console.log(parseInt('3.94px')); // 输出3,取整,去掉单位
2,Number(常量or变量)
通过Number(常量or变量);方式转换为数值类型;
如果都是数值,那么正常转换,转成数字本身;
如果字符串中没有数据或者只有空格,那么转换的结果为0;
如果字符串中的数据不仅仅是数值,那么转换的结果为NaN;
NaN===not a number
a 字符串类型转换为数字类型
//数字本身
let str = "123";
let num = Number(str);
console.log(num); //123
console.log(typeof num); //number
//数字带非数字
let str = "123abc";
let num = Number(str);
console.log(num); //NaN
b 布尔类型转换为字符串
true 转换为 1;
false 转换为 0;
//如果是布尔类型的true,那么转换后结果是1;
let flag = true;
//如果是布尔类型的false,那么转换后结果是0;
let flag = false;
//因为flag的值为false,所以转换为数字类型后变成1
let num = Number(flag);
console.log(num); //输出0
console.log(typeof num); // string
c空类型:null
如果是空类型,那么转换后结果是0;
d未定义类型:undefined
undefined,那么转换的结果为NaN
总结:
1.空字符串 / false / null 转换后都是0;
2.字符串中不仅仅是数字 / undefined 转换后是NaN;
let num1 = '123abcd'
let num2 = Number(num1); //NaN
3.其他的正常转换
3, - * / 隐式转换
利用算数运算 - * / 隐式转换方式转换为数值类型;
(因为任何的值和字符串做- * / %法运算, 都会先把字符串转换为Number,再做运算)
onsole.log('12'- 0); //输出12 数字类型
console.log(‘123’-‘120’); // 输出整数3
let num3 = num2 - 0; //num3数字类型
console.log( typeof num3);
console.log('2' > 19) /*运算符两侧如果有一个字符串和一个是数字 会把字符串转换成数字再去比较*/
/最简洁的写法:
let num = '1';
let num2 = +num; //1,数字类型
4,加号+ 在变量前面加
/*需求
1弹出一个输入框,输入一个数字 num1
2弹出一个输入框,输入一个数字 num2
求console.log(num1+num2)*/
let num1 = +prompt('请输入一个数字') //(不加 +号 会默认成为字符串的拼接)
let num2 = +prompt('请输入一个数字')
console.log(num1 + num2); //number 类型
let num4 = num2; //字符串
let num4 = +num2; //数字
/最简洁的写法:
let num = '1';
let num2 = +num; //1转换为了数字类型
C 转换为布尔类型
1.将Number类型转换为布尔类型;
只有数值是0才会转换为false,其他数值都是true;
如果是NaN也会转换为false,因为NaN的数值类型本身是number;
2.将String类型转换为布尔类型;
只要字符串中有内容都会转换为true(空格也会); 字符串没有内容 (空字符串) 则会转换为false;
3.将undefined类型转换为布尔类型;
undefined会转换为false;
4.将null类型转换为布尔类型;
null会转换为false;
重点总结!!!!!:空字符串 / 0 / NaN / undefined / null / false / ` ` ** 会转换为false,其他的都是true;
在js中如果想要将基本数据类型转换为布尔类型,那么只需要调用Boolean(常量or变量);
let str = "abc";
let flag = Boolean(str);
console.log(flag); //true
console.log(typeof flag); //boolean
5,模板字符串
作用1: 拼接字符串和变量
符号: ` ` (反引号)
内容拼接变量时,用 ${} 包住变量
模板字符串下:
作用2: 把内容 输出到 body标签中
1.模板字符串内可以把一个标签形式的字符串重新插入body标签里,通过document.write()输出到页面;
2.如果不换行,用哪种引号都可以,
如果换行了,那么只能用 反引号
document.write( ` <h1>我是标题1</h1>` )
document.write( '<h1>我是单引号</h1>' )
document.write( "<h1>我是双引号</h1>" )
document.write( `
换行了要用反引号 ` )
3.只要是写标签字符串,都可以使用反引号-模板字符串
4.快速输出方法:不要直接在 字符串里面 一个个字母 地写标签
在现在的body标签中,使用快捷键生成标签,然后再复制回去
案例:使用模板字符串*${}和反引号*输出内容到body中
//可以在头部设置css样式
<script>
let name = prompt("请输入商品名称");
let price = prompt("请输入商品价格");
let Number = prompt("请输入商品数量");
let sum = prompt("请输入商品总价");
let addres = prompt("请输入收货地址");
let table = document.write( ` <table >
<caption>订单付款页面</caption>
<tr>
<td>商品名称</td>
<td>商品价格</td>
<td>商品数量</td>
<td>总价</td>
<td>收获地址</td>
</tr>
<tr>
<td>${name}</td>
<td>${price}</td>
<td>${Number}</td>
<td>${sum}</td>
<td>${addres}</td>
</tr>
</table>`)
</script>