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 =https://www.it610.com/article/= 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的值BooleantruefalseString任何非空字符串''(空字符串)Number任何非0数字(包括无穷大)0 和 NaN(非数字类型not a number)Object任何不为null的对象nullUndefined无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 ; // 十六进制10var 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)===> 123parseInt(22.5) ==> 22(小数点不是有效的数字符)parseInt(""); NaNparseInt('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类型 【JavaScript学习之路-数据类型】在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; }10function fn() { return 20; }hello2010hello15 5hello

二、总结 以上就是我们JavaScript的相关基本数据类型,如有不足之处,欢迎指正。下篇文章我们会讲解函数,尽情期待!

    推荐阅读