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] });