判断变量类型的方法(上):js中的数据类型

404 阅读7分钟

1. js一共6种数据类型:

  • 5中基本数据类型(也叫做简单数据类型)

Undefined Null Boolean Number String

  • 1种复杂数据类型

Object

2. typeof操作符检测结果

  • "undefined" // 这个值未定义,声明了没有给值
  • "boolean" // 这个值是布尔值
  • "string" // 这个值是字符串
  • "number" // 这个值是数值
  • "object" // 这个值是对象或null
  • "function" // 这个值是函数

3. Null类型

Null类型是第二个只有一个值的数据类型(另一个是Undefined),这个特殊的值是null。

null的使用

如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null而不是其它值。这样一来,只要检查null值就可以知道相应的变量是否已经保存了一个对象的引用,如下面的例子所示:

if(car != null){
 // 对car 对象执行某些操作
}

typeof检测null值时会返回"object"

从逻辑上讲,null值表述一个空对象指针,而这正是使用typeof检测null值时会返回"object"的原因

image.png

undefined == null 为true

实际上,undefined值派生自null值,因此ECMA-262规定测试它们的相等性测试要返回true

image.png

4. Boolean类型

  • 该类型只有两个字面值:true 和 false

- 数据类型对应转换规则表

数据类型转换为true的值转换为false的值
Booleantruefalse
String任何非空字符串"" (空字符串,注意,如果字符串有空格也不是空字符串)
Number任何非零数字值(包括无穷大)0和NaN
Object任何对象null
Undefinedundefined

5. Number类型

进制的表示

- 10进制,

最基本的数值字面量格式,可以直接在代码输入 var intNum = 55

- 8进制:

八进制的字面值第一位必须是0,后面是8进制序列(0-7)

在严格模式下无效,支持严格模式的JavaScript引擎会抛出错误

var octalNum1 = 070  // 八进制的56
var octalNum2 = 079  // 无效的八进制值,接续为 79
var octalNum3 = 08   // 无效的八进制,解析为8
- 16进制

十六进制的前两位是0x,后面是16进制序列(0-9及A-F),字母A-F也可以小写

var hexNum1 = 0xA  // 16进制的10
var hexNum2 = 0x1f  // 16进制的31

在进行算术运算时,所有的8进制以及16进制表示的数值最终都会被转成16进制数值

NaN

Not a Number 是一个特殊的数值,这个数值便是一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)

NaN的特点:
  1. 任何涉及NaN的操作(例如NaN/10)都会返回NaN。
  2. NaN和任何值都不相等,包括NaN本身

image.png

isNaN()函数
  1. isNaN()在接收一个值之后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串"10"或Boolean值
  2. 任何不能被转为数值的值都会导致这个函数返回true

image.png

数值转换

1. 有三个函数可以将非数值转换为数值:
  • Number()
  • parseInt()
  • parseFolat() Number()可以用于任何数据类型 parseInt()、parseFlost() 专门用于把字符串转换成数值
2. Number() 函数转换规则如下
  • 如果是Boolean值,true和false将分别转换为1和0

  • 如果是数字值,只是简单的传入和返回

  • 如果是null值,返回0

  • 如果是undefined值,返回NaN

  • 如果是字符串,遵循下列规则

    1. 如果字符串中只包含数字(包括前面带正负号的情况),则将其转换为10进制值,"011"会变成11(注意,前导0被忽略了)
    

image.png

2. 如果字符串中包含有效的浮点格式,如"1.1",则将其转换为对应的浮点数值(同样,也会忽略前导03. 如果字符串中包含有效的16进制格式,例如"0xf",则将其转换为相同大小的10进制整数值

image.png

4、如果字符串是空的(不包含任何字符或者空格字符也是可以的),则将其转换为0

image.png

5. 如果字符串中包含除上述格式之外的字符,将其转换为NaN

image.png

6. 如果是对象,则调用对象的valueOf()方法,然后按照前面的规则转换返回的值。如皋转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值
3. parseInt()

parseInt()在转换字符串时,更多的是看其是否符合数值模式。

(1)它会忽略字符串前面的空格,知道找到第一个非空格字符。如果第一个字符不是数字字符或者负号,parseInt()就会返回NaN;也就是说,用parseInt()转换空格会返回NaN.

(2) 如果第一个字符是数字字符,parseInt()会继续解析第二个字符,知道解析完后续字符或者遇到了一个非数字字符。

image.png

(3)如果字符串中的第一个字符是数字字符,parseInt()能够识别出各种进制的整数格式:10进制、8进制、16进制。 如果字符串以"0x"开头后跟数字,则为16进制; 如果字符串以"0"开头后跟数字,则为8进制;(8进制解析会有分歧,不建议使用)

(4)parseInt()提供第二个参数:转换时使用的基数(进制数)

image.png

4. parseFloat()

(1)parseFloat()和parseInt()一样从第一个字符(位置0)开始解析每个字符。

(2)parseFloat()一直解析到字符串末尾,或者解析遇到一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点时有效的,第二个小数点就是无效的了,因此它后面的字符串将被忽略。

image.png

(3)parseFloat()它始终会忽略前导的0。parseFloat()只解析10进制值,没有第二个参数指定基数(进制数)的用法。parseFloat()解析16进制格式的字符串结果始终为0

image.png

(4)如果字符串包含的是一个可解析为整数的数(没有小数点,或者小数点后都是0),parseFloat()会返回整数。

image.png

6. String类型

字符字面量

字面量含义
\n换行
\t制表
\b退格
\r回车
\f进纸
\斜杠
'单引号
''双引号
\xnn以16进制代码nn表示的一个字符()。例如,'\x41'表示'A'
\unnn以16进制代码nnn表示的一个Unicode字符(其中n为0~F)

这些字符字面量可以出现在字符串中的任意位置,而且也将被作为一个字符来解析。如下例所示:

image.png

转换为字符串

(1)数值、布尔值、对象和字符串值都有toString()方法。但null和undefined值没有这个方法

image.png

(2)toString()可传参数:输出数值的基数(进制数)

image.png

(3)String()函数转换规则:

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

@如果值是null,则返回"null"

@如果值是undefined,则返回"undefined"

image.png

image.png

7. Object类型

创建自定义对象:

var o = new Object()
var o = new Object //省略(),有效但不推荐

Object的实例都有以下属性和方法:

  1. constructor:保存着用于创建当前对象的函数。对于前面的例子而言,构造函数(constructor)就是Object()
  2. hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中(而不是在实例的原型中)是否存在。其中,作为参数的属性名(propertyName)必须以字符串的形式指定(例如:o.hasOwnProperty('name'))
  3. isPropertyOf(object):用于检查传入的对象是否是当前对象的原型
  4. propertyIsEnumerable(propertyName):用于检查给定的属性是否能够使用for-in语句来枚举。作为参数的属性名必须以字符串形式指定
  5. toLocalString():返回对象的字符串表示,该字符串与执行环境的地区对应
  6. toString():返回对象的字符串表示
  7. valueOf():返回对象的字符串、数值或者布尔值表示。通常与toString()方法返回值相同

摘自: 《Javascript 高级程序设计 (第三版)》