一、比较运算符
1、 有两种比较远算符:
== :会自动转换数据类型再进行比较,有时会出现很诡异的结果。
=== :它不会转换数据类型,如果数据类型不一致,则会返回false,如果一致再比较。
由于javascript这个缺陷,不要使用“==”进行比较,要坚持使用“===”。
2、 NaN 属性是代表非数字值的特殊值(Not a Number)。该属性用于指示某个值不是数字。可以把 Number 对象设置为该值,来指示其不是数字值。NaN这个特殊的Number与其他任何值都不相等,包括它自己:
NaN === NaN; //false
唯一能判断NaN的方法是通过isNaN() 函数(isNaN() 函数通常用于检测 parseFloat() 和 parseInt() 的结果,以判断它们表示的是否是合法的数字。当然也可以用 isNaN() 函数来检测算数错误,比如用 0 作除数的情况):
isNaN(NaN); //true
这里需要注意当除数或者被除数是0的情况,被除数是0结果为NaN,除数是0结果为Infinity
2 / 0; // Infinity
0 / 0; // NaN
3、浮点数的比较
1/3 === (1 - 2/3); //false
这个不是javascript的设计缺陷,而是因为浮点数在运算过程中会产生误差,因为计算机无法精确表示无限循环小数。所以要比较两个无限循环小数是否相等,只能计算它们之差的绝对值看是否小于某个阈值。
Math.abs(1/3 - (1 - 2/3)) < 0.0000001; //true
4、形如javascript这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量的时候必须指定变量类型,如果赋值的时候类型不匹配就会报错。例如java就是静态语言。
5、strict模式
JavaScript在设计之初,为了方便初学者学习,并不强制要求用var申明变量。这个设计错误带来了严重的后果:如果一个变量没有通过var申明就被使用,那么该变量就自动被申明为全局变量:
i = 10; // i现在是全局变量
在同一个页面的不同的JavaScript文件中,如果都不用var申明,恰好都使用了变量i,将造成变量i互相影响,产生难以调试的错误结果。
使用var申明的变量则不是全局变量,它的范围被限制在该变量被申明的函数体内,同名变量在不同的函数体内互不冲突。
为了修补JavaScript这一严重设计缺陷,ECMA在后续规范中推出了strict模式,在strict模式下运行的JavaScript代码,强制通过var申明变量,未使用var申明变量就使用的,将导致运行错误。
启用strict模式的方法是在JavaScript代码的第一行写上:
'use strict';
这是一个字符串,不支持strict模式的浏览器会把它当做一个字符串语句执行,支持strict模式的浏览器将开启strict模式运行JavaScript。
不用“var”申明的变量会被视为全局变量,为了避免这一缺陷,所有的javascript代码都应该使用strict模式。
6、多行字符串
多行字符串用’\n’来分隔比较麻烦,所以最新的ES6标准新增了一种多行字符串的表示方法,用反引号 `……` 表示:
`这是
一个
多行
字符串`;
7、操作字符串
获取字符串中某个字符,可以采用数组下标索引的方式
indexOf()会搜索指定字符串的位置:
var s = “hello, world”;
s.indexOf(“world”); //返回7
s.indexOf(“World”); //返回-1
substring()返回指定索引区间的子串;
var s = “hello, world”;
s.substring(0,5); //从索引0开始到5(不包括5),返回“hello”
s.substring(7); //从索引7开始到结束,返回“world”
8、数组
直接给array的length赋一个新值会导致array的大小变化:
var array = [1,2,3];
array.length; //3
array.length = 6; //array变为[1,2,3,undefined,undefined,undefined] undefined不显示
array.length = 2; //array变为[1,2]
array可以通过索引把对应元素的值改为新值,对索引赋值可以直接修改这个array,但是如果赋值的索引超过了数组的范围,将会导致array大小的变化(大多数语言不允许直接改变数组大小,越界访问索引会报错。在编写代码的时候,不建议直接修改数组大小,在访问索引时,要确保索引不会越界):
var arr = [1,2,3];
var arr[1] = 4; //arr变为[1,4,3]
var arr[5] = x; //arr变为[1,4,3,undefined,undefined,’x’]
indexOf:
与String类似,Array也可以通过indexOf来获得一个指定元素的位置:
var arr = [10,20,’30’,’abc’];
arr.indexOf(10); //元素10的索引为0
arr.indexOf(30); //元素30没有找到,返回为-1
arr.indexOf(’30’); //元素’30’的索引为2;
(4)slice:
类似String的subString(),截取Array的部分元素,返回一个新的Array(对于起止参数,包括开始索引但不包括结束索引):
var arr = [0,1,2,3,4,5,6,7];
arr.slice(0,3); //从索引0开始到索引3结束,但是不包括索引3:[0,1,2]
arr.slice(3); //从索引3开始到结束:[3,4,5,6,7]
var copy = arr.slice(); //从索引0开始到结束:[0,1,2,3,4,5,6,7],
//利用这一点,可以快速的复制数组
copy === arr; //false
这里有一个指针的概念需要注意一下:
var arr2 = arr1; //指针相同
var arr2 = arr1.slice(); //指针不同
可以自己运行一下以下这个小程序测试一下
var arr1 = [1,2,3,4,5,6,7];
var arr2 = arr1;
arr1[3] = 10;
alert(arr1 == arr2);
alert(arr2);
var arr3 = arr1.slice();
arr1[3] = 10;
alert(arr1 == arr3);
alert(arr3);
(5)push和pop:
push()向数组的末尾添加若干元素,返回值为数组的长度,pop()则把数组的最后一个元素删掉,返回值为删除的元素:
var arr = [1,2];
arr.push(‘A’,’B’); //返回数组的长度为4,数组为[1,2,’A’,’B’]
arr.pop(); //返回’B’,数组为[1,2,’A’]
… //连续pop
arr.pop(); //返回1,数组为[]
arr.pop() //空数组继续pop不会报错,而是返回undefined,数组依然为[]
(6)unshift和shift:
unshift()向数组的头部添加元素,返回数组的长度,同push;shift()删除数组的第一个元素,返回值为删除的元素,同pop
(7)sort:
对当前Array进行排序,他会直接修改当前Array的元素位置,直接调用时按照默认顺序进行排序(也可以按照指定顺序进行排序)
var arr = [5,9,3,1];
arr.sort(); //arr为[1,3,5,9]
(8)reverse:反转数组元素
var arr = [‘A’,’B’,’C’];
arr.reverse(); //数组为[‘C’,’B’,’A’]
(9)splice:
修改Array的万能方法,可以从指定索引开始删除若干元素,然后再从该位置添加若干元素
var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle'];
// 从索引2开始删除3个元素,然后再添加两个元素:
arr.splice(2, 3, 'Google', 'Facebook'); // 返回删除的元素 ['Yahoo', 'AOL', 'Excite']
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
// 只删除,不添加:
arr.splice(2, 2); // ['Google', 'Facebook']
arr; // ['Microsoft', 'Apple', 'Oracle']
// 只添加,不删除:
arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因为没有删除任何元素
arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
(10)concat:
把当前数组与另一个数组拼接起来,返回一个新的数组
注意:concat并没有修改当前数组,而是返回了一个新的数组,实际上concat()方法可以接收任意个元素和数组,并自动把数组拆开,然后全部添加到新的数组里面。
var arr = ['A', 'B', 'C'];
arr.concat(1, 2, [3, 4]); // ['A', 'B', 'C', 1, 2, 3, 4]
(11)join():
这是一个很实用的方法,它把当前Array的每个元素都用指定的字符串连接起来,然后返回连接后的字符串
var arr = ['A', 'B', 'C', 1, 2, 3];
arr.join('-'); // 'A-B-C-1-2-3'