ECMAScript中有5中基本数据类型:
- Undefined(变量未赋值)
- Null(空对象指针)(null == undefined返回值为true)
- Boolean(true和false两个值,要求全小写)
- Number(支持整数,浮点数,十进制数,八进制数(在严格模式下无效),十六进制数)
- String
此外还有一种复杂的数据类型——Object
三种对象类型:
- 对象(Object)
- 日期(Date)
- 数组(Array)
typeof操作符
返回类型:
- undefined:未定义值的变量
- boolean:boolean类型的变量
- string:字符串类型的变量
- number:数值类型的变量
- object:值为object或null
- function:值是函数
注意:typeof操作符的操作数可以是变量(message),也可以是数值字面量。typeof不是函数而是一个操作符,因此可以省略括号
constructor属性
- “Bill”.constructor:返回 “function String() { [native code] }”
- (3.14).constructor:返回 “function Number() { [native code] }”
- false.constructor:返回 “function Boolean() { [native code] }”
- [1,2,3,4].constructor:返回 “function Array() { [native code] }”
- {name:‘Bill’, age:62}.constructor:返回" function Object() { [native code] }"
- new Date().constructor :返回 “function Date() { [native code] }”
- function(){}.constructor:返回 “function Function(){ [native code] }”
Boolean类型
只有true和false两个值,要求全小写
可以使用Boolean()函数将其他类型的数据转化为布尔类型的数据:
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | “”(空字符串) |
Number | 任何非零数字值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | n/a(not applicable,意思是不适用) | undefined |
Number类型
支持整型和浮点类型的数据,支持二进制,十进制,八进制(在严格模式下无效报错),十六进制。
对于极大或极小的数制,可以使用e表示,表示方法为e前面的数值乘以以10的指数次幂。var floatNum = 3.1e2 其值为310
浮点数值的最高精度是17位小数,但是精度远远不如整数,例如0.1加0.2的结果不是0.3而是0.30000000000000004
1.数值范围:
Number.MIN_VALUE:5e-324
Number.MAX_VALUE:1.7976931348623157e+308
超出该范围的值将会显示Infinity
或-Infinity
可以使用isFinite()
函数类查看数值是否在数值范围内
2.NaN:
非数值,表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出异常)NaN==NaN返回false,可以使用isNaN()
函数检测值是否可以转换为数值,如果可以返回true,否则返回false
isNaN()
适用于对象。在基于对象调用该函数时,会首先调用对象的valueOf()
方法,然后确定该方法返回的值是否可以转换为数值。如果不能,则基于这个返回值在调用toString()
方法,再测试返回值。
3.数值转换
有3个函数可以把非数值转换为数值:Number()、parseInt()和parseFloat(),第一个函数可以用于任何数值类型,另两个则是专门用于把字符串转换成数值。
Number()函数的转换规则:
- 如果是Boolean值,true和false将分别被转换成1和0
- 如果是数字值,只是简单的传入和返回
- 如果是null值,返回0
- 如果是undefined,返回NaN
- 如果是字符串,(1)只包含数字(包括前面带正负号的情况),则将其转换为十进制数值(2)如果字符串中包含有效的浮点格式,则将其转换为对应的浮点数值。(3)如果字符串中包含有效的十六进制格式,例如"0xf",则将其转换为相同大小的十进制数值。(4)如果字符串是空的,则将其转换为0。(5)如果字符串中包含上述格式之外的字符,则将其转换为NaN
- 如果是对象,则调用对象的valueOf()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串。
parseInt()
转换字符串时,会忽略字符串前面的空格,直至找到第一个非空格字符,如果第一个字符不是数字字符或负号就会返回NaN,如果是数字字符,就会继续向后解析,知道解析完或遇到一个非数字字符,该函数在转换十六进制或二进制时会输出十进制,在解析八进制时,ECMAScript3和ECMAScript5有冲突,5不支持解析八进制。
parseFloat()
转换字符串时,通parseInt()
函数类似,该函数只会解析一个小数点,第二个小数点之后的字符会被忽略。
String类型
1.字符字面量
字面量 | 含义 |
---|---|
\n | 换行 |
\t | 制表 |
\b | 退格 |
\r | 回车 |
\f | 进纸 |
\\ | 斜杠 |
\' | 单引号 |
\" | 双引号 |
\xnn | 以十六进制代码nn表示一个字符 |
\unnnn | 以十六进制代码nnnn表示的一个Unicode字符(其中n为0~F) |
2.字符串的特点
ECMAScript中的字符串是不可变的,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后在用另一个新值的字符串填充该变量:
var lang = "Java";
lang = lang + "Script"
3.转换为字符串
有两种方法把一个值转换为一个字符串。
(1).toString()
方法,null和undefined无法使用该方法
(2).String()
- 如果值有toString()方法,则调用该方法并返回相应的结果
- 如果值是null,则返回"null"
- 如果值是undefined,则返回"undefined"
更多将数值转换为字符串的方法:
方法 | 描述 |
---|---|
toExponential() | 返回字符串,对数字进行舍入,并使用指数计数法来写 |
toFixed() | 返回字符串,对数字进行舍入,并使用指定位数的小数来写 |
toPrecision() | 返回字符串,把数字写为指定的长度 |
Object类型
ES中对象就是一组数据和功能的集合。可以使用var o = new Object()
的方法创建。
Object的每个实例都具有下列属性和方法。
constructor
:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)就是Object()hasOwnProperty(propertyName)
:用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例如:o.hasOwnProperty("name")
)isPrototypeOf(Object)
:用于检查传入的对象是否是当前对象的原型propertyIsEnumerable(propertyName)
:用于检查给定的属性是否能够使用for-in
语句来枚举。与hasOwnProperty()
方法一样,作为参数的属性名必须以字符串形式指定。toLocaleString()
:返回对象的字符串表示,该字符串与指定环境的地区对应toString()
:返回对象的字符串表示valueOf()
:返回对象的字符串、数值或布尔值表示。通常与toString()
方法返回值相同。
复制变量值
在复制基本类型时,会在变量对象上创建一个新值,然后把该值复制到新分配的位置上。
var num1 = 5
var num2 = num1
上述代码中,num2的值为5,但是num1和num2是相互无联系的两个变量。
在复制引用类型的变量时,同样会将存储在变量对象中的值复制一份放到为新变量分配的空间中,但是这个值的副本实际上是一个指针,该指针指向存储在堆中的一个对象。
var obj1 = new Object()
var obj2 = obj1
obj1.name = 'Nam'
alert(obj2.name) //‘Nam’
- 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中。
- 引用类型的值是对象,保存在堆内存中。