本文只对我本人目前不理解的部份做笔记.
从 c /c++ 转变过来不太容易理解的概念
- 变量即对象. 所以可以这样:
var person={firstname:"John", lastname:"Doe", id:5566};
- 因为变量即对象. 所以也可以将某函数赋值给某变量 `var x = function (a, b) {return a * b};` and then `var z = x(4, 3);`
- 函数中可以再包含函数
- 可以有匿名函数(没有函数名的函数)
- 没有函数重载, 只能覆盖, 所以给不同的参数调用不同的对像不现实
- 没有所谓的入口函数
- 每遇到一个换行表示代码结束, 不一定以 `;` 结束
- 由于弱类型 `if(10==’10’)` 是成立的, 如果要判断类型, 则 `if(10===’10’)`, 另外 switch 都是在以 `===` 行为判断
JavaScript 对象
对象的定义
对象由花括号分隔。在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义。属性由逗号分隔:
var person={firstname:"John", lastname:"Doe", id:5566};
上面例子中的对象 (person) 有三个属性:firstname、lastname 以及 id。
空格和折行无关紧要。声明可横跨多行:
var person={
firstname : "John",
lastname : "Doe",
id : 5566,
fullName : function()
{return this.firstName + " " + this.lastName;}
};
对象属性有两种寻址方式:
name=person.lastname;
name=person["lastname"];
name=person.fullName(); // 括号不能少, 否则会是返回字符串 function () {return this.firstName + " " + this.lastName;}, 这点与 c ++ 有些像
函数的定义
最常规的方法 function double(x){return 2 * x;}
这种方法与 c ++ 很像, 只是在函数前需要加 function
来进行构造, 然后也不需要返回参数类型(javascript 是弱类型)
## 自调用函数
函数表达式可以 ” 自调用 ”。如果表达式后面紧跟 (),则会自动调用。
不能自调用声明的函数。通过添加括号,来说明它是一个函数表达式:
(function () {var x = "Hello!!"; // 我将调用自己})();
alert((function(x){return x*x;})(10)); // 提示 100
let 声明的变量
相当于 c 语言的 static 吧, 暂时理解为区域变量
箭头函数(Arrow Function) =>
相当于匿名函数x => x * x
等效于 function (x) {return x * x;}
箭头函数相当于匿名函数,并且简化了函数定义。箭头函数有两种格式,一种像上面的,只包含一个表达式,连 {...}
和return
都省略掉了。还有一种可以包含多条语句,这时候就不能省略 {...}
和return
:
x => {if (x > 0) {return x * x;}
else {return - x * x;}
}
如果参数不是一个,就需要用括号 ()
括起来:
// 两个参数:
(x, y) => x * x + y * y
// 无参数:
() => 3.14
// 可变参数:
(x, y, ...rest) => {
var i, sum = x + y;
for (i=0; i<rest.length; i++) {sum += rest[i];
}
return sum;
}
如果要返回一个对象,就要注意,如果是单表达式,这么写的话会报错:x => {foo: x}
因为和函数体的 {…} 有语法冲突,所以要改为:x => ({foo: x})
另外, 箭头函数完全修复了 this
的指向,this
总是指向词法作用域,也就是外层调用者 obj, 详细参见 google, 这里不写了, 暂时我也用不上.
错误处理 try/catch/finally 以及 throw
** node.js 中很多操作是异步的,try/catch 并不能捕获到错误, 需要注意 **
Error 对象
JavaScript 解析或执行时,一旦发生错误,引擎就会抛出一个错误对象。JavaScript 原生提供一个 Error 构造函数,所有抛出的错误都是这个构造函数的实例。
var err = new Error('出错了');
err.message // "出错了"
上面代码中,我们调用 Error 构造函数,生成一个 err 实例。
Error 构造函数接受一个参数,表示错误提示,可以从实例的 message 属性读到这个参数。
常用方法
try {throw new Error('出错了!');
} catch (e) {console.log(e.name + ":" + e.message);
console.log(e.stack);
}
// Error: 出错了!
// at <anonymous>:3:9
// ...
上面代码中,try 代码块一抛出错误(上例用的是 throw 语句),JavaScript 引擎就立即把代码的执行,转到 catch 代码块。可以看作,错误可以被 catch 代码块捕获。catch 接受一个参数,表示 try 代码块抛出的值。
try…catch 结构允许在最后添加一个 finally 代码块,表示不管是否出现错误,都必需在最后运行的语句。
function cleansUp() {
try {throw new Error('出错了……');
console.log('此行不会执行');
} finally {console.log('完成清理工作');
}
}
cleansUp()
// 完成清理工作
// Error: 出错了……