JavaScript全面学习(入门)
1.NaN === NaN; // false Not a Number
与所有其他值都不相等,包括它自己
isNaN(NaN); // true
1 / 3 === (1 - 2 / 3); // false
浮点数在运算过程中会产生误差
2.大多数情况下,我们都应该用null
。undefined
仅仅在判断函数参数是否传递的情况下有用
3.启用严格模式:JavaScript代码的第一行写上 'use strict';
4.ES6新增了一种多行字符串的表示方法,用` ... `表示(键盘左上角的点)
ES6新增了一种模板字符串,可以如下写:
var name = '小明'; var age = 20; alert(`你好, ${name}, 你今年${age}岁了!`);
5.字符串是不可变的
var s = 'Test'; s[0] = 'X'; alert(s); // s仍然为'Test' alert(s[0]); //仍然为'T'
调用一些字符串方法本身不会改变原有字符串的内容,而是返回一个新字符串
var s = 'hello, world' //中间有空格 s.substring(0, 5); // 从索引0开始到5(不包括5),返回'hello' s.substring(7); // 从索引7开始到结束,返回'world'
6.直接给Array
的length
赋一个新的值会导致Array
大小的变化
var arr = [1, 2, 3]; arr.length; // 3 arr.length = 6; arr; // arr变为[1, 2, 3, undefined, undefined, undefined] arr.length = 2; arr; // arr变为[1, 2]
对Array
的索引进行赋值会直接修改这个Array,与上面的字符串有所不同。
var arr = ['A', 'B', 'C']; arr[1] = 99; arr; // arr现在变为['A', 99, 'C']
7.indexOf
var arr = [10, 20, '30', 'xyz']; arr.indexOf(10); // 元素10的索引为0 arr.indexOf(20); // 元素20的索引为1 arr.indexOf(30); // 元素30没有找到,返回-1, arr.indexOf(xyz)也是-1 arr.indexOf('30'); // 元素'30'的索引为2
8.slice()
类似于上面的substring()
,只不过是用于数组。如果不给slice()
传递任何参数,它就会从头到尾截取所有元素。
var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G']; arr.slice(0, 3); // 从索引0开始,到索引3结束,但不包括索引3: ['A', 'B', 'C'] arr.slice(3); // 从索引3开始到结束: ['D', 'E', 'F', 'G']
9.push()
向Array
的末尾添加若干元素, pop()
则把Array
的最后一个元素删除掉。
unshift()向Array的头部添加若干元素
,shift()
则把Array
的第一个元素删掉。空数组继续pop或者
。shift
不会报错,而是返回undefined
10.sort()
可以对当前Array
进行重新默认排序(按ASCII码,小写字母在大写字母之后),10会在2之前!
reverse()
把整个Array
的元素倒序
要按数字大小排序,我们可以这么写:
var arr = [10, 20, 1, 2]; arr.sort(function (x, y) { if (x < y) { return -1; } if (x > y) { return 1; } return 0; }); // [1, 2, 10, 20]
忽略大小写,按照字母序排序:
var arr = ['Google', 'apple', 'Microsoft']; arr.sort(function (s1, s2) { x1 = s1.toUpperCase(); x2 = s2.toUpperCase(); if (x1 < x2) { return -1; } if (x1 > x2) { return 1; } return 0; }); // ['apple', 'Google', 'Microsoft']
注意,sort()
方法会直接对Array
进行修改保存:
var a1 = ['B', 'A', 'C']; var a2 = a1.sort(); a1; // ['A', 'B', 'C'] a2; // ['A', 'B', 'C'] a1 === a2; // true, a1和a2是同一对象
11.splice()
方法
var arr = ['Microsoft', 'Apple', 'Yahoo', 'AOL', 'Excite', 'Oracle']; arr.splice(2, 3, 'Google', 'Facebook'); //从[2]开始,删除3个元素 ['Yahoo', 'AOL', 'Excite'],同时这3个元素也是返回值,并把'Google', 'Facebook'放在这里。 arr; // 结果是['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle'] arr.splice(2, 2); // 从[2]开始,删除2个元素['Google', 'Facebook'],同时也是返回值 arr; // ['Microsoft', 'Apple', 'Oracle']arr.splice(2, 0, 'Google', 'Facebook'); // 返回[],因为没有删除任何元素 arr; // ['Microsoft', 'Apple', 'Google', 'Facebook', 'Oracle']
12.concat()
方法把当前的Array
和另一个Array
连接起来,并且自动把Array
拆开
var arr = ['A', 'B', 'C']; arr.concat(1, 2, [3, 4]); // ['A', 'B', 'C', 1, 2, 3, 4]
13.join()
把当前Array
的每个元素都用指定的字符串连接起来,然后返回连接后的字符串
var arr = ['A', 'B', 'C', 1, 2, 3]; arr.join('-'); // 'A-B-C-1-2-3'
14.如果属性名包含特殊字符,如-之类的,就必须用''
括起来,且无法用.访问,要用['XXX']访问
var xiaohong = { name: '小红', 'middle-school': 'No.1 Middle School' };xiaohong['middle-school']; // 'No.1 Middle School' xiaohong['name']; // '小红' xiaohong.name; // '小红'
访问不存在的属性不报错,而是返回undefined
,但是可以直接定义一个属性且赋值,如xiaoming.age = 18;
在属性前加 delete 可以删除属性,如 delete xiaoming.age; // 删除age属性
15.如果我们要检测xiaoming
是否拥有某一属性,可以用in
操作符
var xiaoming = { name: '小明', birth: 1990, school: 'No.1 Middle School', }; 'name' in xiaoming; // true 'grade' in xiaoming; // false
但是显示true的属性不一定就是xiaoming本身的,有可能是继承的。
用hasOwnProperty()
方法可以判断准确,只有自身的才会是true
xiaoming.hasOwnProperty('name'); // true
16.JavaScript把null
、undefined
、0
、NaN
和空字符串''
视为false
,其他值一概视为true
17.for ... in
循环遍历
var aa = { name: 'Jack', age: 20, city: 'Beijing' }; for (var key in aa) { alert(key); // 'name', 'age', 'city' }
如果拥有继承属性,这样写还会把继承的属性遍历出来。要过滤掉对象继承的属性,用hasOwnProperty()
来实现
var o = { name: 'Jack', age: 20, city: 'Beijing' }; for (var key in o) { if (o.hasOwnProperty(key)) { alert(key); // 'name', 'age', 'city' } }
对于数组,直接像上面那样遍历只会得出索引编号。而且是字符串类型。
var a = ['A', 'B', 'C']; for (var i in a) { alert(i); // '0', '1', '2' alert(a[i]); // 'A', 'B', 'C' }
同时每一个索引其实也是一个属性,
var a = ['A', 'B', 'C']; a.name = 'Hello'; for (var x in a) { alert(x); // '0', '1', '2', 'name' }
18.JavaScript的对象的键必须是字符串
Map
是一组键值对的结构,具有极快的查找速度,使用方法如下:
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]); m.get('Michael'); // 95
或者:
var m = new Map(); // 空Map m.set('Adam', 67); // 添加新的key-value m.set('Bob', 59); m.has('Adam'); // 是否存在key 'Adam': true m.get('Adam'); // 67 m.delete('Adam'); // 删除key 'Adam' m.get('Adam'); // undefined
Set和Map类似,但是key不能重复,示例:
var s = new Set([1, 2, 3, 3, '3']); s; // Set {1, 2, 3, "3"}
s.add(4); //添加4
s; // Set {1, 2, 3, "3",4}
19.遍历Array
可以采用下标循环,遍历Map
和Set
就无法使用下标。
Array
、Map
和Set
都属于iterable
类型,可以统一通过新的for ... of
循环来遍历,用法如下:
var a = ['A', 'B', 'C']; var s = new Set(['A', 'B', 'C']); var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]); for (var x of a) { // 遍历Array alert(x); } for (var x of s) { // 遍历Set alert(x); } for (var x of m) { // 遍历Map alert(x[0] + '=' + x[1]); }
这样与上面的for...in有很大区别,输出不再是索引,也不再是属性
var a = ['A', 'B', 'C']; a.name = 'Hello'; for (var x of a) { alert(x); // 'A', 'B', 'C' }
20.还有一种更好的遍历方法用forEach
函数
var a = ['A', 'B', 'C']; a.forEach(function (element, index, array) { // element: 指向当前元素的值 // index: 指向当前索引 // array: 指向Array对象本身
//一般(element)就够了,不用后面两个参数。 alert(element); //element返回A,B,C。index返回0,1,2。array返回3次A,B,C });
对于Set
var s = new Set(['A', 'B', 'C']); s.forEach(function (element, sameElement, set) { alert(element); //前两个都是返回A,B,C。set则返回3次[object Set] });
对于Map
var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]); m.forEach(function (value, key, map) { alert(value); //value返回x,y,z。key返回1,2,3。map返回3次[object Map] });