JS变量类型

194 阅读7分钟

JavaScript变量类型

变量

ECMAScript的变量类型是松散类型,可以存放任何类型,也就是说变量仅仅只充当了一个占位符。
ECMAScript的变量类型有以下几种:

  1. Undefined
  2. Null
  3. Boolean
  4. Number
  5. String
  6. Object(复杂数据类型)

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.数值转化

  1. Number函数:
Booleantrue转化为1 false转化为0
Number  →  传入值和传出值一致
Null  →  返回0
Undefined  →  返回NaN

字符串的转化规则有点绕:

  • 如果字符串中只包含整数,那么就直接转化为十进制的数字。
  • 如果是浮点数,和整数操作一致。
  • 如果包含有效的16进制,则为转化为相同大小的十进制。
  • 空字符串转化为0。
  • 剩下所有情况转化为NaN。

对象的转化方式和调用isNaN时相同,根据valueOf或者toSring返回的结果,再按前面的规则转化为数值。

  1. 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
  1. 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.转化为字符串
  1. 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是所有对象的基础,更多的介绍需要单独的介绍,这里只是简单的提到了。