基本数据类型:
字符串:String
数字:Number
布尔值:Boolean true/fasle
特殊数据类型:
空对象:Null
未定义:Undefined
复合数据类型:
对象:Object
数组: Array
一、 String字符串类型
String类型用于表示由零或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由单引号(')或双引号(")表示。
如: var name = 'yan';
var keMu = 'HTML5';
console.log(name); // yan ,在控制台输出变量的值
console.log(keMu); // HTML5
任何字符串的长度都可以通过访问其length属性取得
alert(str1.length); //输出5
要把一个值转换为一个字符串有两种方式。第一种是使用几乎每个值都有的toString()方法。
var age = 11;
var ageAsString = age.toString(); //字符串"11"
var found = true;
var foundAsString = found.toString(); //字符串"true"
数值、布尔值、对象和字符串值都有toString()方法。但null和undefined值没有这个方法。
二、Number 数字类型
数值类型包括了整数和浮点数,整数可以是十进制、十六进制和八进制数,十进制数由一串数字序列组成,它的第一个数字不能为0。如果第一个数字为0,则表示它是一个八进制数。如果0x,则表示它为一个十六进制数。
浮点数必须包含一个数字、一个小数点或“e”(或“E”)。浮点数例子如下:3.1415、 -3.1E12、0.1e12和2E-12。
这种类型用来表示整数和浮点数值,还有一种特殊的数值,即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个函数对于同样的输入会返回不同的结果。
Number()函数的转换规则如下:
● 如果是Boolean值,true和false将分别被替换为1和0
● 如果是数字值,只是简单的传入和返回
● 如果是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
三、Boolean 布尔值
布尔值 true 代表“真”,false 代表“假”。一般关系运算符会返回布尔值的结果。另外,数值的 0、-0、特殊值的 null、NaN、undefined 以及空字符("")都会被解释为 false ,其他值则会被解释为 true 。
下面的代码定义了一个名为 myBoolean 的布尔对象:
var myBoolean=new Boolean();
如果布尔对象无初始值或者其值为:
0 -0 null "" false undefined NaN
那么对象的值为 false。否则,其值为 true(即使当自变量为字符串 "false" 时)!
var f1 = true, f2 = false
console.log( f1 && f2 ) // false && 逻辑运算符,与
console.log( f1 || f2 ) // true || 漏记运算符, 或
四、Null 空对象 和 Undefined
首先说下null与undefined区别:
对已声明但未初始化的和未声明的变量执行typeof,都返回"undefined"。
null表示一个空对象指针,typeof操作会返回"object"。
一般不显式的把变量的值设置为undefined,但null相反,对于将要保存对象的变量,应明确的让该变量保存null值。
var bj;
alert(bj); // undefined
bj = null;
alert(typeof bj); //"object"
alert(bj == null); //true
bj = {};
alert(bj == null); //false
Null是一个对象,但是为空。因为是对象,所以 typeof null 返回 'object' 。
null 是 JavaScript 保留关键字。
null 参与数值运算时其值会自动转换为 0 ,因此,下列表达式计算后会得到正确的数值:
表达式:123 + null 结果值:123
表达式:123 *
null 结果值:0
undefined是全局对象(window)的一个特殊属性,其值是未定义的。但 typeof undefined 返回 'undefined' 。
虽然undefined是有特殊含义的,但它确实是一个属性,而且是全局对象(window)的属性。请看下面的代码:
alert('undefined' in window); //输出:true
var anObj = {};
alert('undefined' in anObj); //输出:false
从中可以看出,undefined是window对象的一个属性,但却不是anObj对象的一个属性。
注意:尽管undefined是有特殊含义的属性,但却不是JavaScript的保留关键字。
undefined参与任何数值计算时,其结果一定是NaN。
随便说一下,NaN是全局对象(window)的另一个特殊属性,Infinity也是。这些特殊属性都不是JavaScript的保留关键字!
五、 Object 对象
javascript 里最基本的数据类型是对象。JavaScript里的对象其实是一个无序的属性集合,属性又是一个个的名-值对。
除了字符串,数字,true,false,null或者undefined以外,其他所有的值在JavaScript里头都是对象。
对象是引用类型,如果变量x表示一个对象,当执行var y = x;语句后,实际上y和x指向的是同一个对象。所以,当你通过y改变对象的值,这种变化也会反映到x上。
如何创建对象:
1. 字面量表示法:
var book = {}; //创建一个没有属性的对象
var book = {
name : "The Definitive Guide";
"main title" : "JavaScript"; //当属性名中间有空格,或者"-"时,要用引号把属性名括起来
author : { //对象的属性也可以是对象
firstname : "Rex";
lastname : "Mai";
}
};
2. 使用new关键字:
var o = new Object(); // 创建一个空对象,效果等同{}.
var a = new Array(); // 创建一个空数组,效果等同 [].
var d = new Date(); // 创建一个表示当前时间的对象
var r = new RegExp("js"); // 创建一个正则表达式对象
3. 使用Object.create() ,这是ECMAScript5 新添加的方法,该方法接受一个参数——对象原型。
var o1 = Object.create({x:1, y:2});
var o2 = Object.create(Object.prototype); // 结果等同于{}或new Object()
你可以给该方法传null,结果会是一个不继承任何属性和方法的空对象
获取对象的值:
通过.或者[]操作符。
book.title;
book["title"];
var propertyName = "title";
book[propertyName];
如果对象的属性是固定的,那么这两个方法的作用差别不大。但由于javascript是一种松散类型的语言,所以,你可以在程序运行期间为对象添加任意数量的属性。当你使用.操作符访问对象属性时,.后面的名字其实只是一个标识符,所以你必须完整的输入这个标识符,才能够访问到。
// 对象 Object ,值在{ name:value } ,键对值,即属性名:属性值
// 可根据其属性名找到相对应的属性值
var info = { 'name':'yan', 'keMu':'HTML5', 'age':'3' }
console.log(info) // Object { name: "yan", keMu: "HTML5", age: "3" }
console.log( info.name ) // yan
六、数组(Array)
ECMAScript的数组与其他语言中的数组有着相当大的区别。虽然ECMAScript中的数组也是有序列表,但是它数组你的每一项可以保存任何类型的数据。ECMAScript数组的大小是可以动态调整的。
创建数组的基本方式有两种
第一种是使用Array构造函数,如下所示:
复制代码 代码如下:
var colors = new Array();
如果知道数组要保存的项目数量,也可以给构造函数传递参数,而该参数会自动变成length属性的值,如下:
var colors = new Array(20);
也可以向Array构造函数中传递数组中应包含的项,如下代码所示:
var colors = new Array("red","blue");
第二种使用Array构造函数时也可以省略new操作符,如下所示:
var colors = Array(20);
创建数组的第二种方式是使用数组字面量表示法。数组字面量由一对包含数组项的方括号表示,多个数组项之间用逗号隔开,如下所示:
复制代码 代码如下:
var color = ["red","blue"];
var names = [];
var values = [1,2,] //IE8及之前3项,其他2项,不建议使用
与对象一样,在使用数字字面量表示法时,也不会调用Array的构造函数。
在读取和设置数组的值时,要使用方括号并提供相应值的基于0的数字索引,如下所示:
复制代码 代码如下:
var colors = ["red","blue"]; //定义数组
alert(colors[0]);
//red
colors[1] = "black" //修改第2项
colors[2] = "brown" //新增第3