No1:

JavaScript严格区分大小写

No2:

JavaScript不区分整数和浮点数,统一用Number表示

NaN表示Not a Number,当无法计算结果时用NaN表示

Infinity表示无限大,当数值超过了JavaScript的Number所能表示的最大值时,就表示为Infinity

JavaScript允许对任意数据类型做比较

No3:

要特别注意相等运算符​​==​​。JavaScript在设计时,有两种比较运算符:

第一种是​​==​​比较,它会自动转换数据类型再比较,很多时候,会得到非常诡异的结果;

第二种是​​===​​比较,它不会自动转换数据类型,如果数据类型不一致,返回​​false​​,如果一致,再比较。

由于JavaScript这个设计缺陷,不要使用​​==​​比较,始终坚持使用​​===​​比较。

另一个例外是​​NaN​​这个特殊的Number与所有其他值都不相等,包括它自己

No4:

undefined,它表示“未定义”。

No5:

在同一个页面的不同的JavaScript文件中,如果都不用​​var​​申明,恰好都使用了变量​​i​​,将造成变量​​i​​互相影响,产生难以调试的错误结果。

使用​​var​​申明的变量则不是全局变量,它的范围被限制在该变量被申明的函数体内(函数的概念将稍后讲解),同名变量在不同的函数体内互不冲突

不用​​var​​申明的变量会被视为全局变量,为了避免这一缺陷,所有的JavaScript代码都应该使用strict模式。在strict模式下运行的JavaScript代码,强制通过​​var​​申明变量,未使用​​var​​申明变量就使用的,将导致运行错误。

No6:

由于多行字符串用​​\n​​写起来比较费事,所以最新的ES6标准新增了一种多行字符串的表示方法,用反引号 ` ... ` 表示。反引号在键盘的ESC下方,数字键1的左边

No7:

模板字符串



var name = '小明';
var age = 20;
var message = `你好, ${name}, 你今年${age}岁了!`;
alert(message);


No8:

字符串是不可变的,如果对字符串的某个索引赋值,不会有任何错误,但是,也没有任何效果:

 No9:

直接给​​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]



var arr = ['A', 'B', 'C'];
arr[1] = 99;
arr; // arr现在变为['A', 99, 'C']



var arr = [1, 2, 3];
arr[5] = 'x';
arr; // arr变为[1, 2, 3, undefined, undefined, 'x']


No10:

【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']



var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var aCopy = arr.slice();
aCopy; // ['A', 'B', 'C', 'D', 'E', 'F', 'G']
aCopy === arr; // false


【push】向​​Array​​的末尾添加若干元素

【pop】把​​Array​​的最后一个元素删除掉

【unshift】往​​Array​​的头部添加若干元素

【shift】把​​Array​​的第一个元素删掉

【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']


【concat】把当前的​​Array​​和另一个​​Array​​连接起来,并返回一个新的​​Array​



var arr = ['A', 'B', 'C'];
var added = arr.concat([1, 2, 3]);
added; // ['A', 'B', 'C', 1, 2, 3]
arr; // ['A', 'B', 'C']


【join】把当前​​Array​​的每个元素都用指定的字符串连接起来,然后返回连接后的字符串



ar arr = ['A', 'B', 'C', 1, 2, 3];
arr.join('-'); // 'A-B-C-1-2-3'


No11:

【对象】



var xiaoming = {
name: '小明',
birth: 1990,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};


访问



xiaoming.name; // '小明'
xiaoming.birth; // 1990




var xiaohong = {
name: '小红',
'middle-school': 'No.1 Middle School'
};


访问



xiaohong['middle-school']; // 'No.1 Middle School'
xiaohong['name']; // '小红'
xiaohong.name; // '小红'



var xiaoming = {
name: '小明'
};
xiaoming.age; // undefined
xiaoming.age = 18; // 新增一个age属性
xiaoming.age; // 18
delete xiaoming.age; // 删除age属性
xiaoming.age; // undefined
delete xiaoming['name']; // 删除name属性
xiaoming.name; // undefined
delete xiaoming.school; // 删除一个不存在的school属性也不会报错


【in】



var xiaoming = {
name: '小明',
birth: 1990,
school: 'No.1 Middle School',
height: 1.70,
weight: 65,
score: null
};
'name' in xiaoming; // true
'grade' in xiaoming; // false


要判断一个属性是否是​​xiaoming​​自身拥有的,而不是继承得到的,可以用​​hasOwnProperty()​​方法:



var xiaoming = {
name: '小明'
};
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false


No12:

JavaScript把​​null​​、​​undefined​​、​​0​​、​​NaN​​和空字符串​​''​​视为​​false​​,其他值一概视为​​true​

No13:

【循环】



var x = 0;
var i;
for (i=1; i<=10000; i++) {
x = x + i;
}
x;


注意:在括号里不要写int i=1,因为js是动态语言,不需要定义变量类型

【for...in】



var o = {
name: 'Jack',
age: 20,
city: 'Beijing'
};
for (var key in o) {
if (o.hasOwnProperty(key)) {
console.log(key); // 'name', 'age', 'city'
}
}


No14:

【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】



var s = new Set([1, 2, 3, 3, '3']);
s; // Set {1, 2, 3, "3"}



s.add(4);
s; // Set {1, 2, 3, 4}
s.add(4);
s; // 仍然是 Set {1, 2, 3, 4}


No15:

【iterable】

​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
console.log(x);
}
for (var x of s) { // 遍历Set
console.log(x);
}
for (var x of m) { // 遍历Map
console.log(x[0] + '=' + x[1]);
}


​for ... of​​循环和​​for ... in​​循环的区别:

1.​​for ... in​​循环由于历史遗留问题,它遍历的实际上是对象的属性名称

2.​​for ... of​​循环则完全修复了这些问题,它只循环集合本身的元素

No16:

【forEach()】



var s = new Set(['A', 'B', 'C']);
s.forEach(function (element, sameElement, set) {
console.log(element);
});



var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
m.forEach(function (value, key, map) {
console.log(value);
});



var a = ['A', 'B', 'C'];
a.forEach(function (element) {
console.log(element);
});