JavaScript变量类型
变量
ECMAScript的变量类型是松散类型,可以存放任何类型,也就是说变量仅仅只充当了一个占位符。
ECMAScript的变量类型有以下几种:
typeof 操作符
typeof操作符用来判断变量的数据类型,它的结果不完全与上述变量类型一一对应。比如说:typeof null返回的是object 与typeof {}一致。所以只使用typeof 无法判断null 和 object。还有一个特例是Function, 对一个函数使用typeof关键字返回的是function,而不是object(虽然function理论上也是object)。
undefined
undefiend类型只有一个值就是undefined,任何声明之后未初始化的变量默认值都是undefined,而为声明的变量使用时会直接报错。
var message;
console.log(message); // undefined
console.log(foo); // 报错
有一点需要注意的是typeof操作符对于未声明的变量也会返回undefined,这一点从技术角度有本质区别,但是无论那种情况都不能对变量进行真正的操作,这样的结果存才一定的逻辑合理性。
var message;
console.log(typeof message) // undefined
console.log(typeof foo) // undefined
综上,对于所有声明的变量都应该显式的初始化变量,这样typeof操作符返回undefined时我们就能清楚的知道,这个变量没有声明而不是没有初始化。
Null
Null也只有一个值就是null,从逻辑的角度讲null指的是一个空对象指针,这也就是为什么typeof null返回的是object的原因。书中说对于将来会保存对象的变量可以初始化为null,然后判断变量是否为null,然后处理对象。这里我的理解是初始为{},对于对象中需要使用的属性进行判断。
例如:
var foo = {}
// 一系列操作
if (foo.abc) {
// 处理foo.abc相关
}
特别提醒: undefined == null返回true, undefined ===null返回false
Boolean
Boolean只有两个值: true 和 false ,几乎所有的类型都可以转化为Boolean类型,
| 数据类型 | 可以转化为true | 可以转化为false |
|---|---|---|
| Boolean | true | false |
| String | 非空字符串 | ''(空字符串) |
| Number | 任何非零数字 | 0和NaN |
| Object | 任何对象 | null |
| Undefined | n/a | undefined |
基于这张表我们就可以简化逻辑判断
var msg = 'hello'
if (msg) {
alert(msg) // 代码将会执行
}
Number
js中数字类型默认为十进制,除此之外还可以表示成八进制和十六进制。
var number = 55 // 整数
var num1 = 070 // 八进制的56
var num2 = 08 // 无效的八进制为静默解析为十进制
var num3 = 0xA // 十六进制的10
1.浮点数
由于浮点数需要的内存空间是整数的两倍,所以js会在可能的时候将浮点数转化为整数。
var floatNum = 1.0 // 小数点后为0,解析为1
var floatNum2 = 10. // 小数点后没有数字, 解析为10
js中浮点数的最高精度为17位,对于某些浮点运算,计算不准。
0.1 + 0.2 == 0.3 // false
这是由于0.1和0.2转化为二进制时都是无限循环小数,无法用17位精确表示,导致了这个问题,所以永远不要测试某个特定的浮点数。
2.数值范围
js并不能保存所有的数值,大多数的浏览器的最小为5e-324,最大为1.797693138623157e+308,如果js中计算出了超出该范围的值,将会自动转化为Infinity。
3.NaN
NaN是一个特殊的数值,意为非数值,它具有如下特点:
- 任何数值除以非数值,会返回NaN(其他语言会直接报错)。
- 任何涉及到NaN的的操作都会返回NaN(Nan/10)。
- NaN与任何值都不等,包括NaN(NaN == NaN // false)
js提供了isNaN来判断值是不是NaN,任何可以被转化为数值的值,都会被直接转化为数值,在得出结果。
isNaN('blue') // true
isNaN('10') // false
isNaN(10) // false
isNaN同样可以作用于数值,他会先调用对象的valueOf方法,根据返回值是否可以转化为数值,如果不能,然后调用toString方法,再返回测试值。
4.数值转化
- Number函数:
Boolean → true转化为1 false转化为0
Number → 传入值和传出值一致
Null → 返回0
Undefined → 返回NaN
字符串的转化规则有点绕:
- 如果字符串中只包含整数,那么就直接转化为十进制的数字。
- 如果是浮点数,和整数操作一致。
- 如果包含有效的16进制,则为转化为相同大小的十进制。
- 空字符串转化为0。
- 剩下所有情况转化为NaN。
对象的转化方式和调用isNaN时相同,根据valueOf或者toSring返回的结果,再按前面的规则转化为数值。
- parseInt函数
由于Number转化字符串时比较复杂也不够合理,一般处理整数时更常使用parseInt,这个函数会从头到位找第一个非空字符,如果它不是数字或者正负号,那么会返回NaN,否则继续解析,直到遇到非数字。(十六进制也能提供正确解析,八进制在ES5之后被忽略,直接按照十进制解析)。
parseInt('123Blue') //1234
parseInt('') //NaN
parseInt('0xA') //10(十六进制)
parseInt('22.5') // 22
由于进制的原因parseInt提供第二个参数,表示多少进制(不仅可以传8,16,2,甚至3,4,5也可以)
parseInt('A', 16) // 10
parseInt('10', 2) // 10
- parseFloat
parseFloat的解析和parseInt几乎一致,不一样的就是他会解析第一个遇到的小数点,而且只解析十进制,十六进制会直接抓花成0。
parseFloat('123blue') // 123
parseFloat('0xA') // 0
parseFloat('22.24.5') // 22.24
## String 由零个或者多个16为Unicode字符组成,可以用单双引号表示,两者没有区别。 ### 1.字符字面量 由斜杠开头的字符,也叫转义序列,他们将会被当做一个字符来解析,如: ```javascript '\u030a'.length // 输出1 ``` .length方法可以返回16位字符数,但是对于双字节字符,length属性不会精确地返回字符串的数目(如汉字)。 ### 2.字符串的特点 字符串是不可变的,一旦创建,值就不能修改,如果要改变某个变量的保存的字符串,就要先销毁原来的字符串,再用新的字符串填充该变量。 ### 3.转化为字符串
- toString方法
数值,布尔,对象,字符串(字符串返回自己的副本)都有一个toString方法,null和undefined没有。
ture.toString() // 'true'
11.toString() // '11'
10.toString(16) // 'a'
数值的toString方法可以传入进制参数,会转化成对应进制的字符串,默认是10进制。
2.String函数
String函数对于nul返回'null'、undefined返回'undefined',其他情况下会调用toString方法。
Object
js中对象就是数据和功能的集合。可以通过 new Objec() 创建一个对象。Object是所有它的实例的基础,所以所有的实例都具有Object的下列属性和方法(原型链上)。
- constructor: 保存用于创建当前对象的函数。
- hasOwnProperty(propertyName):用于检查给定属性是否存在与当前实例。
- isPrototypeof(object):用于检查传入的对象是否是当前对象的原型。
- propertyIsEnumerable(propertyName):用于检查给懂属性是否能够使用for-in枚举。
- toLocaleString: 返回对象的字符串表示,与执行环境的地区有关。
- toString: 返回对象的字符串表示。
- valueOf: 返回对象的字符串、数值或布尔值表示。通常和toString返回值相同。
js中Object是所有对象的基础,更多的介绍需要单独的介绍,这里只是简单的提到了。