数据类型
- ECMAScript 有5种 简单数据类型:
UndefinedNullBooleanNumberString
- ECMAScript 有1种 复杂数据类型:
Object:本质上是 由一组无序的名值对组成
ECMAScript不支持任何创建自定义类型的机制,所有的值最终都是上述6种类型之一
typeof 操作符
对一个值使用typeof操作符,返回如下字符串:
"undefined"此值未定义"boolean"此值是布尔值"string"此值是字符串"number"此值是数值"object"此值是对象或null"function"此值是函数
var message = "some string";
alert(typeof message); // "string"
//typeof是操作符不是函数,因此括号虽可用,但不是必需的
alert(typeof(message)); //"string"
//操作数可以是字面量
alert(typeof 95); //"number"
// typeof null //"object"
//typeof 正则表达式 //"object"或"function",视浏览器而定
Undefined 类型
- Undefined类型只有一个值,那就是undefined
- 字面值
undefined:- 主要目的是,用于比较
- 引入它,是为了正式区分 空对象指针与未经初始化的变量
- 无论在什么情况下,都没有必要把一个变量的值,显式地设为
undefined
//message包含undefined值
var message = undefined;
//一般来说,没必要显式初始化为undefined,默认就会是这个值
alert(message) //"undefined"
//从比较的角度来说,与上面的例子等价
alert(message == undefined); //true
alert(typeof message) //"undefined"
尚未声明的变量
var message,message是尚未声明的变量
- 只能执行一项操作, 那就是
typeof操作符检测其数据类型 - delete操作,在严格模式下,会有错误。
//message是尚未声明的变量,自动取得undefined的值。
var message;
//undefined字面值,用于比较
alert(message == undefined); //true
alert(message) //产生错误
alert(typeof message) //"undefined"
被显式初始化为包含undefined值的变量和尚未声明的变量,还是不一样的:例如,而前者alert()返回"undefined",后者alert()会产生错误
Null类型
- Null类型只有一个值,那就是
null null值,表示一个空对象指针undefined值,派生自,null值- 只要意在保存对象的变量,还没有真正保存对象,就应该让该变量先保存着
null
var car = null;
alert(typeof car) //"object"
alert(null == undefined) //true
//在这里,操作符==, 为了比较,会转换操作数
if(car != null) {
}
Boolean类型
- 只有两个字面值
true和false-
大小写敏感
-
和数字值不是一回事,true不一定等于1, false也不一定等于0
-
ECMAScript中所有类型的值,都有与
true和false等价的值。可以用Boolean()函数,来得到一个值对应的Boolean值
-
| 类型 | 转换为false的值 | 转换为true的值 |
|---|---|---|
| Boolean | false | true |
| String | "" (空字符串) | 非空字符串 |
| Number | 0和NaN | 非零数字(包括无穷大) |
| Object | null | 任何对象 |
| Undefined | undefined | n/a(或者N/A), not applicable, 表示不适用 |
Number类型
- 包括,整数,浮点数(双精度数)
- 数值字面量,格式:
- 十进制,例如 55
- 八进制,例如 080
- 第一位必须是0
- 后跟(0 ~ 7)
- 若超出范围,则第一位的0会被忽略,按照十进制来解析
- 八进制字面量在严格模式下无效
- 十六进制,例如0xA
- 前两位必须是0x
- 后跟(0 ~ 9, A ~ F 或 a ~ f)
算术计算时,八进制和十六进制,都会被转换成十进制
浮点数值
- 浮点数:必须包含一个小数点,且小数点后必须至少一位数字。
- 浮点数占用的内存空间是整数的两倍,因此ECMAScript会趁机姜浮点数值转换为整数值。
- ECMAScript会趁机将小数点后带有6个0及以上的数值转换为科学计数法表示的数值。
- 浮点数最高精度是17位小数
- 0.1 + 0.2 结果不是0.3, 而是0.30000 00000 00000 04。这是舍入误差。
var floatNum1 = 1.1;
var floatNum2 = 0.1;
var floatNum3 = .1 //不推荐,但有效
var floatNum4 = 1. //解析为整数值 1
var floatNum5 = 10.0 //解析为整数值 10
var floatNum6 = 3.125e7; //科学计数法,等于31250000
if(a + b == 0.3) //由于舍入误差,因此不要,这样测试,特定浮点数值
{
alert("you got 0.3");
}
数值范围
- ECMAScript能表示的
- 最小数值,Number.MIN_VALUE = 5e-324
- 最大数值,Number.MAX_VALUE = 1.7976931348623157e+308
- 超出范围时
- 自动转换为
Infinity,Number.POSITIVE_INFINITY - 或者
-Infinity, Number.NEGATIVE_INFINITY - Infinity,无法参与下一次计算
- 自动转换为
isFinite()方法
var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result)) //false
NaN
- Not a Number
- 是一个特殊的数值
- 表示本来要返回数值的操作数未返回数值的情况
- 这样就不会抛出错误了
- 任何涉及NaN的操作,都返回NaN
- NaN与任何值都不相等,包括NaN本身
isNaN()- 尝试将参数转换为数值
- 若能,返回false
- 若不能,返回true
- 参数可以是任何类型
- 若是对象, 首先调用对象的
valueOf()方法,得到返回值。尝试将返回值转换为数值- 若能,返回false
- 若不能,对返回值调用
toString()方法,得到返回值。尝试将返回值转换为数值- 若能,返回false
- 若不能,返回true
- 若是对象, 首先调用对象的
- 尝试将参数转换为数值
数值转换
有三个函数, 把非数值,转换成数值。它们对于相同的输入,会有不同的返回结果。
Number(),可用于任何类型parseInt(), 专门用于字符串类型parseFloat(),专门用于字符串类型
Number()
| 值 | 处理方式 |
|---|---|
| Boolean值 | true返回1, false返回0 |
| 数字值 | 返回原样 |
| null | 返回0 |
| undefined | 返回NaN |
| 字符串 | 见下 |
| 对象 | 见下 |
字符串的处理方式:
| 字符串情况 | 处理方式 | 注释 |
|---|---|---|
| 只包含数字 | 转换为十进制 | 包括正负号,忽略前导0 |
| 包含有效的浮点格式 | 转换为浮点数值 | 忽略前导0 |
| 包含有效的十六进制格式 | 转换为相等的十进制 | |
| 空字符串 | 转换为0 | |
| 以上其他格式 | 转换为NaN |
对象的处理方式:
- 首先调用对象的
valueOf()方法,得到返回值。尝试对返回值使用Number()- 若转换结果不为NaN,返回转换结果
- 若转换结果为NaN,对对象调用
toString()方法,得到字符串。尝试对字符串使用Number()
parseInt()
Number()在处理字符串时,比较复杂,且不够合理- 因此处理字符串时,更常用
parseInt()规则: - 忽略前面的空格
- 如果第一个字符不是数字或者负号,则返回NaN
- 继续解析第二个字符
- 直到解析完所有
- 或者遇到一个非数字字符(小数点也算非数字字符)
- 能够识别各种整数格式
- 八进制,0 (ECMAScript 5开始,不能解析八进制)
- 十六进制,0x
- 为了避免自行解析不同整数格式时,不同ECMAScript行为不同而产生困惑,建议显示指定几进制
parseFloat()
parseFloat()和parseInt()很相似parseFloat()的不同之处:- 从前往后,第一个小数点是有效的
- 始终忽略前导0,意味着只能解析十进制
- 如果字符串实际上包含一个整数,则实际上会返回整数
String类型
- 由16位的Unicode字符组成
- 字符个数,0个或多个
- 单引号和双引号,都一样
- 字符串不可变
- 一旦创建,值就不能变
- 要变量改变值,只能销毁原来的字符串,用新字符串填充该变量
字符字面量
String类型有一些特殊的字符字面量,也叫转义序列- 表示非打印字符,或其他用途
- 可以出现在字符串中的任意位置
- 被作为一个字符来解析
| 字面量 | 含义 |
|---|---|
| \n | 换行 |
| \t | Tab |
| \b | 退格 |
| \r | 回车 |
| \f | 进纸 |
\\ | 斜杠 |
\' | 单引号 |
\" | 双引号 |
| \xnn | 一个字符,占16bit,由2个16进制数表示 |
| \unnnn | 一个Unicode字符,占32bit (双字节字符),由4个16进制数表示 |
转换为字符串
有3种方法:
tostring()方法String()方法- 用
+,与一个字符串"",加到一起
tostring()方法
- 不是所有的值,都有tostring()方法
- 数值,布尔值,对象,字符串:有
- null值,undefined值:没有
- 对于数值,可以指定转换为几进制
var age = 11;
var ageAsString = age.tostring() //"11"
var found = true;
var foundAsString = found.tostring() //"true"
var num = 10;
alert(num.tostring(16)) //"a"
String()方法
- 该值有tostring()方法,就用之
- 该值没有tostring()方法:
- null值,返回"null"
- undefined值,返回"undefined"
var value1 = null;
alert(String(value1)) //"null"
var value2;
alert(String(value2)) //"undefined"
Object 类型
var o = new Object();
var o = new Object; //有效。括号可以省略,但不推荐
- 创建Object类型,为其添加属性或方法,就可以创建自定义对象
- Object类型的所有方法和属性,也存在于更具体的对象中
| Object的属性或方法 | |
|---|---|
| 构造函数 | Object() |
| hasOwnProperty() | 当前对象实例(而非实例原型)是否包含给定属性 |
| isPrototypeOf() | 传入对象,是否为当前对象实例的原型 |
| propertyIsEnumerable() | 当前对象实例的给定属性,是否能用for-in来枚举 |
| toLocaleString() | 当前对象实例的字符串表示,当地的 |
| toString() | 当前对象实例的字符串表示 |
| valueOf() | 当前对象实例的字符串表示, 或数值表示,或布尔表示。通常与toString()相同 |
ECMA-262中对象的行为不一定适用于Javascript中的其他对象,例如宿主对象。
- 浏览器环境中的对象,例如BOM和DOM,都属于宿主对象。
- 宿主对象,由宿主提供和定义。
- 因此宿主对象,可能会继承Object,也可能不会。