JS数据类型详解一
2016-06-29 17:31:25

168
1.基础知识
js的数据类型分为基本数据类型和引用数据类型
基本数据类型:number,string,boolean,null,undefined
引用数据类型:object类型({}object,[]array,/^\d$/正则,Math Date) 和特殊类型(function)
如何来检测我们定义的变量是什么数据类型呢?
- 可以通过typeof来检测数据类型
但是如果是对象类型的,typeof 检测返回值都是"object",没法细分具体是属于对象数据类型中的哪一种. (Object类是所有对象类的基类,在Object类下面还派生出很多类,比如Array,RegEXp等),那这个缺陷,可以通过instanceof来弥补
例如:
var ary = [12,3];
ary instanceof Array ->true //返回值通过true or false 来确定这个对象是否是属于这个类的实例
- 除了这种方法外,还有一种更加通过并且安全的方式来检测数据类型,就是通过调用Ojbect类的tostring()方法,查看这个对象原始的是属于什么数据类型的
这种方式的检测只能检测内置类,自定义类没法检测,自定义类全部是返回"[object Object]" 这是我曾希望通过这种方式来检测得出的结果,自定义类可以通过下面的constructor来检测
例如检测数组:
var ary = [];
var regExp =/^([1-9]\d|\d)(.\d{2})$/
Object.prototype.tostring.call(ary) ->"[object Array]";
Object.prototype.tosting.call(reg) ->"[object RegExp ]";
Object.prototype.tostring.call(null)->"[object Null ]";
object.prototype.tostring.call(undefined) ->"[object Undefined]";
(会有个专题专门讲解toString,大家可以关注下)
- 当然可能还可以通过constructor来检测数据类型 ,constructor是类原型上的一个属性,指向对应的构造函数
var ary = [2,34];//定义了Array类的实例
var obj = {};//定义了对象类的实例
ary.constructor == Array ->true;
obj.constructor == Object ->true
通过constructor来检测是非常不安全的,一旦原型链发生改变时,constructor的指向也会发生改变
2.基本数据类型详解:
1. 基本数据类型之number类型(数类型)
什么是number类型呢?(整数,小数,NaN(不是一个有效数))
这边有必要对整数,小数做个解释
在javascript内部,所有的数字都是以64位浮点数形式存储,即使整数也是如此,所以1与1.0是相对的(1===1.0)所以在js语言的底层,根本没有整数,所有的数字都是小数(64位浮点数),但是某些运算只有整数才能完成,那怎么办呢?那这时js会自动把64位浮点数转成32位整数,然后再运算...这个仅作了解,但是大家需要明白由于浮点数是不精确的,所以在js中,涉及小数的比较和运算都要特别小心
如:
1.0+2.0 === 0.3 //false
0.1+0.3 == 0.4 //true
2.number类型中NaN详解?
在number类型的概念中,其中有一个是NaN(not a number),这个是不好理解的,不是一个数,却又是number类型的,那什么情况下就不是一个数了呢?总结了以下两条规则:
- 做数学运算(+,-,*,/,%)失败的时候
- 将其他数据类型强制转化成number类型时,主要通过Number,parseInt(),parseFloat()来强制转换
第一个规则比较好理解,主要是第二条规则,我们来看下 Number()方法强制转换有如下几条规则:
- boolean : Number(true)->1 Number(false) ->0
- 数字仅仅是简单的传入和传出
- null ->0;
- undefined ->NaN
- ""/'' ->0 //注:其他字符,只要有一个不是数值,则返回值是NaN,这是为什么呢?因为Number()方法是整个字符串一起解析的,而并非是单个字符单个字符的解析
强制将字符串其转换成number类型的,还有parseInt和parseFloat两个方法,并且这两个方法每次是逐个解析字符的
parseInt() 将字符串的整数部分提取出来
例如 :parseInt("12px") ->12
parseFloat()不仅能将整数部分提取出来,还能将小数部分提取出来
例如 : parseFloat("12.55px")->12.55
那如何知道这个数是否为有效数呢?怎么能知道这个值是不是NaN呢?
通过isNaN来检测下
isNaN()用来检测某个数值是否为有效数,如果是有效数返回false ,不是有效数返回true
isNaN检测的步骤如下:1.Number()强制转换成数类型 2.isNaN()再去检测
例如:
console.log(isNaN("abc"));//true ->Number("abc")->isNaN(NaN)->true
console.log(isNaN("15.55px"));//true
console.log(isNaN("22.33"));//false
console.log(isNaN(null));//Number(null) -->0 isNaN(0) ->false
二.基本数据类型之boolean类型(布尔类型)
- boolean类型的数据只有两种,true和false,因此其他数据类型如果转换成boolean也只有两种结果,true/false
- 以下这个五个值通过Boolean转换成布尔类型是fasle,其他的全部是true
*0,undefined,null,"",NaN *
**牢记这五个**
三.基本数据类型之字符串
- 字符串就是零个或多个排列在一起的字符,放在单引号或双引号之中
"abc" 'abc'
- 单引号字符串的内部可以用双引号,双引号的内部也可以用单引号
'attr = "value"';
"it's right!"
这样混着用是可以的,但是如果这样写
"a"b" 'c'd'
这样写就会报错
- 如果想在单引号内部用单引号,或者双引号内部用双引号,则需要在单引号/双引号前加反斜杠,用来转义
'so happy to see \'liLy\''
"so happy to see \"liLy\""
常见的转义字符有:\\ \" \' \r(回车) \n()换行 \t(tab)
- 在字符串中不能直接换行
例如:
'a
b
c'
这样会报错 SyntaxError: Unexpected token ILLEGAL
那如果想要换行这是一种方式:
'a\nb\nc'
- 另外一种:可以在每一行的尾部使用反斜杠。
var longstring = "long \
long \
long \
string "
输出 "long long long string " 输出的效果在书写时效果一致
注意:反斜杠后面必须是换行符,不能有其他的字符(不如空格),否则会报错
ps:连接运算符(+)可以连接多个单行字符串,将长字符串拆成多行书写,输出的时候也是单行。
var longString = 'Long '
+ 'long '
+ 'long '
+ 'string';
输出 "Long long long string"
四:基本数据类型之null和undefined
- null:空
- undefined:空(未定义)
- 两个都代表的是没有,区别是什么?
- null:暂时没有,我以后会有的
- undefined:压根就没有
- lily的女朋友--undefined lily的男朋友--null
下面总结了下什么情况下是null/undefined?
undefined
1. 变量被声明了,但没有赋值时,就等于undefined。
2. 对象没有声明或者赋值的属性,该属性的值为undefined。
3. 函数没有提供参数或者返回值,默认为undefined
null
1.根节点的父节点(document.parentNode) 是null
2.作为对象原型链的终点