第三章 数据类型

变量

使用var定义的变量是局部变量

省略var所定义的变量是全局变量

   

   

typeof

typeof操作符

typeof是一个操作符而不是函数,因此例子中的圆括号尽管可以使用,但不是必需的。

   

   

数据类型

ECMAScript中有5种简单数据类型(也称为基本数据类型):UndefinedNullBooleanNumberString

使用typeof可能返回以下值:

   

"undefined"——如果这个值未定义;

"boolean"——如果这个值是布尔值;

"string"——如果这个值是字符串;

"number"——如果这个值是数值;

"object"——如果这个值是对象或null

"function"——如果这个值是函数。

   

   

undefined

该类型只有一个值,为初始化的变量的值就是undefined

未初始化未声明的变量使用typeof,都会返回undefined

   

null

该类型只有一个值null。

null类型表示一个空对象指针,故使用typeof返回object。

位于nullundefined之间的相等操作符(==)总是返回true,不过要注意的是,这个操作符出于比较的目的会转换其操作数(本章后面将详细介绍相关内容)。

 

Boolean

该类型只有两个值。

转型函数Boolean()可以将其他数据类型转换为Boolean 

以下是转换规则

数据类型

转换为true

转换为false

Boolean 

true

false 

String 

任何非空字符串

空字符串""

Number

任何非零值

0和NaN

Object

任何对象

null 

Undefined 

不适用

undefined 

 

Number

1.整型:

八进制:012

十六进制:0x1f

   

2.浮点数值:最高精度17位

   

3.NaN:计算产生错误的返回值,它不与任何值相等包括自身

isNaN()函数确定参数是不是数值或是否可以被转换成数值,若不可以返回true:

alert(isNaN(NaN)); //true

alert(isNaN(10)); //false10是一个数值)

alert(isNaN("10")); //false(可以被转换成数值10

alert(isNaN("blue")); //true(不能转换成数值)

alert(isNaN(true)); //false(可以被转换成数值1

isNaN也可用于对象,该函数会调用对象的valueOf方法,确定返回值是否可以转为数值,若不能再调用toString()测试其返回值

   

4.数值转换

三个函数可以将非数值转换为数值:Number(),parseInt(),parseFloat()

Number()

Boolean:true-->1,false-->0

null:0

undefined:NaN

字符串:空字符串-->0

"00021"-->21(0被忽略,不会视为八进制)

"0x21"-->对应的十进制

其余:NaN

对象:调用valueOf()方法,根据前面规则返回值。如果返回NaN,再进一步 调用toString()方法。

   

parseInt()

可以解析字符串的某个部分,能识别更多的整数格式(如八进制)

var num1 = parseInt("1234blue"); // 1234

var num2 = parseInt(""); // NaN

var num3 = parseInt("0xA"); // 10(十六进制数)

var num4 = parseInt(22.5); // 22

var num5 = parseInt("070"); // 56(八进制数)

var num6 = parseInt("70"); // 70(十进制数)

var num7 = parseInt("0xf"); // 15(十六进制数)

   

然而,ECMAScript 3 JavaScript引擎将"070"当作八进制,ECMAScript 3 JavaScript5引擎将其当作十进制。

故应制定该函数的第二个参数:

var num1 = parseInt("AF", 16); //175

var num2 = parseInt("AF"); //NaN

   

parseFloat()

从第一个字符开始,到字符串结尾或遇到一个无效的浮点数字符

函数只能解析十进制,故十六进制字符串返回0

var num1 = parseFloat("1234blue"); //1234 (整数)

var num2 = parseFloat("0xA"); //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

1.字符字面量

转义序列

   

2.字符串特点

一旦创建,不能改变

var str = "java";

str = str + "Script";

上述过程其实创建了一个新字符

   

3.转为字符串

toString()

除了null和undefined外,其余值都有该方法。

   

数值调用该方法可以传递一个参数,表示转为多少进制的字符串。

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"

   

   

String()

在未知所转换值是否是null或undefined时,使用该方法。

   

如果变量是null或undefined时,返回"null"或"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"

 

Object

Object类型是所有它的实例的基础。

Object的每个实例都有下列的属性和方法:

   

constructor:保存着用于创建当前对象的函数。对于前面的例子而 言,构造函数(constructor)就是Object()

hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例

如:o.hasOwnProperty("name"))。

isPrototypeOf(object):用于检查传入的对象是否是传入对象的原型(第5章将讨论原型)。

propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句(本章后面将会讨论)来枚举。

toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应。

toString():返回对象的字符串表示。

valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同。

   

   

   

   

操作符

位操作符:

有符号整数,第32位保存符号,负数以二进制补码表示。

   

1.按位非

var num1 = 25; //二进制00000000000000000000000000011011

