第三章 数据类型
变量
使用var定义的变量是局部变量
省略var所定义的变量是全局变量
typeof
typeof操作符
typeof是一个操作符而不是函数,因此例子中的圆括号尽管可以使用,但不是必需的。
数据类型
ECMAScript中有5种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String。
使用typeof可能返回以下值:
"undefined"——如果这个值未定义;
"boolean"——如果这个值是布尔值;
"string"——如果这个值是字符串;
"number"——如果这个值是数值;
"object"——如果这个值是对象或null;
"function"——如果这个值是函数。
undefined
该类型只有一个值,为初始化的变量的值就是undefined
对未初始化或未声明的变量使用typeof,都会返回undefined
null
该类型只有一个值null。
null类型表示一个空对象指针,故使用typeof返回object。
位于null和undefined之间的相等操作符(==)总是返回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)); //false(10是一个数值)
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);
没有重载
函数没有重载功能。但可以通过判断参数数目实现类似于重载的功能。