javascript中的真假值、数据类型判断以及+的特殊用法
一、javascript中的假值
jQuery中拥有一组数量奇大的假值,包括
0,NaN(非数),''(空字符串),false,null,undefined
这些值在if判断中全部等于假,但这些值彼此是不==的。注意空数组[],空对象{}在if判断中是为真的。
二、javascript中的数据类型
javascript中变量是没有类型的,只有值才有,变量可以随时持有任意类型的值。
1)在javascript中一共有七种内置类型,分别是
string,number,boolean,null,undefined,object,symbol(ES6中新增)
其中,string,number,boolean,null,undefined是简单基本类型,其本身并不是对象(从这个角度来说,javascript中万物皆对象的说法不完全正确),有时候null会被当做对象,因为typeof null返回object,实际上null本身是一种基本类型。
2)javascript typeof的返回值有七种,它返回类型的字符串值,有意思的是,这其中类型和它的字符串值并不一一对应,分别是字符串形式的
string,number,boolean,object,function,undefined,symbol
其中,typeof undefined =='undefined',typeof null则返回object,虽然null是一种基本的数据类型。typeof function a(){} 则返回 function,虽然function只是object的一种子类型。
3)javascript的Object有一些对象子类型,包括:
String,Number,Boolean,Object,Function,Array,Data,RegExp,Error
其中,String,Number,Boolean是基本类型string,number,boolean的包装类型,当调用对应的方法时,其拆包和装包是自动发生的。
4)通过Object.prototype.toString.call()返回的值则有10钟,分别是:
[object String],[object Number],[object Boolean],[object Object],[object Function],[object Array],[object Date],[object RegExp],[object Null],[object Undefined]
上述对象大多有有文字字面量和构造函数两种形式,其中null和undefined没有对应的构造形式,只有文字形式;相反Date只有构造,没有文字形式。
三、javascript中的类型判断
鉴于对象子类型通过typeof是判断不出来的,例如Array,Date的typeof都为Object,RegExp在有些浏览器下为Object,在有些浏览器下为Function。因此typeof在这种情况下是不能精确判断的。像jQuery这样的类库都是通过Object.toString.call的方法来进行类型判断
此外,对于数字类型,最好使用isFinite判断,isFinite在判断之前会试图将参数转换为number类型。
class2type={}, core_toString=class2type.toString, jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(i,name){ class2type["[object "+name+"]"]=name.toLowerCase(); }); type:function(obj){ if(obj===null){ return String(null); } //Date,Array等类型typeof都会返回object,function、正则(部分浏览器)中 typeof都会返回function if(typeof obj==='object'||typeof obj==='function'){ return class2type[core_toString.call(obj)]||'object'; } return typeof obj; },
isNumeric:function(obj){ return !isNaN(parseFloat(obj))&&isFinite(obj); },
三、javascript中加号的神奇用法
在javascript中,+通常用户数学上的加法运算,以及字符串的链接运算。实际上,+还有一些特殊用法。
1.将日期转换为毫秒整数
//+将日期转换为毫秒计数的整数 console.log(+new Date()); //1478656394234 console.log(+new Date('2016/11/11 0:00')); //1478793600000
2.转换为数字
//将其他类型的数据转换为数字类型(多为字符串转换为数字) console.log(+''); //0 console.log(+true); //1 console.log(+false); //0 console.log(+undefined); //NaN console.log(+null); //0 console.log(+NaN); //NaN console.log(+'123'); //123 console.log(+'012'); //12 console.log(+'1xy'); //NaN