javaScript数据类型
六种简单的数据类型:Undefined、Null、Boolean、Number、String、Symbol(ES6新增,表示独一无二的值)
一种复杂数据类型——Object
数据类型内存的存储和引用可以参考:JS中简单数据类型和复杂数据类型在内存中的存储和引用
-
Undefined类型
在使用var声明变量但未对其加以初始化时,这个变量的值就是undefined。也就是说undefined是变量的默认值。
举个例子:下图a和b变量显示的结果是一样的
var a=undefined;
console.log(a) //undefined
console.log(a==undefined) //true
var b
console.log(b) //undefined
console.log(b==undefined) //true
对未初始化和未声明的变量执行typeof操作符(检测变量数据类型)返回的是值都是undefined(见下图),所以建议定义变量时要自己初始化一下,这样当typeof操作符返回的值为undefined时,我们就可以清楚的知道该值没有定义。
-
Null类型
null值表示一个空对象指针。
- 由于null是一个空对象指针,所以(typeof null) 的返回值是"object"
- 由于undefined值派生于null值,所以(undefined==null)返回的是true
- 只要意在保存对象的变量还没真正保存对象,就应该明确地让该变量保存null值。
-
Boolean类型
该类型只有两个字面值true和false。
true和false是区分大小写的,所以True和False以及其他混合大小写形式)都不是Boolean值,只是标识符。
可以对任何数据类型的值调用 Boolean()函数,而且总会返回一个 Boolean 值。至于返回的 这个值是 true 还是 false,取决于要转换值的数据类型及其实际值。下表给出了各种数据类型及其对应的转换规则。
var mes='micky'
var mesBoolean = Boolean(mes)
数据类型 | 转换为true的值 | 转换为false的值 |
Boolean | true | false |
String | 任何非空字符串 | ""(空字符串) |
Number | 任何非零数字值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | / | undefined |
-
Number类型
该类型表示整数和浮点数值。
最基本的数值字面量格式是十进制整数,如果要表示八进制的话,第一位必须是0,后跟八进制序列(0~7)。如果要表示十六进制的话,前两位必须是0x,后跟十六进制数字(0~9和A~F)。
- 八进制字面量在严格模式下是无效的。
- 如果八进制字面值中的数据超出了范围,则前面的零会被忽略,后面的数字当作十进制处理。
- 在进行算术计算时,八进制和十六进制最终都会被转换成十进制进行计算。
1)浮点数值
浮点数值就是该数值中必须包含一个小数点,并且小数点后至少有一位数字,最高精度是17位小数。
当小数点后没有数字,例如 2. ,或者浮点型本身就是一个整数,例如 2.0,都会被自动转换成整数。
极大和极小的数值,可以用科学计数法表示的浮点数值表示。
var floatNum = 3.125e7 //等于 31250000
在默认情况下,ECMAScript会将那些小数点后面带有6个零以上的浮点数值转换成以科学计算法表示的数值。
浮点计算的通病js也有,就是计算时精确度远远不如整数。
例如按理说0.1+0.2=0.3,而真实的结果居然是0.30000000000000004,所以 0.1+0.2==0.3 返回值是false!但是 0.1+0.3==0.4 返回值又是true。好吧,注意就好,认真就输了。
2)数值范围
大多数浏览器中,最小值是5e-324,最大值是1.7976931348623157e+308。其实一般情况下不会超出表示范围。
JavaScript能表示并进行精确算术运算的整数范围为:正负2的53次方,也即从最小值-9007199254740992到最大值+9007199254740992之间的范围;对于超过这个范围的整数,JavaScript依旧可以进行运算,但却不保证运算结果的精度。
3)NaN
NaN,即非数值(Not a Number)是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况。
这解释有点绕,直接看代码吧。
先简单点解释下isNaN()函数,该函数用于检查其参数是否是非数值。如果是数值,就返回false。如果不是数值,会尝试转换成数值,转换后是数值就返回false,无法为转换成数值就返回ture。
(例如ture转成了1; '10'转成了10; 而对象的话就是先调用valueOf()方法,看它返回值是否是数值,如果不是再用它的返回值调用toString()方法,再测试返回值)
console.log(isNaN(NaN)) //true
console.log(isNaN(10)) //false(10是一个数值)
console.log(isNaN('10')) //false(可以被转换成数值10)
console.log(isNaN('blue')) //ture(不能被转换成数值)
console.log(isNaN(ture)) //false(可以被转换成数值1)
var o = new String('10')
console.log(isNaN(o)) //false (调用对象o的valueof()方法,返回值是数值10)
再来强调NaN两个非同寻常的特点:首先,任何设计NaN的操作(例如NaN/8)都会返回NaN。其次是NaN与任何值都不相等,包括NaN本身!这小子连自己都不认了 -0-。
4)数值转换
有三个函数可以把非数值转成数值:Number()、parseInt()和parseFloat()。Number()可以用于任何数据类型,其余两个专门把字符串转换成数值。
三个函数的详细转换规则可以参考该博客:阳光下的冷静的js数值转换
Number()函数转换规则,这里直接举个例子简单了解下。
var num1 = Number("Hello world!"); //NaN 因为其中不包含任何有意义的数字值
var num2 = Number(""); //0 空字符串会被转换成0
var num3 = Number("000011"); //11 忽略了其前导0
var num4 = Number(true); //1 ture值则被转换为1
由于Number()函数在转换字符串时比较复杂而且不合理,因此在处理整数的时候更常使用parseInt()函数。而又因为使用一个参数的parseInt()解析八进制字面量的字符串,ES3和ES5是存在分歧的,比如
var num = parseInt("070")
console.log(num) //ES3认为是56(八进制),而ES5认为是70(十进制)
因此转换时我们最好使用parseInt()的第二个参数——转换时使用的基数(即多少进制),这样可以保证得到正确的结果,比如:
var num1 = parseInt("10",2); //2
var num2 = parseInt("10",8); //8
var num3 = parseInt("10",10); //10
var num4 = parseInt("10",16); //16
parseFloat()转换数值几个典型示例
var num1 = parseFloat(“1234blue”)`; //1234 遇到无效的浮点数字字符'b'就停止解析了
var num2 = parseFloat("oxA")`; //0 同上
var num3 = parseFloat("22.5")`; //22.5 正常解析
var num4 = parseFloat("22.34.5")`; //22.34 遇到第二个小数点也停止解析
var num5 = parseFloat("0908.5"); //908.5 忽略前置零
var num6 = parseFloat("3.125e7"); //31250000 解析整数,则输出的值为整数
-
String类型
String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由双引号( " )或者单引号( ' )表示。
该类型也包含一些特殊的字符字面量,即转义序列,用于表示非打印字符,或者具有其他用途的字符。比如 '\n'(换行)、'\t'(制表)等。
任何字符串的长度可以通过访问其lenth属性取得,一个转义序列表示一个字符
var text = 'ok!\n'
alert( text.length) //4
转换为字符串
要把一个值转换成一个字符串有两种方式,第一种是几乎每个值都有的toString()方法,null和undefined没有toString()方法。在不知道转换值是不是null或者Undefined的情况下,可以使用第二种转型函数String()来转换。
toString()一般不用传递参数。在调用数值的toString()方法时,默认是以十进制输出,如果想输出二进制的话,则可以用toString(2)输出,其他进制同理。
要把某个值转换成字符串,也可以使用加号操作符把它与一个字符串("")加在一起。
var x = 10;
alert(x.toString()) //字符串'10'
alert(x.toString(2)) //字符串'1010'
var y = true;
alert(y.toString()) //字符串'true'
var z
// alert(z.toString()) //报错!
alert(String(z)) //字符串'undefined'
alert(z+"") //字符串'undefined'
-
Object类型
ECMAScript中的对象其实就是一组数据和功能的集合。
对象可以通过执行new操作符后跟要创建的对象类型的名称来创建,创建Object对象如下所示:
var o = new Object()
每个Object类型的实例共有的属性和方法:
- constructor: 保存着用于创建当前对象的函数。
- hasOwnProperty:用于检测给定的属性在当前对象的实例中是否存在。
- isPrototypeOf : 用于检查传入的对象是否是当前对象的原型
- propertyIsEnumerble : 用于检查给定属性能否使用for-in来枚举
- toLocaleString() : 返回对象的字符串表示。
- toString() : 返回对象的字符串表示。
- valueOf() : 返回对象的字符串,数值,或布尔表示。通常和toString() 返回的值相同。
Object类型是所有对象的基础,因此所有对象都具有这些基本的属性和方法。
简单点说:当创建一个对象时,这个对象的数据类型就是Object,并且拥有Object的属性和方法,如下图所示
注意:array和function都是属于object的子类,原因如下,详细可参考该博客:JS内置Function对象详解
var myArray=[];
//等价于
var myArray=new Array();
//同样,下面的两段代码也都是创建一个函数myFunction:
function myFunction(a,b){ return a+b; }
//等价于
var myFunction=new Function("a","b","return a+b");
-
Symbol数据类型
ES6 引入了一种新的原始数据类型Symbol
,表示独一无二的值。
ES5 的对象属性名都是字符串,这容易造成属性名的冲突。比如,你使用了一个他人提供的对象,但又想为这个对象添加新的方法(mixin 模式),新方法的名字就有可能与现有方法产生冲突。如果有一种机制,保证每个属性的名字都是独一无二的就好了,这样就从根本上防止属性名的冲突。这就是 ES6 引入Symbol
的原因。
详细可以参考阮一峰老师的博客http://es6.ruanyifeng.com/#docs/symbol
以上内容参考自《JavaScript高级程序设计(第3版)》,再加上一些个人理解,还是小白学习阶段,如果理解有误,望各路大神指出。
引用了一些博客,如侵权请联系本人删除。