JavaScript学习之路-数据类型
一、数据类型
1.前言
最近会把读《Javascript高级程序设计(第三版)》 密码:2vp3
这本书的一些要点,一一分享给大家,这是第一篇基本数据类型。我已经把此书的网盘链接分享出来了,有兴趣的可以看下,JavaScript进阶必看。
2.类型
ECMAScript有5种基本数据类型:undefined、Null、Boolean、Number、String ; 一种复杂数据类型 Object; 当然还有ES6新增数据类型 Symbol ,标示独一无二的值。
1).typeof操作符
由于下面很多例子都用到这个操作符,所以先提前讲解下,这个操作符其实就是检测数据类型的。
typeof undefined ===> undefined
typeof boolean ===> boolean
typeof string ===> string
typeof number ===> number
typeof object(**null**) ===> object
typeof function ===> function
2).undefined 类型
未经初始化的类型即为undefined;因此我们没有必要显示的给未初始化的变量显式的设置为undefined,因为它已经默认了,未初始化的值就会取undefined值
var data; alert(data == undefined)//true
这地方有一个需要大家注意的地方,未声明的变量和未初始化的变量在使用typeof
操作符的时候都会返回undefined
//这个变量声明但为初始化 默认值:undefined
var message;
console.log(typeof message);//undefined
console.log(typeof a);//a 为声明
虽然未初始化的变量会默认设置为undefined,但是我们显式的初始化变量时设置undefined也是很明智的选择,因为这样我们可以通过typeof操作符返回undefined时,来检测变量是还没声明,而不是尚未初始化。
3).Null类型
Null类型只有一个值就是null,它指向一个空指针对象,所以用typeof
操作符检测的时候,返回Object。当我我们定义一个变量用来保存对象的时候,我们最好把这个变量初始化为null,这样一来我们只需要检测null值就可以知道相应的变量是否已经保存了一个对象的引用。
var o = null;
if(o != null){do something.....}
更有趣的是 null 和 undefined 是相等的(==) 如:
console.log(null == undefined);//true
undefiend实际上派生之null值的。上面的例子中操作符 ==
总是返回 true,其实它们比较的时候 是转换为相关操作数再比较的,之后的文章会讲到。
4).Boolean类型
Boolean类型,感觉在开发过程中是用到最多的类型之一了吧。就俩个值:true
/ false
,需要注意的是 由于JavaScript 是区别大小写的,TRUE和FALSE, 并不代表布尔值,只是一个简单的标识符。要讲其他类型的值转换为Boolean,只需要调用Boolean(xxx)
数据类型 转换为true的值 转换为false的值
Boolean true false
String 任何非空字符串 ''(空字符串)
Number 任何非0数字(包括无穷大) 0 和 NaN(非数字类型not a number)
Object 任何不为null的对象 null
Undefined 无 undefined
5).Number类型
最基本的数据类型就是十进制:var a = 10;
八进制:八进制第一位必须是0,然后数字序列(0-7)如果字面值中的数字超出了范围,那么前面的零会忽略,后面的数字被当作十进制去解析:
var oc1 = 070; 八进制的 56 > 7 * (8 * 1);
var oc2 = 079 ; 无效的八进制 解析为79;
var oc2 = 08 ; 无效的八进制 解析为8;
八进制在严格模式下无效,会保错
十六进制:前俩位是0x,后跟任何十六进制数字(0-9,A-F(可大写也可小写))
var h = 0xA ; // 十六进制10
var b = 0x1f; // 十六进制的31
Number保存的最小数字是:Number.MIN_VALUE
这个值是5e-324。
保存的最大值保存在Number.MAX_VALUE
这个值是 1.7976931348621357e+308; 如果在计算过程中超出了数值范围的话,就会返回一个无穷大 Infinity
或者 -Infinity
,这里注意不管是正无穷大还是负无穷大都不能参与运算。如果想判断一个数字是不是有穷的(最大和最小之间的数字),可以使用 isFinite()
函数,如下例子:
isFinite(2);//true
isFinite(NaN);//false
6).NaN
NaN,即非数值(not a number),它其实是一个特殊的数值,用来表示一个本来要返回数值的操作数未返回数值的情况。
NaN有俩个很非同寻常的特点,即任何涉及NaN的操作都返回NaN,NaN不与任何值相等
console.log(NaN/10);//NaN
console.log(NaN==NaN);//false
其中有个函数用来判断某个值是不是 不是数字。
console.log(isNaN(1));//false
console.log(isNaN('10'));false 可以转换为数字10
console.log(isNaN(true));//false 转换数字1
console.log(isNaN(NaN));//true
console.log(isNaN('s'));//true 不能转换为数字
isNaN()
也其实适用对象,调用对象的时候,首页调用对象的valueOf()
方法,然后确定该方法是否可以转换为数字,如果还是不能转换,就调用toString()
方法,再继续测试是否可以转换为数字。
其中有三个函数可以把非数值转换为数值:Number()
parseInt()
parseFloat()
;
Number()
:可以用于任何数据类型;它的转换规则如下:
①:如果是Boolean的值,true和false分别转换为 1 和 0;
②:如果是数字值,只是简单的传入和返回;
③:如果是null,则返回0;
④:如果是undefined则返回NaN;
⑤:如果是字符串中只包含数字(包括正负),则转换为十进制 Number('0')=>0; Number('123')=>123 Number('012')=> 12
;如果字符串中包含浮点数字的,则返回相应的浮点数值;如果字符中含有十六进制的格式,则这转换为相同大小的十进制数。
⑥:如果字符串为空,则转换为0
⑦:如果字符中包含上述之外的字符,则返回 NaN;
⑧:对象,调用对象的时候,首页调用对象的valueOf()
方法,然后确定该方法是否可以转换为数字,如果还是不能转换,就调用toString()
方法,再继续按照上述规则测试返回的字符串;
parseInt()
:用于字符串转换为数值;它会忽略前面的空格,直到找到第一个非空字符串,如第一个字符串不是数字字符或者负号,它会返回NaN, 所以 它转换空字符的时候 返回NaN; 如果第一个是数字符串,它会继续解析第二个。直到解析完或者遇到了一个非数字字符。它还能识别各种进制的数字字符,例子:
parseInt(123red)===> 123
parseInt(22.5) ==> 22(小数点不是有效的数字符)
parseInt("");NaN
parseInt('OxA')://10 十六进制转换十进制
parseInt('070');//56 八进制
parseInt("70");// 70 十进制
其实 这个函数还提供了第二个参数,转换是使用的基数(多少进制)
parseInt('0xAF',16);//175
parseFloat()
:这个函数和parseInt函数一样,不过这个函数在第一个小数点是有效的,第二个小数点就无效了。; 该函数始终忽略前导0,所以十六进制始终返回0,并且只解析十进制;还有一个要注意的是:如果要解析的字符串是一个可解析为整数的数(没有小数点,或者小数点后都是零)则返回整数。如下🌰:
parseFloat('1234bbbb');//123
parseFloat('0xAF');//0
parseFloat('22.5');//22.5
parseFloat('22.34.5');//22.34
parseFloat('098.5');// 98.5
parseFloat('3.125e7');// 3125000
7).String类型
字符串类型,字符串可以使用单引号''
或者双引号""
标示。这俩种字符串的解析是一样的,不像PHP字符串的那样。但是以双引号开始,必须以双引号结束,单引也是一样。
字符串中有一些特殊的字符字面量,也叫转义字符。如下:
字面量 含义
\n 换行
\t 制表
\b 空格
\r 回车
\f 进制
\\ 斜杠
\' 单引号 在字符串中使用
\" 双引号 在字符串中使用
如要获得字符串的长度可以使用length属性;
字符串创建之后就不能改变了,要想改变必须销毁原来的字符串,然后用一个新的字符串填充该变量。
如果想把一个值转换为字符串有俩种方法:
① toString():每个字符串都有该方法,返回字符串的一个副本。对象、数值、布尔值、字符串都有该方法。但是undefined和null没有。这个方法也可以传一个参数 标示输出 多少进制。
② String(): 这个方法可以将任何值转换为字符串;转换规则:如果该值有toString方法,则调用;如果是 null 则返回 “null” ; 如果是 undefined 则返回 "undefined"
console.log(String(10));// '10'
console.log(String(true));// 'true'
console.log(String(null));// 'null'
var par1;
console.log(String(par1));// 'undefined'
8).Object类型
在ECMAScript中 对象就是数据和功能的结合体,对象可以通过new操作符跟要创建的对象类型名称来创建
var o = new Object()
每个对象都有下列属性和方法:
① Constructor: 保存着用于创建当前对象的函数;上面的例子 constructor 就是 Object()
② hasOwnProperty(propertyName): 检测给定属性是否存在改对象实例中 ,参数属性名必须是字符串
③ isPrototypeOf(object) :检测传入的对象是否是另一个对象的原型(后期会写相关文章)
④ propertyIsEnumerable(propertyName): 检测属性是否能够用 for-in语句枚举 参数必须是字符串
⑤ toLocaleString() 返回对象的字符串标示,该字符串与执行环境的地区对应
⑥ toSting() 返回对象的字符串标示
⑦ valueOf() 返回对象的字符串、数值 或 布尔值 .返回对象的原始值 方法用来把对象转换成原始类型的值(数值、字符串和布尔值) 默认情况下, valueOf() 会被每个对象Object继承。每一个内置对象都会覆盖这个方法为了返回一个合理的值,如果对象没有原始值,valueOf() 就会返回对象自身
注意:如果我们没有重新定义valueOf和toString,其隐式转换会调用默认的toString()方法,将函数本身内容作为字符串返回;
如果我们自己重新定义toString/valueOf方法,那么其转换会按照我们的定义来,其中valueOf比toString优先级更高
例子:
function fn() {
return 20;
}
console.log(fn + 10);
console.log(fn + 'hello');
fn.toString = function() {
return 10;
}
console.log(fn + 10);
console.log(fn + 'hello');
fn.valueOf = function() {
return 5;
}
console.log(fn + 10);
console.log(fn + 'hello');
// 输出结果分别是多少?
function fn() {
return 20;
}10
function fn() {
return 20;
}hello
20
10hello
15
5hello
二、总结
以上就是我们JavaScript的相关基本数据类型,如有不足之处,欢迎指正。下篇文章我们会讲解函数,尽情期待!