0%

数据类型

前言

这算是博客搭建好之后的第一篇正式博文吧。我所理解的写博客的意义:加深所学知识的印象,辅助记忆。归纳总结,方便以后复习,夯实基础。一篇英文文章,如果只有个别单词不会,并不会影响阅读。但如果每个句子里都有生词,就很影响阅读了。这门语言也是一样,现在的框架层出不穷,总不能每个都学吧,先把最底层的原生的理解了、把API记熟了再说吧。这个系列将用来记录我对《Javascript高级程序设计(第3版)》的总结。加油!


正文

javascript中共有5种简单数据类型:undefinednullbooleannumberstring,和一种复杂数据类型:object

typeof操作符

typeof操作符用来检测给定变量的数据类型,其值有6种可能的结果:

  • “undefined”–如果这个值未定义
  • “boolean”–如果这个值是布尔值
  • “number”–如果这个值是数值
  • “string”–如果这个值是字符串
  • “object”–如果这个值是对象或null
  • “function”–如果这个值是函数

注意:typeof操作符返回的结果与数据类型并不是一一对应的。返回结果中,没有null,typeof null返回的是object。因为null是一个空的对象引用,当确定一个变量将用于储存对象时,最好在初始化时为其赋值null。另外,从技术角度讲,函数在ECMAScript中是对象,不是一种数据类型。然而,函数也确实有一些特殊的属性,因此通过typeof操作符来区分函数和其他对象是有必要的。

Undefined类型

undefined类型只有一个特殊的值:undefined,有两种情况会导致一个变量的值为undefind:

  • 变量声明过但未赋值,如:var str;
  • 变量未声明且未赋值(我们简称未声明吧)。

实际上对于未声明过的变量,只能对其执行typeof检测操作,其他的操作都会报错。但是对这两种情况的未定义变量执行typeof操作都会返回undefined

Null类型

null类型是第二个只有一个值的数据类型,其值为null,表示一个空的对象指针。有两点注意下就好:

  • 上面已经说过,当确定一个变量将用于储存对象时,最好在初始化时为其赋值null.
  • null == undefined返回true,尽管它们的用法完全不同.

Boolean类型

boolean类型只有两个字面量值:true和false。任何数据类型的值都可以通过转型函数Boolean()转换为布尔值,转换规则如下:

类型 转换为true的值 转换为false的值
Boolean true false
number 任何非零数字值(包括无穷大) 0
string 任何非空字符串 空字符
object 任何对象 null
undefined n/a undefined

另外,在做判断的时候是会自动进行数据类型转换的,如:

1
2
3
4
var message = 'hello world';
if(message){
console.log('value is true');
}

Number类型

number类型的内容比较多,挑两块比较重要的记录吧,其它的感觉不怎么用,而且记忆负担很重。

NaN

NaN表示非数值(not a number),有两点需要注意:

  • 任何涉及NaN的运算,其返回结果都为NaN.
  • NaN与任何值都不相等,包括它自己.NaN == NaN //false

isNaN()函数接收一个参数,该参数可以是任何数据类型,函数会帮助我们确定这个参数是不是”不是数值”。该函数在接收到参数后会尝试把它转换为数值。如果不能转换为数值,说明它”不是数值”,返回true;如果能转换为数值,说明它不是”不是数值”,返回false。

isNaN()也适用于对象。当传入一个对象时,会先调用这个对象的valueof()方法,然后确定该方法返回的值能否被转换为数值;如果不能,则再调用对象的toString()方法,然后确定方法返回的值能否被转换为数值。

数值转换

有3个函数可以把其他类型的值转换为数值:Number()parseInt()parseFloat()。第一个函数即转型函数可以接收任何数据类型,后两个函数主要负责把字符串转换为数值。

