先放上超级无敌详细的文档:重新介绍 JavaScript(JS 教程) - JavaScript | MDN
下面是一些重难点和自己的学习补充部分:
1、注:2e64 也就是代表 2 * 10^64
2、变量
在 JavaScript 中声明一个新变量的方法是使用关键字 let 、const 和 var:
1)let
语句声明一个块级作用域的本地变量,并且可选的将其初始化为一个值。
let a;
let name = 'Simon';
下面是使用 let
声明变量作用域的例子:
// myLetVariable 在这里 *不能* 被引用
for (let myLetVariable = 0; myLetVariable < 5; myLetVariable++) {
// myLetVariable 只能在这里引用
}
// myLetVariable 在这里 *不能* 被引用
2)const
允许声明一个不可变的常量。这个常量在定义域内总是可见的。
const Pi = 3.14; // 设置 Pi 的值
Pi = 1; // 将会抛出一个错误因为你改变了一个常量的值。
3)var
是最常见的声明变量的关键字。它没有其他两个关键字的种种限制。这是因为它是传统上在 JavaScript 声明变量的唯一方法。使用 var
声明的变量在它所声明的整个函数都是可见的。
var a;
var name = "simon";
一个使用 **var
**声明变量的语句块的例子:
// myVarVariable 在这里 *能* 被引用
for (var myVarVariable = 0; myVarVariable < 5; myVarVariable++) {
// myVarVariable 整个函数中都能被引用
}
// myVarVariable 在这里 *能* 被引用
如果声明了一个变量却没有对其赋值,那么这个变量的类型就是 undefined
。
3、JavaScript中的两种特殊循环:
1)for ...of
for...of
语句在可迭代对象(包括 Array,Map,Set,String,TypedArray,arguments 对象等等)上创建一个迭代循环,调用自定义迭代钩子,并为每个不同属性的值执行语句
例子1:迭代Array
let iterable = [10, 20, 30];
for (let value of iterable) {
value += 1;
console.log(value);
}
// 11
// 21
// 31
例子2:迭代Map
let iterable = new Map([["a", 1], ["b", 2], ["c", 3]]);
for (let entry of iterable) {
console.log(entry);
}
// ["a", 1]
// ["b", 2]
// ["c", 3]
for (let [key, value] of iterable) {
console.log(value);
}
// 1
// 2
// 3
2)for ... in
语法解析:
for...in
语句以任意顺序迭代一个对象的除Symbol以外的可枚举属性,包括继承的可枚举属性。
for (variable in object) statement
Copy to Clipboard
variable
在每次迭代时,variable 会被赋值为不同的属性名。
object
非 Symbol 类型的可枚举属性被迭代的对象。
例子:
var obj = {a:1, b:2, c:3};
for (var prop in obj) {
console.log("obj." + prop + " = " + obj[prop]);
}
// Output:
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"
4、||和&&运算符问题
&&
和 ||
运算符使用短路逻辑(short-circuit logic),是否会执行第二个语句(操作数)取决于第一个操作数的结果。在需要访问某个对象的属性时,使用这个特性可以事先检测该对象是否为空:
var name = o && o.getName();
或用于缓存值(当错误值无效时):
var name = cachedName || (cachedName = getName());
5、通过链式访问对象属性
“对象字面量”也可以用来在对象实例中定义一个对象:
var obj = {
name: "Carrot",
_for: "Max",//'for' 是保留字之一,使用'_for'代替
details: {
color: "orange",
size: 12
}
}
对象的属性可以通过链式(chain)表示方法进行访问:
obj.details.color; // orange
obj["details"]["size"]; // 12
6、JavaScript中的特殊的值NAN和 Infinity(正无穷)
如果给定的字符串不存在数值形式,函数会返回一个特殊的值 NaN(Not a Number 的缩写):
parseInt("hello", 10); // NaN
要小心 NaN:如果把 NaN
作为参数进行任何数学运算,结果也会是 NaN
:
NaN + 5; //NaN
可以使用内置函数 isNaN() 来判断一个变量是否为 NaN
:
isNaN(NaN); // true
JavaScript 还有两个特殊值:Infinity(正无穷)和 -Infinity
(负无穷):
1 / 0; // Infinity
-1 / 0; // -Infinity
可以使用内置函数 isFinite() 来判断一个变量是否是一个有穷数, 如果类型为Infinity
, -Infinity
或 NaN 则返回 false
:
isFinite(1/0); // false
isFinite(Infinity); // false
isFinite(-Infinity); // false
isFinite(NaN); // false
isFinite(0); // true
isFinite(2e64); // true
isFinite("0"); // true
// 如果是纯数值类型的检测,则返回 false:
Number.isFinite("0"); // false
7、JavaScript的核心:函数的应用
function avg() {
var sum = 0;
for (var i = 0, j = arguments.length; i < j; i++) {
sum += arguments[i];
}
return sum / arguments.length;
}
avg(2, 3, 4, 5); // 3.5
这个就有用多了,但是却有些冗长。为了使代码变短一些,我们可以使用剩余参数来替换 arguments 的使用。在这方法中,我们可以传递任意数量的参数到函数中同时尽量减少我们的代码。这个剩余参数操作符在函数中以:...variable 的形式被使用。在调用函数时,它将包含所有未被捕获的参数。
function avg(...args) {
var sum = 0;
for (let value of args) {
sum += value;
}
return sum / args.length;
}
avg(2, 3, 4, 5); // 3.5
8、自定义函数
function makePerson(first, last) {
return {
first: first,
last: last,
fullName: function() {
return this.first + ' ' + this.last;
},
fullNameReversed: function() {
return this.last + ', ' + this.first;
}
}
}
s = makePerson("Simon", "Willison");
s.fullName(); // "Simon Willison"
s.fullNameReversed(); // Willison, Simon
function Person(first, last) {
this.first = first;
this.last = last;
this.fullName = function() {
return this.first + ' ' + this.last;
}
this.fullNameReversed = function() {
return this.last + ', ' + this.first;
}
}
var s = new Person("Simon", "Willison");
上面的代码里有一些我们之前没有见过的东西:关键字 this。当使用在函数中时,this
指代当前的对象,也就是调用了函数的对象。如果在一个对象上使用点或者方括号来访问属性或方法,这个对象就成了 this
。