JavaScript高级程序设计第三章基本概念——基本数据类型

undefined
在使用var声明变量但未对其进行初始化时,这个变量的值是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而不是其他值。
实际上,undefined值是派生自null值的,

alert(null==undefined);//true
尽管null和undefined有这样的关系,但是他们的用途完全不同,无论什么情况下都没有必要把一个变量的值显示的设置为undefined,但是,只要意在保存对象的变量还没有真正保存对象,就应该明确的让该变量保存null值。
boolean

该类型有两个字面值true和false

要将一个值转化为其对应的Boolean值,可以调用转型函数Boolean():

var a = "aenfiocwev";
var b = Boolean(a);
alert(b);//true
数据类型                    转换为true的值                                转换为false的值
Boolean                         true                                                   false
String                        任何非空字符串                                      “”(空字符串)
Number                    任何非零字符(包括无穷大infinity)         0和NaN
Object                           任何对象                                              null
Undefined                      不适合                                            undefined
这些转换规则对于理解流控制语句(如if语句)自动执行相应的Boolean转换非常重要。
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
字符串可以由双引号和单引号来表示,都是正确的。
任何字符串都可以通过访问其length属性取得其长度。
(1)字符串特点:ECMAScript中的字符串是不可变的,也就是说,字符串一旦创建,它们的值就不能改变。要改变某个变量保存的字符串,首先要销毁原来的字符串,然后在用另一个包含新值的字符串填充该变量,例如:
var lang = "Java";
lang = lang + "Script";
变量lang开始时包含字符串“Java”,而第二行代码把lang的值重新定义为“Java”与“Script”的组合,即"JavaScript”,实现这个操作的过程如下:首先创建一个能容纳10个字符的新字符串,然后在这个字符串中填充“Java”和“Script”,最后一步销毁原来的字符串“Java”和字符串“Script”,因为这两个字符串已经没有用。这些是在后台发生了,影响浏览器拼接字符串的速度,现在已经解决。
(2)转换为字符串
要把一个值转换为字符串有两种方式toString()和String()
toString():这个方法唯一要做的就是返回相应值的字符串表现 (null和undefined值没有这个方法,其余的每个值都有toString()方法)

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()方法的返回值相同。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值