undefined
var a;
alert(a);//undefined
var a;
alert(typeof a);//undefined
alert(b);//在控制台会报错
alert(typeof b);//undefined
可以看出对于未初始化和未声明的变量执行typeof操作返回值都是undefined值。
null
null值表示一个空对象指针,所以在使用typeof操作符检测null值的时候会返回object。
var car=null;
alert(typeof car);//object
如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其他值。
alert(null==undefined);//true
尽管null和undefined有这样的关系,但是他们的用途完全不同,无论什么情况下都没有必要把一个变量的值显示的设置为undefined,但是,只要意在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null值。
boolean
该类型有两个字面值true和false
要将一个值转化为其对应的Boolean值,可以调用转型函数Boolean():
var a = "aenfiocwev";
var b = Boolean(a);
alert(b);//true
var a = "hello world";
if(a){
alert("a is true");//a is true
}
number
NaN(not a number)即非数值是一个特殊值。
NaN两个特点:(1)任何涉及NaN的操作(例如NaN/10)都会返回NaN
(2)NaN与任何值都不相等,包括NaN本身
alert(NaN == NaN);//false
针对NaN的这两个特点,定义了isNaN()函数,任何不能被转换为数值的值都会导致这个函数返回true。
alert(isNaN(NaN));//ture
alert(isNaN(10));//false(10是一个数值)
alert(isNaN("10"));//false(可以被转化为数值10)
alert(isNaN("blue"));//true(不能转化为数值)
alert(isNaN(true));//false(可以被转化成数值1)
isNaN()的确也适用于对象,在基于对象调用isNaN()函数时,会首先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值,如果不能,则基于这个返回值在调用toString()方法,再测试返回值。
有三个函数可以把非数值转化为数值:Number(),parseInt(),parseFloat()
(1).Number()
如果是Boolean值,true将被转化成1,false将被转化成0.
Number(true);//1
Number(false);//0
如果只是数字值,只是简单的传入和返回。
Number(1);//1
如果是null值,返回0。
Number(null);//0
如果是undefined,返回NaN。
Number(undefined);//NaN
如果是字符串则,如果字符串中只是数字,则将其转化为十进制数字,“1”转化为1,“011”转化为11(前导的零被忽略)如果字符串中包含有效的浮点格式,则将其转化为对应的浮点数值(前导的零被忽略),如果字符串中包含有效的十六进制,转化为相同大小的十进制数,如果字符串是空(不包含任何字符),则将其转化为0,如果字符串中包含除上述格式之外的字符,则将其转化为NaN。
Number("123");//123
Number("1.1");//1.1
Number("0xf");//15
Number("");//0
Number("###");//NaN
如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值,如果转换的结果是NaN,则调用对象的toString()方法,然后再依照前面的规则转换返回的字符串值。
var obj ={
name:"zhangsan",
age:20
}
Number(obj);//NaN
(2) parseInt()
parseInt()函数在转换字符串的时候,更多的是看其是否符合数值模式,它会忽略字符串前面的空格,直到找到第一个非空格字符,如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN。也就是说,parseInt()转换空字符串会返回NaN,而Number()转换空字符串会返回0。
parseInt("1234bule");//1234
parseInt("");//NaN
parseInt("0xA");//10(十六进制)
parseInt("70");//70
其中这个有一些特殊
parseInt("070");
在ECMAScript3JavaScript引擎中,"070"被当做八进制字面量,转化为十进制为56.
而在ECMAScript5JavaScript引擎中,parseInt()已经不具备解决八进制值的能力,因此前导的零会被认为无效,结果等到十进制的“70”。
为了消除以上困惑,这个函数提供了第二个参数,转换时使用的基数(即多少进制)
parseInt("0xAF",16);//175
实际上如果指定了16作为第二个参数,字符串可以不带前面的“0x”
parseInt("AF",16);//175
parseInt("AF");//NaN
多数情况下,我们要解析的都是十进制数值,因此始终将10作为第二个参数是非常必要的。
(3)parseFloat()
parseFloat()也是从第一个字符开始解析每一个字符,一直解析到字符串末尾,或者遇到一个无效的浮点数字字符为止。也就是说字符串中第一个小数点是有效的,而第二个小数点就是无效的了,因此它后面的字符串会被忽略。
parseFloat("22.33.44")//22.33
parseInt()始终会忽略前导的零,parseFloat()对于十六进制的字符串始终会被转化为0,由于parseFloat()只解析十进制数,因此它没有用第二个参数来指定基数的用法。如果字符串包含一个可解析为整数的数(没有小数点,或者小数点后面都是零),parseFloat()会返回整数。
parseFloat("1234blue");//1234
parseFloat("0xA");//0
parseFloat("22.3");//22.3
parseFloat("22.33.44");//22.33
parseFloat("0908.5");//908.5
parseFloat("3.125e5");//312500
string
var lang = "Java";
lang = lang + "Script";
变量lang开始时包含字符串“Java”,而第二行代码把lang的值重新定义为“Java”与“Script”的组合,即"JavaScript”,实现这个操作的过程如下:首先创建一个能容纳10个字符的新字符串,然后在这个字符串中填充“Java”和“Script”,最后一步销毁原来的字符串“Java”和字符串“Script”,因为这两个字符串已经没有用。这些是在后台发生了,影响浏览器拼接字符串的速度,现在已经解决。
var age = 11;
var ageAsString = age.toString();//字符串"11"
var found = "true";
var foundAsString = found.toString();//字符串"true"
多数情况下,调用toString()方法不必传递参数。但是在调用数值的toString方法时,可以传递一个参数:输入数值的基数(即多少进制),默认情况,toString()方法以十进制格式返回数值的字符串表示,而通过传递基数,toString()可以输出以二进制,八进制,十六进制,乃至其它有效进制格式表示的字符串值。
var num = 10;
alert(num.toString());//默认情况十进制"10"
alert(num.toString(2))//"1010"
alert(num.toString(8))//"12"
alert(num.toString(10))//"10"
alert(num.toString(16))//"a"
如果在不知道要转换的值是不是null或者是undefined的情况下,可以使用转型函数String(),这个函数可以将任何类型的值转化为字符串。String()函数遵循下列转换规则:
1.如果值有toString()方法,则调用该方法并返回相应结果;
2.如果值是null,则返回“null”
3.如果值是undefined,则返回“undefined”
var value1 = 10;
var value2 = true;
var value3 = null;
var value4;
alert(String(value1));//"10"
alert(String(value2));//"true"
alert(String(value3));//"null"
alert(String(value4));//"undefined"
这里先后转换了4个值:数值,布尔值,null,undefined,数值和布尔值的转换结果与调用toString()方法得到的结果相同,因为null和undefined没有toString()方法,所以String()函数就返回了这两个值的字面量。
object
ECMAScript中的对象其实就是一组数据和功能的集合,对象可以通过执行new操作符后跟要创建的对象类型的名称来创建,创建Object类型的实例并为其添加属性和方法,就可以创建自定义对象,如下:var o = new Object();
仅仅创建Object的实例并没有什么用处,关键要理解重要思想:即在ECMAScript中Object类型是所有它的实例的基础,Object所具有的任何属性和方法也同样存在于更具团体的对象中。
Object的每一个实例都具有下列属性和方法。
(1)constructor:保存着用于创建当前对象的函数,对于当前的例子而言,构造函数(constructor)就是Object().
(2)hasOwnProperty(propertyName):用于检查给定的属性在当前对象事例中(而不是在实例原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串的形式制定(例如:o.hasOwnProperty("name"))
(3)isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型
(4)propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举,与hasOwnProperty()方法不一样,作为参数的属性名必须以字符串形式指定。
(5)toLocalString():返回对象的字符串表示,该字符串与执行环境的地区对应。
(6)toString():返回对象的字符串表示
(7)valueOf():返回对象的字符串,数值或布尔值表示。通常与toString()方法的返回值相同。