javascript中的数据类型分为两类:原始类型和对象类型。其中原始类型包括Undefined、Null、Boolean、Number和String,除开这几种类型之外的就是对象类型。javascript
null是javascript语言中的关键字,它表示一个特殊值,经常使用来表示“空值”,对null执行typeof操做符,结果返回字符串“object”,也就是说,能够将null认为是一个特殊的对象值,含义是“非对象”。但实际上,一般认为null是他自有类型的惟一成员,他能够表示数字,字符串和对象是“无值的”java
var car = null; console.log(typeof car); // "object"
undefined是JavaScript第二个表示空缺的值,用未定义的值表示 更深层次的“空值”,他是变量的一种取值,代表变量没有初始化,若是要查询的对象属性或数组元素的值返回undefined则说明这个属性或元素不存在,若是函数没有任何返回值,则返回undefined。使用typeof操做符返回undefined,代表这个值是这个类型的惟一成员。尽管null和undefined是不一样的,但他们都表示值的空缺,二者每每能够互换,判断符“==”认为二者是相等的(须要使用“===”才能区分他们)。编程
var car console.log(car);//"undefined" console.log(typeof car);//"undefined" function test() { return; } console.log(test())//"undefined" console.log(undefined == null);//true console.log(undefined === null);//false
布尔值表明真或假。这个类型只有两个值:true和false.虽然Boolean类型的字面值只有两个,但JavaScript中全部类型的值都有与这两个Boolean值等价的值。要将一个值转换为其对应的Boolean值,能够调用类型转换函数Boolean()。undefined,null,0,-0,NaN,''会被转换成false,全部其余值都会转换成true.数组
var a = ''; var b = null; var c = 0; var d = NaN; var e; console.log(Boolean(a));//false console.log(Boolean(b));//false console.log(Boolean(c));//false console.log(Boolean(d));//false console.log(Boolean(e));//false
这种类型用来表示整数和浮点数值,还有一种特殊的数值,即NaN(非数值 Not a Number)。这个数值用于表示一个原本要返回数值的操做数未返回数值的状况(这样就不会抛出错误了)。例如,在其余编程语言中,任何数值除以0都会致使错误,从而中止代码执行。但在JavaScript中,任何数值除以0会返回NaN,所以不会影响其余代码的执行。NaN自己有两个非同寻常的特色。首先,任何涉及NaN的操做(例如NaN/10)都会返回NaN,这个特色在多步计算中有可能致使问题。其次,NaN与任何值都不相等,包括NaN自己。例如,下面的代码会返回false。编程语言
alert(NaN == NaN); //false
JavaScript中有一个isNaN()函数,这个函数接受一个参数,该参数可使任何类型,而函数会帮咱们肯定这个参数是否“不是数值”。isNaN()在接收一个值以后,会尝试将这个值转换为数值。某些不是数值的值会直接转换为数值,例如字符串”10“或Boolean值。而任何不能被转换为数值的值都会致使这个函数返回true。例如:函数
alert(isNaN(NaN)); //true alert(isNaN(10)); //false(10是一个数值) alert(isNaN("10")); //false(可能被转换为数值10) alert(isNaN("blue")); //true(不能被转换为数值) alert(isNaN(true)); //false(可能被转换为数值1)
有3个函数能够把非数值转换为数值:Number()、parseInt()和parseFloat()。第一个函数,即转型函数Number()能够用于任何数据类型,而另外两个函数则专门用于把字符串转换成数值。这3个函数对于一样的输入会返回不一样的结果。spa
Number()函数的转换规则以下:prototype
● 若是是Boolean值,true和false将分别被替换为1和0code
● 若是是数字值,只是简单的传入和返回对象
● 若是是null值,返回0
● 若是是undefined,返回NaN
● 若是是字符串,遵循下列规则:
○ 若是字符串中只包含数字,则将其转换为十进制数值,即”1“会变成1,”123“会变成123,而”011“会变成11(前导的0被忽略)
○ 若是字符串中包含有效的浮点格式,如”1.1“,则将其转换为对应的浮点数(一样,也会忽略前导0)
○ 若是字符串中包含有效的十六进制格式,例如”0xf“,则将其转换为相同大小的十进制整数值
○ 若是字符串是空的,则将其转换为0
○ 若是字符串中包含除了上述格式以外的字符,则将其转换为NaN
● 若是是对象,则调用对象的valueOf()方法,而后依照前面的规则转换返回的值。若是转换的结果是NaN,则调用对象的toString()方法,而后再依次按照前面的规则转换返回的字符串值。
var num1 = Number("Hello World"); //NaN var num2 = Number(""); //0 var num3 = Number("000011"); //11 var num4 = Number(true); //1
因为Number()函数在转换字符串时比较复杂并且不够合理,所以在处理整数的时候更经常使用的是parseInt()函数。parseInt()函数在转换字符串时,更多的是看其是否符合数值模式。它会忽略字符串前面的空格,直至找到第一个非空格字符。若是第一个字符串不是数字字符或者负号,parseInt()会返回NaN;也就是说,用parseInt()转换空字符串会返回NaN。若是第一个字符是数字字符,praseInt()会继续解析第二个字符,知道解析完全部后续字符或者遇到了一个非数字字符。例如,"1234blue"会被转换为1234,”22.5“会被转换为22,由于小数点并非有效的数字字符。
若是字符串中的第一个字符是数字字符,parseInt()也可以识别出各类整数格式(即十进制、八进制、十六进制)。为了更好的理解parseInt()函数的转换规则,下面给出一些例子
var num1 = parseInt("1234blue"); //1234 var num2 = parseInt(""); //NaN var num3 = parseInt("0xA"); //10(十六进制) var num4 = parseInt("22.5"); //22 var num5 = parseInt("070"); //56(八进制) var num6 = parseInt("70"); //70 var num7 = parseInt("10",2); //2(按二进制解析) var num8 = parseInt("10",8); //8(按八进制解析) var num9 = parseInt("10",10); //10(按十进制解析) var num10 = parseInt("10",16); //16(按十六进制解析) var num11 = parseInt("AF"); //56(八进制) var num12 = parseInt("AF",16); //175
与parseInt()函数相似,parseFloat()也是从第一个字符(位置0)开始解析每一个字符。并且也是一直解析到字符串末尾,或者解析到碰见一个无效的浮点数字字符为止。也就是说,字符串中的第一个小数点是有效的,而第二个小数点就是无效的了,所以它后面的字符串将被忽略。例如,”22.34.5“将会被转换成22.34。
parseFloat()和parseInt()的第二个区别在于它始终都会忽略前导的零。因为parseFloat()值解析十进制值,所以它没有用第二个参数指定基数的用法。
var num1 = parseFloat("1234blue"); //1234 var num2 = parseFloat("0xA"); //0 var num3 = parseFloat("22.5"); //22.5 var num4 = parseFloat("22.34.5"); //22.34 var num5 = parseFloat("0908.5"); //908.5
String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串能够由单引号(')或双引号(")表示。由单引号定界的字符串能够包含双引号,由双引号定界的字符串能够包含单引号。也能够将字符串拆分为多行,每行用反斜线结束。好比
var str1 = ""; var str2 = 'test'; var str3 = '3.14'; var str4 = 'wound you like "javascript"?' var str5 = 'wound \ you'
javasript内置有字符串的链接,若是表达式中含有字符串,经过加号运算符能够将字符串拼接起来。对于不是字符串的值,会先转成字符串再拼接。
var str1 = 'hello' + ' world'; //"hello world" var str2 = '1' + 1; //11 var str3 = true + 'false'; //"truefalse"
字符串有许多能够调用的方法(能够经过String.prototype查看全部方法)。
var str = "hello world" str.length //11,字符串长度 str.charAt(0) //'h',第一个字符 str.charAt(str.length-1) //'d',最后一个字符 str.substring(1,4) //'ell',第2-4的字符 str.slice(1,4) //'ell',同上 s.indexOf('l') //2,字符l首次出现的位置 str.split(' ') //["hello","world"],分割字符串 str.__proto__ //字符串原型对象 String.prototype //同上
除开以上类型之外的都是对象,包括数组,函数,对象,正则等等都是对象类型。对象其实就是一组数据和功能的集合。对象能够经过执行new操做符后跟要建立的对象类型的名称来建立。而建立Object类型的实例并为其添加属性和(或)方法,就能够建立自定义对象。也可使用对象直接量进行建立,对象直接量是若干个键值对组成的映射表,也能够经过Object的create方法建立对象。对象都是独一无二的,无论经过什么方法建立的对象都不相等。
var obj1 = {}; //空对象 var obj2 = new Object(); //空对象 var obj3 = Object.create(null); //空对象 var obj4 = new Object(); console.log(obj2 == obj4) //false
每个对象类型的实例都具备许多方法。能够经过Object.prototype来查看对象的全部方法。
var obj = new Object(); obj.toString() //[object,object],转为字符串 obj.title = 'hello' //添加属性 Object.defineProperty(obj,'title',{ value: 'hello', writable: true, enumerable: true, configurable: true }) //同上 obj.valueOf() //object, 返回对象的基元值。 obj.__proto__ //对象原型 Object.prototype //同上