JS 学习笔记--3--数据类型
1、typeof 操作符 用来获取变量或者字面量的类型,也可以typeof(x);但是typeof并非内置函 数,而是一个操作符变量
2、JS 一共6种类型 Undefined/Null/Boolean/Number/String/Object此六种类型
3、用typeof x;获取x变量或者字面量的类型返回的是上面6种类型的所有小写,并且Null类型的 变量返回的也是object
4、Unfined 类型:
就是在变量声明了但是没有赋初始值的元素var box;alert(typeof box);//unfined
alert(typeof age);age没有定义,但是同样会返回unfined,但是age逻辑上是不存在的
5、Null 类型:
Null类型的变量时要显示的赋值为null的(var box = null;)他表示一个空的对象引用,typeof box;返回的是object,可以用次类型来判断一个变量是否已经存在,如果变量被重新赋值则 box!=null 返回的是真;box 是一个空对象;而 var box={};是空的对象;
Undefined 是派生自 null 的,如果用 == 做相等性检查会返回为真 因为他们检查的其实是 值,但是逻辑上并不想等 用 typeof 来比较或者用恒等符 === 来比较,因为类型不一样
5、Boolean 类型:
Boolean 类型只有两个值 true 和 false;True 和 False 都不是Boolean类型的值,任 何类型的变量都能够隐试转换为 Boolean类型,
6、Number 类型: 包括两种类型数据 整形 和 浮点型
基本上数值字面量是十进制,也有八进制和十六进制,八进制必须以0开头,后面的数值必 须 是0到7之间的数,否则系统会自动去掉前导数值0,转换为十进制数据;十六进制数据必须 以0x开头,后面是0~9和A~F;
浮点型数据中数值必须包含一个小数点,并且小数点后面至少要一位数字,而且由于浮点数内存 比整数要大两倍,故系统会自动的将能够转换成整形的浮点数转换成整形(1、小数点后面 没有数值,2、小数点后面全部为0)。
过大或者过小的数据可以采用科学计数法表示数据1.2e3;1.2e-3分别表示1200和0.0012;
浮点数最高可以表示17位,但是算术运算中可能不会精确,故做判断的时候一定要考虑此问题, 比如0.1+0.2;返回的是 0.300000000000000004
可以用 Number.MAX_VALUE 和 Number.MIN_VALUE 获得浮点数表示的最大和最小值
如果超出了浮点数的范围会返回 Infinity (正无穷)和 -Infinity (负无穷),也可以用 Number.POSITIVE_INFINITY 和 Number.NEGATIVE_INFINITY 来获得正负无穷大 Infinity 和 -Infinity
要想判断某一个数是否超过了一个数是否超过了最大最小值范围 可以用 isFinite(x)函数
7、NaN : Not a Number是指那些本该返回一个number类型的值但是并不能够返回一个值
8、三种转换函数,可以讲其他类型的数据转换成 Number 类型的数据: Number(),parseInt(),parseFloat()
Number() 可以将任意类型的数据转换成 Number 数据类型, boolean中的true转换为1,false 转换为 0;null 对象转换成 0;数值型直接返回 unfined返回的是 NaN
如果是字符串,转换的规则包含以下:
1)、只是包含数值的字符串,会直接转换成十进制数值如果包含前导 0 即自动去掉
2)、如果只是包含浮点数的字符串,会直接转换成浮点数,如果包含前导和后导0会自动去掉
3)、如果是空字符串,直接转换成 0: Number('');//0
4)、如果不是以上三种类型 那么返回的是 NaN
如果是对象,首先会调用 valueOf()方法,然后确定返回值是否能够转换成数值,如果转换结果 是NaN,则基于这个返回值再调用 toString() 方法,再测试返回值
1 var box={
2 toString:function(){
3 return '123' //可以改为 字符串 'abc' 测试结果
4 }
5 };
6 alert(Number(box));//123
parseInt(): 转换的时候先看第一位是否是数值,如果是就一直返回直到连续的数值结束为止。
parseInt('12bca');//12 parseInt('hh23k');//NaN parseInt('12.45');//12 parseInt('');//NaN
parseInt() 也可以识别八进制和十六进制:
需要传递第二个参数 8,10,2,16中的一个,第二个参数代表的是前面带转换的数值的以什么进制来读取;
如果待转换的数据前面包含0x 则可以不传递第二位参数也OK
parseFloat() 用于转换成浮点数,和parseInt()一样从第一位开始解析,但是不认识十六进制同时只是认识一个小数点
8、String 类型: String类型就是由0到多个由16位Unincode编码组成的类型 即字符串,可以有单双引号成对出现来表示 任何类型的数据都可以转换成String类型,用 x.toString(),但是如果是 null 和 undefined 则需要用 String(x)方法来进行转换。如果待转换的字符串全是由数值组成则 toString() 可以传递一个参数,2,8,16,10 但是转换后的值是带有引号的值,
9、Object 类型: 采用new Object();的方式创建,可以传递参数,并且参数可以参与计算
10、下面这是练习中的源代码(EditPlus 3 编写),代码中注释很详细 运行时可以采用块注释(/* */)方法来慢慢查看效果
1 //alert("数据类型的练习");
2 /*------------- 数据类型 -------------*/
3 var box="abc";
4 alert(typeof box);// box 类型是 String; 值是 "abc"; 类型的返回值是 string
5 alert(typeof(box));//typeof 是操作符 不是函数
6
7 var box=100;
8 alert(typeof box);//box 类型是Number; 值是 100; 类型的返回值是 number
9
10 var box=true;
11 alert(typeof box);//box 类型是Boolean; 值是true; 类型的返回值是 boolean
12
13 var box;
14 alert(typeof box);//类型是 Undefined; 值是唯一的 undefined;类型返回值是undefined
15
16 var age=null;
17 alert(typeof age);//age 类型是Null,Null类型继承自Object类型,值为null 类型的返回值为object
18
19 var box={2:3,5:3};
20 var age=[2,5,7];
21 alert(typeof box);
22 alert(typeof age);//类型都是 Object; 返回的类型的值都是 object
23
24 function Get(){
25 alert("get函数!");
26 }
27 alert(Get); //返回的是函数的实体
28 alert(typeof Get);//typeof 操作符也可以对函数进行判断 返回为function,表名是一个函数
29
30
31 /*------------- Undefined 类型 -------------*/
32 //Undefined 类型只有一个特殊的值undefined:在用var声明变量的时候没有对其进行初始化
33 // 声明变量的时候没有必要进行赋值为undefined 因为系统会进行一个隐士的转换
34
35 //下面两个的类型返回值都是 undefined;但是逻辑上他们的值一个是undefined,一个报错
36 //古在定义变量的时候尽可能的不要只声明 不赋值
37 var box;
38 alert(typeof box);
39 alert(typeof age);//age is not defined
40
41
42 /*------------ Null 类型 ------------*/
43 //Null 类型是一个只有一个值的数据类型,特殊值null,表示一个空对象引用,typeof 时会返回 object
44 var box =null;
45 alert(typeof box);
46
47 // 如果此处定义一个变量时为了将来保存数据最好定义成 Null 类型的
48 var box=null;
49 box="abc";
50 if(box!=null)
51 {
52 alert("对象已经存在");
53 }
54
55 // undefined 是派生自 null 的,故想等性检查的时候返回为true
56 // 但是 并不是恒等(===) 恒等要求类型相等 故下面返回为两个false
57 // 故未初始化的变量和赋值为null的变量会相等,但是可以采用typeof或者恒等比较出他们呢并不想等
58 alert(undefined == null);//true
59 alert(undefined === null);//false
60 alert(typeof undefined == typeof null);//false
61 var box;
62 var age=null;
63 alert(box==age);//true
64 alert(typeof box==typeof age);//false
65 alert(box === age);//false
66
67
68
69 /*-------------- Boolean ------------*/
70 // Boolean 只有两个值 true,false 由于区分大小写 故True False 都不是Boolean的值
71 // 任何类型都都有对应的值准换成boolean的值
72 // 显示转换:
73 var hello="hello word";
74 var hello2 = Boolean(hello);
75 alert(typeof hello);//string
76 alert(typeof hello2);//boolean
77 alert(hello2);//true
78 // 隐式转换:String类型当字符串为空转换为false,
79 // Number非0数转换成true,包括无穷大,0和NaN转换成false
80 // Object类型 任何对象转换都为 true,除了 null;
81 // Undefined 类型只有一种值 转换后始终为 false
82 var box="strings";
83 if(box)//box 不为空 隐试转换为true
84 {
85 alert('真');
86 }else{
87 alert('假');
88 }
89 var box2='';
90 if(box2)//box2 为空 隐试转换为false
91 {
92 alert('真');
93 }else{
94 alert('假');
95 }
96
97 var num=0;
98 if(num)//num 为0 隐试转换为false
99 {
100 alert('真');
101 }else{
102 alert('假');
103 }
104 var num2=NaN;
105 if(num2)//num 为N2N 隐试转换为false
106 {
107 alert('真');
108 }else{
109 alert('假');
110 }
111
112 /*----------- 空对象和空的对象 -----------*/
113
114 //空的对象 表示声明了 但是还未初始化
115 var box={};//box 的类型是Object;值是 object Object;类型返回值是object
116 alert(box);//object
117 alert(typeof box);//object Object
118 //空对象 表示没有创建 就是一个null值
119 var age=null;
120 alert(age);//null
121 alert(typeof age);//object
122
123 //这个表示,你还没有创建对象,但先声明了对象引用而必须初始化的结果
124 //你还没有来得及创建对象,先声明一个对象的变量放在那边,默认初始化为null
125 var heighe=null;
126 //在不知道存放什么值的时候 字符串默认声明成空字符串 Number为0,Boolean为false或者true都可
127 var str='';//表示为空的对象
128 if(str!=null){
129 alert('不为空');
130 }else{
131 alert('为空');
132 }
1 /*---------- Number 类型 -------------*/
2 var box=250; //十进制数据
3 alert(box);//250
4 //八进制数据必须以0开头 并且后面每一位数不能够比7大,如果大于7会自动去掉前导0,处理为十进制数据
5 var box=065; //八进制数据
6 alert(box);//53 //十进制输出
7 var age=078; //十进制数据
8 alert(age);//78
9 //十六进制数据必须以 0x 开头 后面包含 0~9,a~f(可以大小写)
10 var box=0x1f; //十六进制
11 alert(box);//31 //十进制输出
12 var box =0x1A;
13 alert(box);
14
15 //浮点数 必须包含小数点 并且必须包含以为小数
16 var box=3.8;
17 alert(box);
18 //var age=03.8; //error 浮点数不能够包含前导 0
19 //alert(age);
20 var height=.8; //JS支持这中写法 但是最好不要这样写
21 alert(height);//0.8
22
23 //由于浮点数保存要比整数占的内存大一倍左右 故ECMAScript会自动将可以转换成整形数据的浮点数转换成整数
24 var num1=8.;
25 alert(num1);//8 //小数点后面没有数据 自动转换成8
26 var num2=12.0;
27 alert(num2);//12 //小数点后面为 0 自动转换成整形数据
28 //对于过大或者过小的数据采用科学计数法表示 e后面的数代表的是10的多少次方
29 var box=12.3e5;
30 alert(box);//1230000
31 var age=12.3e-5;
32 alert(age);//0.000123
33 //虽然浮点数最大可以保存17位小数,但是算术运算中可能会不精确,
34 //故在做判断的时候一定要考虑次问题,特别是整形判断
35 alert(0.3+0.4);//0.7
36 alert(0.1+0.2);//0.30000000000000004;
37
38 //浮点数的范围的最大值或者是最小值
39 alert(Number.MIN_VALUE);//5E-324 //必须将后面的写为大写
40 alert(Number.MAX_VALUE);
41 //超过其范围就会显示为 Infinity 和 -Infinity
42 alert(100e100);//1e102;
43 alert(100e1000);//Infinity
44 alert(-100e1000);// -Infinity
45
46 //通过 Number.POSITIVE_INFINITY 和 Number.NEGATIVE_INFINITY 得到正负无穷大
47 alert(Number.POSITIVE_INFINITY);//Infinity
48 alert(Number.NEGATIVE_INFINITY);// -Infinity
49
50 //通过 函数 isFinite(num) 判断一个数 num 是否是超过了范围 是返回true
51 alert(isFinite(100e1000));//false
52 alert(isFinite(100e100));//true
53
54 // NaN 即非数字(Not a Number),是指本来要返回一个数值的 但是却没有返回一个数值
55 // 于是就返回一个 NaN,这样就不会报错 在其他高级语言中是会报错的
56 // 在其他语言中 除数是不能够为 0的,但是ECMAScript中则可以为0 可以看出JS是一种弱语言
57 alert(5/0);//Infinity;
58 alert(2/0);//Infinity;
59 alert(0/0);//NaN
60 alert(5/0*0);//NaN
61 //可以通过Number.NaN操作来得到一个 NaN 数字 NaN与任何数据计算都是NaN 并且NaN 不与任何数据相等 包括本身
62 alert(Number.NaN);//NaN
63 alert(Number.NaN+4);//NaN
64 alert(Number.NaN == Number.NaN);//false
65 alert(0/0+5);//NaN
66 alert(NaN == NaN);//false
67 //可以通过函数 isNaN() 函数来判断一个数是否是NaN
68 alert(isNaN(0/0));//true
69 alert(isNaN(2/0));//false
70 alert(isNaN(5/0*0));//true
71 alert(isNaN("Lee"));//true 全字符的字符串不能够转换成数字
72 alert(isNaN('25'));//false '25' 先转换成数值 25 故不是NaN
73 alert(isNaN('25Lee'));//true 含有字符的字符串不能够成功转换成数字
74 alert(isNaN(true));//false true能够转换成数字1
75 //isNaN() 函数也适用与对象 在调用isNaN() 函数的过程中会首先调用 valueOf()
76 //方法,确定返回值能否转换成数值对象 如果不能够就基于这个返回值再调用 toString()方法
77 var box={};//true
78 alert(isNaN(box));
79 var age={
80 toString:function(){
81 return '123';
82 }
83 }
84 alert(isNaN(age));//false
85 alert(age);//123
86
87
88 /* ---- 三个数值转换函数 Number(),parseInt(),parseFloat(),---- */
89 //Number()是转型函数可以把任何类型转换成Number类型,但是另外两个只能够转换字符串
90 alert(Number(true));//1
91 alert(Number(25));//25 数值类型的数据直接返回
92 alert(Number(null));// 0
93 alert(Number(undefined));//NaN undefined类型转换以后返回的是NaN
94
95 // --------- 如果是只包含字符串则遵循以下规则
96 //1、如果是数值型的字符串,则会直接转换成十进制数据 同时去掉前导0
97 alert(Number('0234'));//234
98 //2、只是包含浮点数值的字符串 会自动将字符串转换成浮点数 并且去掉前导和后导0
99 alert(Number('06.80'));//6.8
100 alert(Number('005.7800'));//5.78
101 alert(Number('005.78.700'));//NaN
102 //3、如果字符串是空字符串 则直接转换成 0
103 alert(Number(''));//0
104 //4、如果不是上面三种类型的话 则直接返回 NaN
105 alert(Number('abc123'));//NaN
106 alert(Number('12abc'));//NaN
107 alert(Number('12hu45'));//NaN
108 //5、如果是对象 首先会调用这个方法的 valueOf()方法,然后确定返回值是否能够转换成数值
109 // 如果转换的结果是NaN 在基于这个返回值再调用 toSring()方法 在测试返回值
110 var age={
111 toString:function(){
112 return '123';
113 }
114 }
115 alert(Number(age));//123
116 var box={
117 toString:function(){
118 return 'abc';
119 }
120 }
121 alert(typeof box);//object
122 alert(Number(box));//NaN
123
124 //Number()函数在转换字符串的时候比较复杂且不怎么合理 故常用的是parseInt()和parseFloat()
125
126 alert(parseInt('123'));//123
127 alert(parseInt('123abc'));//123 会返回整数部分
128 alert(parseInt('abc123'));//NaN 如果第一个字符不是数字就返回为NaN
129 alert(parseInt('45abc123'));//45 从第一个开始取 到最后一个连续数值结束为止
130 alert(parseInt('56.12'));//56 小数点不是数值
131 alert(parseInt('056.12'));//56 自动去掉前导0
132 alert(parseInt(56.12));//56
133 alert(parseInt(''));//NaN 空值返回NaN,和全部是字符一个道理
134 var box={
135 toString:function(){
136 return '123';
137 }
138 }
139 alert(parseInt(box));//123
140 //识别八进制和十六进制 添加第二个参数 8,16
141 //如果为八进制数据是十六进制可以不添加的第二个参数,但是必须带上前导0x
142 //如果添加了第二个参数为 16 前面的前导0x就可以去掉,
143 //为了后期维护方便最好添加第二个参数的同时也添加上前导 0x
144 alert(parseInt('045'));//45
145 alert(parseInt('0x34'));52
146 alert(parseInt('070'));70
147 alert(parseInt('0x1fg'));//31
148 alert(parseInt('045',8));//37
149 alert(parseInt('45',8));//37
150 alert(parseInt('0x1fg',16));//31
151 alert(parseInt('1fg',16));//31
152 alert(parseInt('1e3'));//1 //不认识科学计数法
153
154 //parseFloat()和parseInt()是一样的 只是不认识八进制和十六进制
155 //只是认识一个小数点 认识科学计数法
156 alert(parseFloat('123abc'));//123
157 alert(parseFloat('0xa'));//0 //不认识十六进制
158 alert(parseFloat('0xa',16));//0 //不认识十六进制
159 alert(parseFloat('5.8h'));//5.8
160 alert(parseFloat('12.3.4'));//12.3 //只是认识一个小数点
161 alert(parseFloat('012.300'));//12.3 //自动去掉前导和后导0
162 alert(parseFloat('1.2e3'));//1200 //将科学计数法转换成普通的数值
163 alert(parseFloat('a5.8h'));//NaN
1 /*---------- String 类型 -------------*/
2 //String类型用于表示由0个或者多个16为的Unicode字符组成的字符序列,即字符串
3 //字符串可以用双引号或者单引号表示
4
5 //单引号和双引号都可以表示中间是一段字符串 但是必须成对使用不能嵌套使用
6 var box="string";
7 var age='string';
8 alert(age+'abcd');
9 alert(box+"abcd");
10 alert('abcd'+"abcd");
11 //alert('abcd"); //error
12
13 // JS 中同样以反斜杠 \ 代表转义字符
14 alert("ab\tcd");//制表符
15 alert("eg\rji");//回车符
16 alert("ss\nji");//换行符
17 alert("ac\bcd");//空格符
18 alert("ab\fcd");//进纸符
19 alert("ab\\cd");//ab\cd
20 alert("a\"b\'cd");//a"b'cd
21 // \xnn 表示以十六进制nn表示的一个字符(由ASCII码计算而得)
22 alert("\x41");//A
23 //\unnn 表示以十六进制代码 nnn 表示的一个Unicode字符
24 alert("\u03a3");//Σ
25
26 // JS 中的字符串变量的值同样是不可以改变的,若要改变某个变量保存的字符串的值
27 //首先要销毁原来的字符串,然后再用另外一个包含新的值的字符串变量来填充该变量
28 var box="abcd";
29 var age=box+"abcd";
30 alert(box);//abcd
31 box=age;
32 alert(box);//abcdabcd
33
34 //任何类型的数据都可以转换成字符串类型 x.toString()和 String(x)方法
35 var box=200;
36 alert(typeof box);//number
37 alert(typeof box.toString());//string
38 alert(typeof box);//number
39 alert(box.toString());// '200' 输出的内容是在内存中带了单引号的 '200'
40 box=true;
41 alert(typeof box);// boolean
42 alert(box.toString());// 'true' 是带了引号的 'true'
43
44 //一般进行 toString() 的时候是不需要传递参数的,但是在进行数值转化成字符串的时候,可以进行参数的传递
45 var box=12;
46 alert(box.toString()); //'12'
47 alert(box.toString(2)); //'1100'
48 alert(box.toString(8)); //'14'
49 alert(box.toString(16));//'c'
50 alert(box.toString(10));//'12'
51
52 // x.toString() 方法是无法将 Undefined 和 Null 类型进行转化的
53 var box=null;
54 alert(typeof box);
55 //alert(box.toString());//error
56 var age;
57 //alert(age.toString());//error
58
59 // 对于 Null 和 Undefined 类型的变量采用 String(x)方法将其进行转换
60 //String(x) 能够将任何类型的变量x进行转化成字符串类型
61 var box=null;
62 alert(String(box));//null
63 var age;
64 alert(age);//undefined
65 //如果值有 toString()方法 则调用该方法并返回相应的结果 如果是null或者undefined则返回null和undefined
66
67
68
69 /* 简单了解 Object 类型 */
70 //ECMAScript 中的对象其实就是一组数据和功能的集合,对象可以通过new操作符后
71 //跟上要创建的对象的类型名称类创建
72 var box=new Object();
73 alert(typeof box);// object
74 //Object()是对象构造 如果初始化的时候不需要传递参数 可以不写括号 但是最好不要这样写
75 var box=new Object;
76 alert(typeof box);// object
77
78 //Object()里面可以传递任何的对象,可以传递数值 字符串 布尔值 而且还可以进行计算
79 var box=new Object(2);
80 alert(typeof box);//object
81 var age=box+3;
82 alert(age);//5
83 alert(typeof age);//number //age的类型还是根据里面的值来定
84
85 var box=new Object(true);
86 var age=1;
87 if(box){ // box 类型是object 里面放的是布尔值 用于计算为 true
88 age++;
89 }else{
90 age--;
91 }
92 alert(age);// 2
93
94 //同样可以使用这种 new 操作符来创建其他的类型
95 var box=new Number(5); //或者是new Boolean(),new String()
96 alert(typeof box);//object
97 box++;
98 alert(box);//6