JavaScript的数据类型详解
基本类型:Undefined、Null、Boolean、Number、String
对象类型:Object(包括Array、Function、Date、Json等)
在五种基本数据类型之外的都被称为Object类型。也就是说,总的来看,JavaScript的数据类型可以分为6种。
基本数据类型的值是不可变的。
两个术语:基本数据类型的实例被称为“值”,Object类型的实例被称为“对象”。
typeof 操作符
检测当前变量的数据类型的方法,也就是typeof关键字.
通过
typeof关键字,对这5种数据类型会返回下面的值(以字符串形式显示)
undefined ---------- 如果值未定义
Undefined
boolean ---------- 如果这个值是布尔值
Boolean
string ---------- 如果这个值是字符串
String
number ---------- 如果这个值是数值类型
Number
object ---------- 如果这个值是对象
Object或
null
function ---------- 如果这个值是函数
需要注意的是
typeof null
返回为
object,因为特殊值
null被认为是一个空的对象引用。
例:
typeof null; //"object"
typeof 1; //"number"
typeof "1" //"string"
Undefined
Undefined类型只有一个值,即特殊的
undefined。
undefined是只读变量,赋值不会出错,但也不起作用。
在使用
var声明变量但
未对其加以初始化时,这个变量的值就是
undefined。
var message;
alert(message==undefined); //ture
往往用来表示出乎意料的空,一般表示你写的程序有错误
。
Null
Null类型是只有一个值的数据类型,这个特殊的值是
null。
null值表示一个
空对象指针。只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值。而这也正是使用
typeof操作符检测
null时会返回
object的原因。
typeof null; //object
往往用来表示意料之中的空,空对象不能添加自定义属性等东西。
null值没有对应的Null类,所以对其进行点运算会产生TypeError异常.
null.toString(); //TypeError: nullhas no properties .
实际上,undefined值是派生自null值的,因此ECMA-262规定对它们的相等性测试要返回true。
即console.log(
undefined == null
); //
true
null与undefined有什么区别
答:
null 表示一个对象被定义了,值为“空值”,而
undefined 表示不存在这个值。
正因为这个原因,所以使用
typeof判断是,
null返回的是
object,而
undefined返回的是
undefined。(判断两者时需要使用
===严格判断)
不论在什么情况下没有必要把一个变量的值显示的设置为undefined,但对与null,只要意在保存对象的变量还没有真正保存对象,就应该明确地让该变量保存null值,这样做可以体现null作为空对象指针的惯例。
Boolean
该类型只有两个字面值:true和false。
这两个值与数字值不是一回事,因此true不一定等于1,而false也不一定等于0。
JavaScript中所有类型的值都有与这两个Boolean值等价的值。调用类型转换函数Boolean(),可将一个值转换为其对应的Boolean值。
var message = 'Hello World'; var messageAsBoolean = Boolean(message)
转换为布尔值
数据类型
|
转换为true的值
|
转换为false的值
|
Boolean
|
true
|
false
|
String
|
任何非空的字符串
|
""(空字符串)
|
Number
|
任何非0数值(包括无穷大)
|
0和NAN
|
Object
|
任何对象
|
null
|
Undefined
|
不适用
|
undefined
|
Boolean类型在进行判断的时候设置为 0、-0、null、""、false、undefined 或 NaN,则该对象设置为 false。否则设置为 true(即使 value 参数是字符串 "false")
Number
这种类型用来表示
整数和浮点数值(不区分两者),还有一种
特殊的数值,即NaN(非数值 Not a Number)。
Js中的数据是不分类型的,所有数据都是以64位浮点数形式存储,即8Byte.
十进制:var intNum = 55;
八进制:var octalNum1 = 070; //56 (八进制第一位必须是0,数字序列0~7)
var octalNum2 = 079; //79 (无效的八进制数值)
十六进制:var hexNum1 = 0xA; //10 (前两位必须是0x,数字序列0~9及A~F或a~f)
var hexNum2 = 0x1f; //31
在进行算术计算时,所有八进制和十六进制都被转换为十进制。
NaN(Not a Number)
这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。例如,在其他编程语言中,任何数值除以0都会导致错误,从而停止代码执行。但在JavaScript中,任何数值除以0会返回NaN,因此不会影响其他代码的执行。
NaN本身有两个非同寻常的特点。
1.任何涉及NaN的操作(例如NaN/10)都会返回NaN,只要计算过程出现一次NaN,结果便是NaN.
2.NaN与任何值都不相等,包括NaN本身。例如,下面的代码会返回false。
alert
(NaN == NaN); //false
isNaN函数:接受一个参数,参数可以是任何类型,该函数帮我们确定这个参数是否“不是数值”
alert(isNaN(NaN)); //true
alert(isNaN("blue")); //ture(不能转换成数值)
alert(isNaN(10)); //false(10是一个数值)
alert(isNaN("10")); //false(可以转换成数值10)
alert(isNaN(ture)); //false(可以转换成数值1)
数值转换
a.显性转化
Number() :用于任何数据类型
布尔值会转换为1和0。
null值返回0,undefined返回NaN
字符串:
只包含数字-->十进制数字
"123"-->123
"1.1"-->1.1
"011"-->11 (八进制前导零被忽略)
“0xf”-->15 (有效的十六进制转换为等大小的十进制整数值)
字符串为空-->0
字符串包含以上格式之外的字符则转换为NaN
函数、json、未定义和对象会变成NaN(not a number)
特殊的数组如果为空或一个数据时会根据里面的数据像字符串一样去转,多个数据时变成NaN
parseInt ():用于把字符串转换成数值
会忽略字符串前面的空格,直至找到第一个非空格字符,如果第一个非空格字符不是数字字符或负号,parseInt()就会返回NaN。如果第一个字符是数字字符或负号,则会继续解析第二个,从左到右直至碰到非数字后,将前面的输出(会认识一些特殊符号,如+-空格)。
var num1 = parseInt("1234blue"); //1234 (blue被忽略)
var num2 = parseInt(""); //NaN (转换空字符串时会返回NaN)
如果parseInt()函数第一个字符是数字字符,也可以识别出各种整数格式。
var num3 = parseInt("0xA"); //10 (十六进制)
var num4 = parseInt("070"); //56 (八进制)
[注]
var num5 = parseInt("70"); //70 (十进制)
var num6 = parseInt("22.5"); //22 (小数点不是有效的数字字符)
[注]:ECMAScript 3 JavaScript引擎中,parseInt()可以解析八进制;而在ECMAScript 5 JavaScript引擎中,parseInt()不具备解析八进制的能力。产生了分歧,因此,可以给parseInt()使用两个参数:
parseInt(b,n) 前面是数字,后面代表转为n进制
var num1 = parseInt("AF",16); //175 (可省略“0x”)
var num2 = parseInt("10",2); //2 (按二进制解析)
var num3 = parseInt("10",8); //8 (按八进制解析)
var num4 = parseInt("10",10); //10 (按十进制解析)
parseFloat ()
会保留1个小数点后面的部分
var b = ”175.23.56” 会变成175.23,只会看第一个小数点和第一个小数点后边的数字。
b.隐式类型转换
+ 除了数字加数字 其余的如数字和字符串相加 运算时都会转换为
字符串的连接
- * / % 会让数字字符串和数字的运算结果转换成
数字类型
++ -- 可以让数字字符串转换成数字
> < 会让字符串和数字的比较正确显示,但是两个字符串不行。
如:'10'>9和'10'>'9',字符串的比较是一位一位的比较,第一位如果比出来后面就不会再比较了。
! 取反,一个字符串或数字放在if判断里为真,所以取反会变成false,最后结果一定是布尔值
== 如果两边相同(即使不同类型,如:'2'和2),就相等
=== 会判断类型,如果类型不同即使相同则返回false
无论是哪种转换方法,如果无法转换就会返回NaN
String
String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串字面量需要用双引号或单引号括起来。
赋值:
var s = "nihao"; //将字符串值“nihao”赋给变量s
var s1 = s; //将变量s的值赋给s1
+连接:
var s1 = "012";
var s2 = "345";
var s3 = s1+s2;
print(s3); //变量s3的值为"012345"
+=连接并赋值:
var s = "012";
s += "345";
print(s); //s的值为"012345"
字符串值不可变:
var s = "012";
var s1 = s;
s += "345";
print(s1); //s1的值为"012"
var s1 = "some text";
var s2 = s1.substring(2);
var s3 = new String("some text");
|
但是不同于原始的字符串,String对象是一个真正的对象。
typeof s1; //"string"
typeof s3; //"object"
|
Object
Object本质上是由一组无序的
名值对
组成的。
object可以添加自定义属性 obj.abc = 123;也可以写成obj={“abc”:”123”}
JavaScript的数据类型的转换
逻辑与 &&
遇到false就返回
如都是ture返回最后一个
逻辑或 ||
遇到true就返回
如果都不满足时 返回最后一个
与的优先级大于或
JavaScript还提供了包装对象,如:
var n = new Number(123); // 123,生成了新的包装类型
var b = new Boolean(true); // true,生成了新的包装类型
var s = new String('str'); // 'str',生成了新的包装类型
虽然包装对象看上去和原来的值一模一样,显示出来也是一模一样,但他们的类型已经变为object了!所以,包装对象和原始值用===比较会返回false。如:
typeof new Number(123); // 'object'
new Number(123) === 123; // false
所以不要使用包装对象!尤其是针对string类型!