JavaScript数据类型

114 阅读10分钟

数据类型

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+’岁');  输出:我今年18console .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: 拼接字符串和变量

符号: ` ` (反引号)

内容拼接变量时,用 ${} 包住变量

1648216166224.png

模板字符串下:

1648216185351.png

作用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>