Number()

  • 如果是Boolean值,true转换为1,false转换为0.
  • 如果是number值,只是简单的传入和返回.
  • 如果是null,返回0.
  • 如果是undefined,返回NaN.
  • 如果是字符串,遵循以下规则:
    • 如果字符串只包含数字,则转换为十进制数值(第一位可以是正负号,忽略前导0).
    • 如果字符串包含有效的浮点数,则转换为对应的浮点数值(忽略前导0).
    • 如果字符串包含有效的十六进制数,则转换为等值的十进制数值.
    • 如果字符串为空字符串,则转换为0.
    • 如果字符串不符合以上规则,则转换为NaN.
  • 如果是对象,则先调用valueOf()方法,再调用toString()方法,分别转换它们的返回值.

parseInt()

parseInt()主要用来处理整数形式的字符串。它会忽略前导的空字符,直到检索到第一个非空字符,然后判断这个非空字符。如果这个非空字符不是有效的数字字符或正负号,则返回NaN。否则,继续检索下面的字符,直到字符检索完或检索到一个非有效数字字符后停止,返回结果(注意:小数点不是有效的数字字符,所以遇到小数点会停止检索并返回结果)。另外,根据以上规则,可以发现,空字符串返回的是NaN,而Number()对空字符串返回的结果是0.

parseInt()也能自动识别出不同进制数的数值,但是在解析看起来像八进制数的字符串时,ECMAScript 3和5存在分歧,因此,parseInt()可以接收第二个参数,用来表示将以多少进制数解析字符串。实际上,如果指定了第二个参数为16,字符串可以忽略前导的0x,但是,如果没指定参数,则不能忽略。佛一个然破:

1
2
3
var num = parseInt('0xAF',16);	//175
var num1 = parseInt('AF',16); //175
var num2 = parseInt('AF'); //NaN

parseFloat()

parseFloat()也是从第一个非空字符开始解析每一个字符,直到解析到最后一个字符或是遇到第一个非有效的浮点数数字字符为止。注意以下几点:

  • 第一个小数点是有效的,后面的小数点都是无效的.
  • parseFloat()只解析十进制数,因此它没有第二个参数.十六进制格式的字符串总会被解析成0.
  • 如果能转换为整数,总会转换成整数,因为保存浮点数的所需要的内存更大.
  • parseInt()一样,空字符串会被解析成NaN.

String类型

字符字面量(转义字符)

每个字符字面量(转义字符)都可以出现在一个字符串中的任何位置,尽管他们看起来可能是一长串,但只会被当成一个字符来解析。可以通过length属性来访问字符串中有多少个字符。

转换为字符串

把其他类型的值转换为字符串有两种方式:调用几乎每个值都有的toString()方法,调用String()转型函数。

toString()

除了nullundefined外,其他所有的值都有toString()方法:

1
2
3
4
5
6
7
8
var n = 12,
s = 'hello world',
b = true,
o = {};
n.toString(); //'12'
s.toString(); //'hello world'
b.toString(); //'true'
o.toString(); //'[object Object]'

在调用数值的toString()方法时,可以接收一个参数用来表示以多少进制数输出这个字符串。

String()

nullundefined调用String()转型函数,分别得到'null''undefined'.对其他类型的数据调用String(),实际上会调用这个值的toString()方法(不带参数).

Object类型

Object类型是所有其他对象实例的基础,Object类型所拥有的属性和方法都被其他实例所继承。Object类型具有以下属性和方法:

  • constructor — 保存着用于创建当前实例的构造函数
  • hasOwnProperty(propertyName) — 检测实例是否拥有某个属性,propertyName必须是字符串形式,返回布尔值
  • obj1.isPrototypeOf(obj2) — 检测obj1是否为obj2的原型,返回布尔值
  • propertyIsEnumerable(propertyName) — 检测实例的某个属性是否可被枚举,返回布尔值
  • toLocalString() — 返回实例的字符串表示,与执行环境的地区对应
  • toString() — 返回实例的字符串表示
  • valueOf() — 返回实例的字符串、数值或布尔值表示