学习笔记,非原创。谢谢
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; //这个&&语句计算结果为true
true && false; //这个&&语句计算结果为false
false && true && false; //这个&&语句计算结果为false
|| 运算是或运算,只要其中有一个为true,||运算结果就是true:
false || false; //这个||语句计算结果为false
true||false; //这个||语句计算结果为true
false || true || false; //这个||语句计算结果为true
! 运算是非运算,它是一个单目运算符,把true变成false,false变成true:
! true; //结果为false
! false; //结果为true
! (2>5);//结果为true
布尔值经常用在条件判断中,比如:
var age = 15;
if (age >= 18) {
alert( 'adult' );
}else{
alert( 'teenager' );
}
比较运算符
当我们对Number做比较时,可以通过比较运算符得到一个布尔值:
2 > 5; //false
5 >= 2; //true
7 == 7; //true
实际上,JavaScript允许对任意数据类型做比较:
false == 0; //true
false === 0; //false
注意:
= 运算符 为赋值运算符,将 = 右边的值赋值给左边。
== 运算符只比较内容是否一样,不比较数据类型。
=== 运算符 先比较数据类型是否一样,再比较内容是否一样。
由于JavaScript这个设计缺陷,尽量不要使用 == 比较,始终坚持使用 === 比较。
NaN是特殊的Number与所有其他值都不相等,包括它自己:
NaN === NaN; // false
唯一能判断NaN的方法是通过isNaN()函数:
isNaN(NaN); //true
最后要注意浮点数的相等比较:
1/3 === (1 - 2 / 3); //false
这不是JavaScript的设计缺陷。浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。要比较两个浮点数是否相等,只能计算它们之差的绝对值,看是否小于某个阈值:
Math.abs(1 / 3 - ( 1 - 2 / 3 )) < 0.0000001; //true
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自身拥有的,而不是继承得到的。