JAVASCRIPT June 25, 2017

Javascript 数据类型

Words count 6.1k Reading time 6 mins. Read count 0

  本文摘录于Javascript高级程序设计(Professional JavaScript for Web Developers)并加上了自己的一些理解,如发现本文有什么错误之处,请麻烦通过以下方式联系我作修正,谢谢!
  微信号: kuntang9080
  邮箱:kuntang@163.com


ECMAScript中有5种简单数据类型(也称基本数据类型):Undefined、Null、Boolean、Number、String。还有一种复杂数据类型:Object。


typeof 操作符

对一个值使用typeof操作符可能返回下列某个字符串

返回值 说明
undefined 这个值没有定义
boolean 这个值是布尔值
string 这个值是字符串
number 这个值是数值
object 这个值是对象或者null
function 这个值是函数

注意:当typeof返回是object的时候对应着两个值,因此不能用typeof来区分object类型和null类型,此时应该用instanceof()函数


Undefined类型

Undefined类型只有一个值,即undefined

任何使用var声明但未对其加以初始化的变量都会赋以undefined值。

var message = undefined;
alert(message == undefined);
// true

对未初始化的变量和未声明的变量使用typeof操作符都会返回undefined值。

// 只声明了message,没有声明age
var message;

alert(typeof message);
// undefined
alert(typeof age);
// undefined

注意:因此我们应该保持对变量初始化时就赋值的好习惯,这样当我们做类型检测的时候就不会造成不必要的混乱


Null 类型

Null类型只有一个值,即null。从逻辑角度上看,null值表示一个空对象指针,而这也正是使用typeof操作符检测null会返回"object"的原因

实际上undefined值是派生自null值的,因此

alert(null == undefined)
// true

如果一个声明了一个将来才会使用到的变量,那么我们应该显式地将它赋值null而不是其它值


Number类型
1. 进制

  八进制字面值第一位必须为0,十六进制前两位必须为0x

var octalNum = 070
// 八进制的56
var hexNum = 0xA
// 十六进制的10
2. 其它进制转换为十进制

  其它进制转换为十进制我们可以用Number()或者parseInt()函数。因为Number()函数分的情况比较混乱,所以在很多情况下我们会用parseInt()来做进制转换。

parseInt()函数提供第二个参数:转换时使用的基数(即多少进制)。例:

var hexTo = parseInt("0xAF", 16)
// 175
var num1 = parseInt("10", 2)
// 2
var num2 = parseInt("10", 8)
// 8
var num3 = parseInt("10", 16)
// 16
3. 浮点数值

对于那些极大或者极小的数值,可以用e表示法(科学计数法)来表示。

var floatNum = 3.125e7
// 31250000

注意:浮点数值的最高精度是17位小数,但在进行算术时其精度远远不如整数。比如0.1加0.2不等于0.3:

alert(0.1 + 0.2)
// 0.30000000000000004
if (a + b == 0.3) {	// 不要做这样的判断
	alert("you got the 0.3")
}

如果要一定要做这样的判断,在此提供了一个解决方法

var temp = (a * 10 + b * 10) / 10 	//先将浮点数转化为整数作加法,然后再转为浮点数
if (temp == 0.3) {
	alert("you got the 0.3")
}
4. NaN (Not a Number)
  • 任何涉及NaN的操作或运算都会返回NaN
  • NaN与任何值都不相等
alert(NaN / 10)
// NaN

alert(NaN == NaN)
// false

isNaN()函数用来判断这个参数是否为NaN,当isNaN()接收到一个参数之后,会尝试将这个值转换为数值,任何不能被转换为数值的值都会导致这个函数返回true。

alert(isNaN(NaN))
// true
alert(isNaN(10))
// false
alert(isNaN("10"))
// false(转为数字10)
alert(isNaN("blue"))
// true(不能转为数值)
alert(isNaN(true))
// false(true转为1)

在基于对象调用isNaN()函数时,会先调用对象的valueOf()方法,然后确定该方法返回的值是否可以转换为数值。如果不能,则基于这个返回值再调用toString()方法,再测试返回值。

5. 数值转换
  • Number()函数

  • parseInt()函数

  parseInt()函数在转换字符串时,会忽略字符串前面的空格,直至找到第一个非空格的字符。如果第一个字符就不是数字字符或者负号,就直接返回NaN。也就是说parseInt(“a123”)返回NaN,第一个字符"a"不是数字字符或者负号;parseInt(“12.3”)返回12,"."不是数字字符或者负号。

  • parseFloat()函数

  parseFloat()函数始终都会忽略前导的零。对十六进制格式的字符串始终返回0。


6. String类型

数值、布尔值、对象和字符串都有toString()方法,但是null和undefined值没有这个方法。
在调用数值的toString()方法时,可以传递一个参数:输出的基数。通过这个基数可以使toString()方法输出以二进制、八进制、十六进制,乃至其他做生意有效进制格式表示的字符串值。

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

在不知道要转换的值是不是null或undefined的情况下,可以使用转型函数String(),这个函数能够将任何类型的值转换的为字符串。String()函数遵循下列规则:

  • 如果有toString()方法,则调用该方法(没有参数)并返回相应的结果

  • 如果是null,则返回"null"

  • 如果是undefined,则返回"undefined"


7. Object类型

Object的每个实例都具有下列属性和方法。

  • constructor: 保存着用于创建当前对象的函数

  • hasOwnProperty(propertyName): 用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串形式指定(例:o.hasOwnproperty(“name”))

  • isPrototypeOf(object):用于检查传入的对象是否是当前对象的原型

  • propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举

  • toLocaleString():返回对象的字符串表示,该字符串与执行环境的地区对应

  • toString():返回对象的字符串表示

  • valueOf():返回对象的字符串、数值或者布尔值表示。通常与toString()方法的返回值相同

0%