二、判断一个变量属于什么数据类型。
1.数值型(number)。
数值表达式指的是任何值为数字的表达式。这种表达式的元素可以包括关键字、变量、文字和运算
符的任意组合,只要此组合能够生成一个数字。在特定的情况下,如果可以的话,字符串也可以被
转换为数字。
比较常用的判断方法是
代码如下 | 复制代码 |
function isNumber(val) { return typeof val === 'number'; } |
但有些情况就不行。比如
var a;
document.write(isNumber(parseInt(a)));
这里打印出来的是true,但实际上变量a是NaN,它是不能用于数值运算的。
所以上面的函数可以修改为
代码如下 | 复制代码 |
function isNumber(val) { return typeof val === 'number' && isFinite(val); } |
isFinite() 函数是js自带的,它会过滤掉NaN和Infinity。
另外,判断变量是否是NaN,可以用isNaN(),它返回布尔值。
把数字转为字符串6种方式
代码如下 | 复制代码 |
var n = 1.23456; var n_as_str = n+""; String(n); n.toString(x); //x=2,binary; x=8, octonay; x=16,hexadecimal.if empty,decimal n.toFixed(x); //小数点后位数 n.toExponential(x); //显示指数形式,x表示小数位 n.toPrecision(x); //若n位数>x时显示为指数,x表示数字的精度 |
2.布尔型(boolean)、 字符串型(string) 和未定义(Undefined)。
这3个类型 比较简单,直接用
一个值为 true 或者 false 的表达式。
如果需要,非 Boolean 表达式也可以被转换为 Boolean 值,但是要遵循下列规则:所有的对象都被当作 true。当且仅当字符串为空时,该字符串被当作 false。
null 和 undefined 被当作 false。
当且仅当数字为零时,该数字被当作 false。
typeof val === ‘boolean’
typeof val === ‘string’
typeof val === ‘undefined’
特殊数据类型是:Null Undefined
null = = undefined
true
"NaN" = = NaN
false
5 = = NaN
false
NaN = = NaN
false
NaN != NaN
true
false = =0
true
true = =1
true
true = = 2
false
undefined = = 0
false
null = = 0
false
"5" = = 5
true
就可以了。
3.对象(Object)和 空值(Null)。
由于当变量是空值Null时,typeof也会返回object,所以Object不能直接用
typeof 判断。应该这样
代码如下 | 复制代码 |
function isObj(str) { if(str === null || typeof str === 'undefined') { return false; } return typeof str === 'object'; } |
判断空值用 val === null 即可。注意要用全等。
对象比较
如果是 object, array, function 类型,比较他们的 reference. 只有当他们的 reference 相等才为 true.
代码如下 | 复制代码 |
function Point(x,y){ this.x = x; this.y = y; }; Point.prototype.toString = function(){ alert("in toString"); return "x=" + this.x + " y=" + this.y; };
Point.prototype.valueOf = function(){ alert("in valueOf"); return this.x+this.y; }; var pa = new Point(1,1); var pb = new Point(1,1); var pc = pa; 则: pa!=pb; pa!==pb; pa==pc; pa===pc;
var arr1 = [1,2,3]; var arr2 = [1,2,3]; arr1!=arr2, arr1!==arr2
不得不说一下 0, false, null, undefined var t1 = 0; var t2 = false; var t3 = null; var t4; 则: t1==t2;t1!==t2; t1!=t3; t1!==t3; t1!=t4; t1!==t4; t2!=t3; t2!==t3; t2!=t4; t2!==t4; t3==t4; t3!==t4; |
3. 比较对象的转换顺序
如果一个 object 和一个基本类型比较 , 则先调用对象的 valueOf, 再调用对象的 toString 与基本类型进行比较。也就是说先转成 number 型,再转成 string 类型
如果是与 boolean 比较 , 先把 true 转为 1,false 转为 0 再比较。
var pa = new Point(1,1);
alert(pa==2); 会输出 "in valueOf", 再输出 "true";
如果屏蔽掉 Point.prototype.valueOf 则输出 "in toString", 再输出 "false";
var pa = new Point(1,0);
则 pa==true;
关系操作符 >=,<=,>,<
如果两边都是数字 , 或者可以转化为数字 , 则比较数字。
如果两边都是 string , 或者可以转化为 string , 则比较 string 。
如果一边可转为 string, 一边可转为 number, 则再试图把 string 转为 number 再比较 , 如果 string 不能转为 number, 则为 NaN, 返回 false.
4.数组(Array)。
数组类型不可用typeof来判断。因为当变量是数组类型是,typeof会返回object。
这里有两种方法判断数组类型。
代码如下 | 复制代码 |
function isArray(arr) { return Object.prototype.toString.apply(arr) === '[object Array]'; } //或 function isArray(arr) { return arr.constructor === Array; } |
NaN:保留字(表明数据类型不是数字)
undefined:对象属性或方法不存在,或声明了变量但从未赋值。
即当你使用了对象未定的属性或者未定义的方法时或当你声明一个变量,但你确从未对其进行赋值,便对
其进行操作(当然赋值除外),会有"undefined"提示null 值指出一个变量中没有包含有效的数据。
产生 null 的原因是:对一个变量显式地赋值为 null。 包含 null 的表达式之间的任何操作。
Boolean 表达式
一个值为 true 或者 false 的表达式。
如果需要,非 Boolean 表达式也可以被转换为 Boolean 值,但是要遵循下列规则:所有的对象都被当作 true。当且仅当字符串为空时,该字符串被当作 false。
null 和 undefined 被当作 false。
当且仅当数字为零时,该数字被当作 false。
字符串比较
两个字符序列之间的比较。
除非在进行比较操作的函数中指出,所有的字符串比较操作都是二进制的。
在英语中,二进制比较区分大小写;而文本比较则不区分。