美文网首页JavaScript 进阶营
JavaScript学习之路-数据类型

JavaScript学习之路-数据类型

作者: LeoZzz | 来源:发表于2019-04-28 10:26 被阅读0次

一、数据类型

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的相关基本数据类型,如有不足之处,欢迎指正。下篇文章我们会讲解函数,尽情期待!

相关文章

网友评论

    本文标题:JavaScript学习之路-数据类型

    本文链接:https://www.haomeiwen.com/subject/rqbxnqtx.html