JavaScript 数据类型和变量
JavaScript 数据类型
字符串、数字、数组、布尔、对象、Null、Undefined
Number (数字)
JavaScript不区分整数和浮点数,统一用Number表示。
合法的Number类型
123; // 整数123
0.456; // 浮点数0.456
1.2345e3; // 科学计数法表示1.2345x1000,等同于1234.5
-99; // 负数
NaN; // NaN表示Not a Number,当无法计算结果时用NaN表示
Infinity; // Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity
Number可以直接做四则运算,规则和数学一致:
1 + 2; // 3
( 1 + 2 ) * 5 / 2; // 7.5
2 / 0; // Infinity
0 / 0; // NaN
10 % 3; // 1
10.5 % 3; // 1.5
注意 % 是求余运算。
String (字符串)
字符串是以单引号 ( ' ) 或双引号 ( " ) 括起来的任意文本,单引号或双引号只是一种表示方式,不是字符串的一部分。
转义字符 \
输出 单引号 或 双引号 可以用转义字符 \ 来标识
转义字符 \ 可以转义很多字符,比如 \n 表示换行,\t 表示制表符,字符 \ 本身也要转义,所以 \\ 表示的字符就是 \。
ASCII字符
ASCII字符可以以 \x## 形式的十六进制表示,例如:
'\x41'; //完全等同于'A'
还可以用 \u#### 表示一个Unicode字符:
'\u4e2d\u6587'; //完全等同于'中文'
多行字符串
由于多行字符串用 \n 写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用反引号 ` ... ` 表示:
模板字符串
多个字符串可以用 + 号连接起来
如果有很多变量需要连接,用+号就比较麻烦。ES6新增了一种模板字符串,表示方法和上面的多行字符串一样,但是它会自动替换字符串中的变量:
注意:拼接时要用反引号括起来,否则 ${... } 会以字符串的形式输出
操作字符串
获取字符串的长度:(注意:空格也是字符串的一部分)
要获取字符串某个指定位置的字符,使用类似Array的下标操作,索引号从0开始:
字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果:
字符串常用方法
JavaScript为字符串提供了一些常用方法,注意,调用这些方法本身不会改变原有字符串的内容,而是返回一个新字符串:
toUpperCase
toUpperCase()把一个字符串全部变为大写:
toLowerCase
toLowerCase() 把一个字符串全部变为小写:
indexOf
indexOf()会搜索指定字符串出现的位置:
substring
substring()返回指定索引区间的子串:
Array (数组)
数组是一组按顺序排列的集合,集合的每个值称为元素。
JavaScript的数组可以包括任意数据类型。并通过索引来访问每个元素。
数组用[]表示,元素之间用,分隔。
[ 1,3.14,'Hello',null,true,undefined ];
另一种创建数组的方法是通过Array()函数实现:
newArray(1,2,3); // 创建了数组[1, 2, 3]
然而,出于代码的可读性考虑,强烈建议直接使用[]。
要取得Array的长度,直接访问length属性:
请注意,直接给Array的length赋一个新的值会导致Array大小的变化:
Array可以通过索引把对应的元素修改为新的值,因此,对Array的索引进行赋值会直接修改这个Array:
如果通过索引赋值时,索引超过了范围,同样会引起Array大小的变化:
大多数其他编程语言不允许直接改变数组的大小,越界访问索引会报错。然而,JavaScript的Array却不会有任何错误。在编写代码时,不建议直接修改Array的大小,访问索引时要确保索引不会越界。
indexOf
与String类似,Array也可以通过indexOf()来搜索一个指定的元素的位置:
注意:数字 30 和 字符串 '30' 是不同的元素
slice
slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array:
注意:到slice()的起止参数包括开始索引,不包括结束索引。
如果不给slice()传递任何参数,它就会从头到尾截取所有元素。利用这一点,我们可以很容易地复制一个Array:
push 和 pop
push()向Array的末尾添加若干元素,pop()则把Array的最后一个元素删除掉:
unshift 和 shift
如果要往Array的头部添加若干元素,使用unshift()方法,shift()方法则把Array的第一个元素删掉:
sort
sort()可以对当前Array进行排序,它会直接修改当前Array的元素位置,直接调用时,按照默认顺序排序:
想要按照指定的顺序排序需要创建函数。
reverse
reverse()把整个Array的元素给反转:
splice
splice()方法是修改Array的“万能方法”,它可以从指定的索引开始删除若干元素,然后再从该位置添加若干元素:
concat
concat()方法把当前的Array和另一个Array连接起来,并返回一个新的Array:
注意:concat()方法并没有修改当前Array,而是返回了一个新的Array。
concat()方法可以接收任意个元素和Array,并且自动把Array拆开,然后全部添加到新的Array里:
join
join()方法是一个非常实用的方法,它把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串:
多维数组
如果数组的某个元素又是一个Array,则可以形成多维数组
var arr = [[1,2,3], [400,500,600],'-'];
上述Array包含3个元素,其中头两个元素本身也是Array。
数组的元素可以通过索引来访问。请注意,索引的起始值为0:
var arr = [1,2,3.14,'Hello',null,true];
arr[0]; // 返回索引为0的元素,即1
arr[5]; // 返回索引为5的元素,即true
arr[6]; // 索引超出了范围,返回undefined
Boolean (布尔)
布尔值和布尔代数的表示完全一致,一个布尔值只有true、false两种值,要么是true,要么是false,可以直接用true、false表示布尔值,也可以通过布尔运算计算出来:
true;//这是一个true值false;//这是一个false值2>1;//这是一个true值2>=3;//这是一个false值
&&运算是与运算,只有所有都为true,&&运算结果才是true:
true&&true;//这个&&语句计算结果为truetrue&&false;//这个&&语句计算结果为falsefalse&&true&&false;//这个&&语句计算结果为false
||运算是或运算,只要其中有一个为true,||运算结果就是true:
false||false;//这个||语句计算结果为falsetrue||false;//这个||语句计算结果为truefalse||true||false;//这个||语句计算结果为true
!运算是非运算,它是一个单目运算符,把true变成false,false变成true:
!true;//结果为false!false;//结果为true! (2>5);//结果为true
布尔值经常用在条件判断中,比如:
varage =15;if(age >=18) { alert('adult');}else{ alert('teenager');}
Null 和 Undefined
null表示一个“空”的值,它和0以及空字符串''不同,0是一个数值,''表示长度为0的字符串,而null表示“空”。
在其他语言中,也有类似JavaScript的null的表示,例如Java也用null,Swift用nil,Python用None表示。但是,在JavaScript中,还有一个和null类似的undefined,它表示“未定义”。
JavaScript的设计者希望用null表示一个空的值,而undefined表示值未定义。事实证明,这并没有什么卵用,区分两者的意义不大。大多数情况下,我们都应该用null。undefined仅仅在判断函数参数是否传递的情况下有用。
Object (对象)
JavaScript的对象是一种无序的集合数据类型,它由若干键值对组成。
JavaScript的对象用于描述现实世界中的某个对象:
var person = {
name: 'Bob',
age: 20,
tags: ['js','web','mobile'],
city: 'Beijing',
hasCar: true,
zipcode: null
};
JavaScript对象的键都是字符串类型,值可以是任意数据类型。上述person对象一共定义了6个键值对,其中每个键又称为对象的属性,例如,person的name属性为'Bob',zipcode属性为null。
要获取一个对象的属性,我们用对象变量.属性名的方式:
person.name; //'Bob'
person.zipcode; //null
JavaScript用一个{...}表示一个对象,键值对以xxx: xxx形式申明,用,隔开。注意,最后一个键值对不需要在末尾加,,如果加了,有的浏览器(如低版本的IE)将报错。
访问属性是通过 . 操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用''括起来.
属性名middle-school不是一个有效的变量,就需要用 ' ' 括起来。访问这个属性也无法使用 . 操作符,必须用['xxx']来访问
也可以用 xiaoming['name'] 来访问 xiaoming 的 name 属性,不过 xiaoming.name 的写法更简洁。我们在编写JavaScript代码的时候,属性名尽量使用标准的变量名,这样就可以直接通过 object.prop 的形式访问一个属性了。
实际上JavaScript对象的所有属性都是字符串,不过属性对应的值可以是任意数据类型。
访问不存在的属性不报错,而是返回undefined:
由于JavaScript的对象是动态类型,你可以自由地给一个对象添加或删除属性:
如果我们要检测xiaoming是否拥有某一属性,可以用in操作符:
如果in判断一个属性存在,这个属性不一定是xiaoming的,它可能是xiaoming继承得到的,因为toString定义在object对象中,而所有对象最终都会在原型链上指向object,所以xiaoming也拥有toString属性。
hasOwnProperty()方法:判断一个属性是否是xiaoming自身拥有的,而不是继承得到的。
变量
变量的概念基本上和初中代数的方程变量是一致的,只是在计算机程序中,变量不仅可以是数字,还可以是任意数据类型。
变量在JavaScript中就是用一个变量名表示,变量名是大小写英文、数字、$和_的组合,且不能用数字开头。变量名也不能是JavaScript的关键字,如if、while等。申明一个变量用var语句,比如:
vara;// 申明了变量a,此时a的值为undefinedvar$b=1;// 申明了变量$b,同时给$b赋值,此时$b的值为1vars_007 ='007';// s_007是一个字符串varAnswer =true;// Answer是一个布尔值truevart =null;// t的值是null
变量名也可以用中文,但是,请不要给自己找麻烦。
在JavaScript中,使用等号=对变量进行赋值。可以把任意数据类型赋值给变量,同一个变量可以反复赋值,而且可以是不同类型的变量,但是要注意只能用var申明一次,例如:
vara =123;// a的值是整数123a ='ABC';// a变为字符串
这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言,赋值语句如下:
inta =123;// a是整数类型变量,类型用int申明a ="ABC";// 错误:不能把字符串赋给整型变量
和静态语言相比,动态语言更灵活,就是这个原因。
请不要把赋值语句的等号等同于数学的等号。比如下面的代码:
varx =10;x = x +2;
如果从数学上理解x = x + 2那无论如何是不成立的,在程序中,赋值语句先计算右侧的表达式x + 2,得到结果12,再赋给变量x。由于x之前的值是10,重新赋值后,x的值变成12。
要显示变量的内容,可以用console.log(x),打开Chrome的控制台就可以看到结果。
// 打印变量x
Run
使用console.log()代替alert()的好处是可以避免弹出烦人的对话框。