首页 » node.js » 正文

JavaScript 基础知识

本文只对我本人目前不理解的部份做笔记.

从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: 出错了……

本文共 1 个回复

发表评论