by addy 原创文章,欢迎转载,但希望全文转载,注明本文地址。

本文地址:http://www.iamaddy.net/2014/02/%e5%86%8d%e8%b0%88javascript-%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b/

理解好数据的类型非常重要,这也是一种语言本身最为基础的知识。只有牢固的掌握了基础,才能编写出健壮的代码。 javascript有5种简单的数据类型:Undefined、Null、Boolean、Number、String,和一种复杂的数据类型:Object。判断数据类型可用typeof操作符。

// 对函数使用typeof返回的是function,函数实质是对象,为了区别普通的对象。
var message = "some thing";
typeof message; // 'string'
typeof 123; // 'number'
typeof NaN; // 'number'
typeof Infinity; // 'number'
typeof true; // 'boolean'
typeof message; // 'string'
function a(){}
typeof a; // 'function'
var b = {xx: "12"};
typeof b; // 'object'
typeof undefined; //'undefined'
typeof null; //'object'

Undefined类型

只有一个值,即undefined,未初始化的变量为undefined。

var message;
alert(message); // 'undefined'
alert(typeof message); // 'undefined'
alert(age) // 错误
alert(typeof age) // 'undefined'

Null类型

null是一个空的对象指针,因此typeof null => 'object'。定义的变量准备在将来存储对象,最好初始化为null而不是其他值。undefined实际上是派生自null值。null==undefined => true

Boolean类型

布尔类型,大家最常见的,true和false注意要区别大小写。另外需要注意的就是各种类型转换为boolean类型的规则。

// String,任何非空的字符串都将转化为true,只有""会转化为false
!!"" // false
!!"0" // true
// number ,任何非零数字值,包括无穷大转化为true,0和NaN为false。
!!0 // false
!!NaN // false
!!10 // true
// 任何对象除了null返回true
!!null // false

Number类型

主要是整数和浮点数。整数在javascript中又可表达为十进制,八进制,十六进制。在严格模式下,八进制无效。八进制的前缀是0,十六进制的前缀是0x。八进制需要注意的是:

// 当数字超过了8时按照十进制解析
var num = 070; // 56
var num = 079; // 79
var num = 08; // 8
// 同理十六进制 超过其表达的字符则报错
0xGA // error

在算术运算时,最后都将转化为十进制进行计算。

1. 浮点数

保存浮点数的内存空间是整数的两倍,因此将会不失时机的将浮点转化为整数。

var f = 2.; // 2
var f1 = 1.00; // 1
// 科学计数法
var num = 3.12e7 // 31200000
// 默认情况下 小数点后带有六位个零以上的小数将转化为科学计数法
var ff = 0.0000000004; // 4e-10

浮点数的精度17位小数,算术计算时远不如整数。

0.1 + 0.2 = ?
// 结果不是0.3,是0.30000000000000004,所以千万别测试某个特定的浮点数。
// 另外在计算浮点数时也要格外的小心,一般都先化为整数,计算好了再将其表示为浮点数,否则可能存在精度丢失。
// 不仅仅是在javascript中,基于IEEE754数值的浮点计算的语言都会有这个问题。
(0.1 * 10 + 0.2 * 10) / 10 // 0.3
2.NaN

NaN:not a number,但是一个特殊的数值。

// NaN的源头:0/0 => NaN
// 任何涉及NaN的操作 返回NaN
// NaN与任何值都不相等,包括本身
alert(NaN == NaN); // false
//isNaN 可以判断NaN,其本意是判断是否为数值,包括可以转换而来的数值
isNaN(NaN) // true
isNaN(10) // fasle
isNaN("10") // fasle
isNaN('green') // true
isNaN(true)// false;
isNaN({}) // true

在对对象调用isNaN时,首先调用valueOf()方法,然后确定返回值是否可以转换为数值,如果不可以接着调用toString(),再测试返回值。这个过程也是内置函数和操作符的一般执行流程。

3.数值转换
// Number()函数
var num1 = Number("hello world") // NaN
var num2 = Number("") // 0
var num2 = Number("00001") // 11
var num2 = Number(true) // 1
var num2 = Number(undefined) // NaN
var num2 = Number(null) // 0
var num2 = Number({}) // NaN

较为常用的是parseInt()和parseFloat()。parseInt在转换字符串时,更多的是查看是否符合数值模式。忽略字符前面的空格,如果第一个字符不是数字和负号则返回NaN。而且还能识别各种进制的数据。

parseInt('123bllll') // 123
parseInt('b123bllll') // NaN
parseInt('') // NaN
parseInt(22.6) // 22
parseInt(070) // 57
parseInt(70) // 70
parseInt(0x1f) // 31
parseInt(true) // NaN
// 在解释八进制数据是ECMAScript3和ECMAScript5又不同的解释。ECMAScript5会认为是十进制,而ECMAScript3会认为是八进制。

为了消除这种分歧,parseInt提供了第二个参数作为转换基数。

parseInt("AF", 16) // 175
paserInt("AF") // NaN
parseInt('10', 2) // 2
parseInt('10', 8) // 8
// 为了避免解析错误,建议无论在什么情况下指定明确的基数。

parseFloat的几个实例:

parseFloat('123bllll') // 123
parseFloat('123.22.3') // 123.22
parseFloat('0908.3') // 908.3
parseFloat("2.12e7") // 21200000
parseFloat('0xA') // 0
// 只解析10进制,十六进制会被转换为0

String类型

字符串是不可变的,要改变某变量的字符串值,必须销毁原来的,在用新的值填充。旧版本的浏览器会存在字符串拼接效率低下的现象。除了null和undefined没有toString方法,其他类型的数据都有。toString还能输出指定进制的数据:10.toString(2);还有转换函数String()

String(null) // 'null'
String(undefined) // 'undefined'
String(true) // 'true'
// 要把某个值转换为字符串,可与""相加
null + "" // 'null'

Object类型

所有对象的基础。包含以下属性方法:

constructor 构造函数
hasOwnProperty 实例属性
isPrototypeOf 原型属性
toLocaleString
toString
valueOf

本文为原创文章,可能会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,谢谢合作

本文地址:http://www.iamaddy.net/2014/02/%e5%86%8d%e8%b0%88javascript-%e6%95%b0%e6%8d%ae%e7%b1%bb%e5%9e%8b/

想要打赏?你的鼓励是我前进的动力! addy打赏二维码

关注个人公众号web_lab,不定期更新一些干货~ web_lab公众号