var num2 = ~num1; //二进制11111111111111111111111111100110

// num2 = -26

   

2.按位与

var result = 25 & 3;

alert(result); //1

   

25 = 0000 0000 0000 0000 0000 0000 0001 1001

3 = 0000 0000 0000 0000 0000 0000 0000 0011

---------------------------------------------

AND = 0000 0000 0000 0000 0000 0000 0000 0001

   

3.按位或

var result = 25 | 3;

alert(result); //27

   

4.按位异或

var result = 25 ^ 3;

alert(result); //26

   

5.左移

var oldValue = 2; // 等于二进制的10

var newValue = oldValue << 5; // 等于二进制的1000000,十进制的64

   

6.有符号右移

有符号的右移操作符由两个大于号(>>)表示,这个操作符会将数值向右移动,但保留符号位(即正负号标记)。

   

7.无符号右移

无符号右移操作符由3个大于号(>>>)表示,这个操作符会将数值的所有32位都向右移动。对正数来说,无符号右移的结果与有符号右移相同。

   

布尔操作符:

1.逻辑非!

逻辑非操作符由一个叹号(!)表示,可以应用于ECMAScript中的任何值。无论这个值是什么数据类型,这个操作符都会返回一个布尔值。逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其求反。

   

2.逻辑与&&

同上,它是短路操作符

   

3.逻辑或||

1

   

乘性操作符:

如果操作数不是数值类型,后台将会调用Number()方法。

   

加性操作符:

1.加法

字符串+数值:数值转为字符串

字符串+字符串:直接拼接

   

如果是数值infinity+字符串="infinity字符串"

2.减法

如果有一个操作数是字符串,则调用Number()方法。

   

关系运算符:

1.两个数值,直接比较值得大小

2.两个字符串,比较字符编码值

3.一个数值和一个字符串,先将字符串转为数值(若不能转换,返回false)

4.两个对象,调用对象的valueOf方法获取值,如果没有该方法则调用toString()。

5.一个是布尔,则将其转为数值

   

相等操作符:

1.相等和不相等

一个是布尔,将其转换为数值

一个是字符串,另一个是数值,将字符串转为数值

一个是对象,另一个不是,对象调用valueOf方法

两个都是对象,判断是否是同一个对象

null和undefined是相等的

两个都是NaN,相等返回false

   

2.全等和不全等

在两个操作数不转换下依然相当的情况下,返回true

   

var result1 = ("55" != 55); //false,因为转换后相等

var result2 = ("55" !== 55); //true,因为不同的数据类型不相等

   

条件操作符:

variable = boolean_expression ? true_value : false_value;

   

赋值操作符:

简单的赋值操作符由等于号(=)表示,其作用就是把右侧的值赋给左侧的变量

   

逗号操作符:

使用逗号操作符可以在一条语句中执行多个操作,如下面的例子所示:

var num1=1, num2=2, num3=3;

语句

if语句

   

do-while语句

   

while语句

   

for语句

   

for-in语句

for-in语句是一种精准的迭代语句,可以用来枚举对象的属性。以下是for-in语句的语法:

for (property in expression) statement

下面是一个示例:

for (var propName in window) {

document.write(propName);

}

   

break语句

   

continue语句

   

with语句

with语句的作用是将代码的作用域设置到一个特定的对象中。

   

定义with语句的目的主要是为了简化多次编写同一个对象的工作,如下面的例子所示:

var qs = location.search.substring(1);

var hostName = location.hostname;

var url = location.href;

上面几行代码都包含location对象。如果使用with语句,可以把上面的代码改写成如下所示:

with(location){

var qs = search.substring(1);

var hostName = hostname;

var url = href;

}

   

switch语句

switch语句在比较值时使用的是全等操作符,因此不会发生类型转换。

(例如,字符串"10"不等于数值10

switch (expression) {

case value: statement

break;

case value: statement

break;

case value: statement

break;

case value: statement

break;

default: statement

}

   

   

   

函数

理解参数:

即便你定义的函数只接收两个参数,在调用这个函数时也未必一定要传递两个参数

   

其实,arguments对象只是与数组类似(它并不是Array的实例),因为可以使用方括号语法访

问它的每一个元素(即第一个元素是arguments[0],第二个元素是argumetns[1],以此类推),使

length 属性(函数的length属性)来确定传递进来多少个参数。

   

注意:函数传入的参数值与arguments对应值保持同步,即更改arguments对应值,参数值也会变,如下:

function print(a1,a2){

arguments[0]=12

console.log(a1); //打印出12,而不是33

}

print(33,2);

   

   

没有重载

函数没有重载功能。但可以通过判断参数数目实现类似于重载的功能。

  

posted @ 2016-05-23 11:20  且听风吟-wuchao  阅读(204)  评论(0编辑  收藏  举报