1. 程式人生 > >node.js零基礎學習筆記(二)

node.js零基礎學習筆記(二)

註釋:寫完了今天的筆記,今天主要學習了,不同js檔案,如何獲取其他js檔案的方法,一個js方法的匯出另外js檔案對方法的接收(語言敘述可能不準確,就是想說我有一個蘋果你想吃我也願意給你吃,怎麼搞?我要先把蘋果拿出來的過程,和你伸手的過程,我就是一個比喻~可能不太準確,但是我是這麼理解的),以上是第一個主要知識點,第二個知識點是ES6的一些簡單的語法,以及注意事項。其他的都是零零碎碎的雜知識點。

一、全域性成員

1、__filename:檔案的完整路徑(包含檔名稱)

      __dirname:檔案的完整路徑(不包含檔名稱)

//全域性成員
//檔案的完整路徑(包含檔名稱)
console.log(__filename);
//檔案的完整路徑(不包含檔名)
console.log(__dirname);

輸出:

c:\xampp\htdocs\web-test\js\test1.js
c:\xampp\htdocs\web-test\js

2、定時器

//每隔一秒執行一次
var timer1=setInterval(function(){
    console.log("ok");
},1000);
//只執行一次
var timer2=setTimeout(function(){
    console.log("ok");
},1000);

3、global物件:node.js下沒有window物件,但是有一個物件global,和window物件類似

global.console.log(123456);//console.log(123456);

4、程序物件

程序和執行緒:一個程序可以包含多個執行緒,執行緒是程式執行的路徑 

程序的執行緒的區別:https://www.cnblogs.com/dreamroute/p/5207813.html

*對於完全不懂的人來說,這個部落格中打比方,將程序和執行緒的區別和作用敘述了一下。

console.log(process.argv);//執行結果是一個數組,第一個引數是node.js的安裝路徑,第二個是當前檔案的路徑
console.log(process.arch);//當前作業系統的架構


//輸出結果

[ 'C:\\Program Files\\nodejs\\node.exe',
  'c:\\xampp\\htdocs\\web-test\\js\\test1.js' ]
x64

二、模組化

1、前端標準的模組化規範:ES6

      服務端程式模組化規範

      Node.js實現模組化的標準是CommonJS

2、模組:一個或多個JS檔案對外提供的功能,模組內部的成員都是獨立的

      例如一個js提供一個功能,或者兩個js檔案提供了一個功能,那麼這個功能就是一個模組

3、模組的匯入匯出(兩種方法)

      方法一:exports.XXX=xxx

      方法二:module.exports

      兩個方法不能同時使用,如果同時使用,以module.exports輸出為準,因為require找的是module.exports對應的內容

      問題一:既然require找的是module.exports對應的,為什麼exports.XXX也能將方法匯出??      

      解釋:最開始每一個模組預設的module.exports === exports === {},當exports.XXX=xxx時

                 實際上進行的操作是module.exports === exports === {XXX:xxx},給物件賦值,則require可以載入

      問題二:實施以下操作時,輸出什麼??為什麼??

      解釋:當給exports =  函式時,module.exports 依然是{},所以require獲取的是空

//test.js檔案
//第一步:module.exports === exports === {}
var sum =function(a,b){
    return a+b;
};
exports = sum;//exports = 函式,但是module.exports === {}


//app.js檔案
var result=require("./test.js");
console.log(result);

//輸出結果:
{}

匯出方法一:

//test3.js檔案
//定義了一個求和的函式
var sum1=function(a,b){
    return a+b;
};
//匯出的模組成員-方法一,exports={}是預設的一個空物件
exports.sum=sum1;//{sum:function(a,b){return a+b;}}


//test4.js檔案
// 想使用求和的函式,需要模組匯出
//require()接收到的是test3.js中的exports的這個物件
var sum1=require("./test3.js");
console.log(sum1);//輸出結果:{ sum: [Function: sum] }是一個物件
var res=sum1.sum(1,2);
console.log(res);

匯出方法二:

//test3.js檔案
var sum2=function(a,b){
    return a+b;
};
module.exports=sum2;

//test4.js檔案
var sum2=require("./test3.js");
console.log(sum2);//輸出結果:[Function: sum2] 是一個函式
var res=sum2(2,3);
console.log(res);

4、模組匯出兩個方法:

      用exports.xxx匯出兩個方法不會被覆蓋,module.exports匯出兩個方法,後面的將前面的方法覆蓋

      所以將需要暴露多個方法時,用前者,否則只需要暴露一個方法時,用後者

//test3.js檔案
var sum=function(a,b){
    return a+b;
};
var fn=function(){
    console.log("ok");
};
//可以使用
exports.sum=sum;
exports.fn=fn;

//最好使用:
module.exports={
    sum:sum,
    fn:fn
}

//test4.js檔案
var result=require("./test3.js");
console.log(result);

//輸出結果:兩個方法都有
{ sum: [Function: sum], fn: [Function: fn] }
//test3.js檔案
//分別匯出兩個方法
var sum=function(a,b){
    return a+b;
};
module.exports=sum;
module.exports=function(){
    console.log("ok");
};

//test4.js檔案
var result=require("./test3.js");
console.log(result());

//輸出結果,第一個sum的方法被覆蓋
ok
undefined//輸出undefined原因是函式沒有返回值

三、ES6簡單的基本知識擴充套件

//ES6
//1:宣告變數let和const,let定義的變數不會被生命提前
console.log(bool);//undefined
var bool=123;
console.log(bool);//報錯
let bool=123;//let定義得變數,不會宣告提前

//2:定義變數賦值,let不允許重複定義變數
var a=10;
var a=20;
console.log(a);//20
let a=10;
let a=20;
console.log(a);//報錯

//3:塊內部通過let定義的變數,通過外部不能訪問
if(true){
    var a=20;
}
console.log(a);//20
if(true){
    let a=20;
}
console.log(a);//報錯,a未定義

//4:const定義常量
const a=20;
//a=30; //報錯
console.log(a);

//5:變數的結構賦值
let[a=100,b,c] = [1,2,3];
console.log(a,b,c);//1 2 3

//6:物件的結構賦值
let {foo,bar} = {foo:'hello',bar:'node js'};
let {foo='node',bar} = {bar:'Hello'};
let {foo:abc='node',bar} = {bar:'Hello'};//abc是foo的別名,有了別名之後原名稱失效
console.log(abc);
console.log(foo);//undefined
console.log(bar);//node js

let{cos,sin,random} = Math;
console.log(typeof cos);

//7:字串的結構賦值
let [a,b,c,d,e,length] = "hello";
console.log(a,b,c,d,e);
console.log("Hello".length);

//8:字串相關的API
includes() 判斷字串是否含有指定的字串,true/false 後面的數字引數是從第幾個位置開始匹配
startsWith() 判斷字串是否是以..字串開頭
endsWith() 判斷字串是否是以..字串結束
console.log("hello es6".includes("es6",6));//true
console.log("admin/index.jsp".startsWith("admin"));//true
console.log("admin/index.jsp".endsWith(".jsp"));//true

//9:模板字串
let student = {
    sname:'張三',
    sage:'22',
    sex:'M'
};
let fun=function(str){
    return str;
};
let tag=`
    <div>
        <span>${student.sname}</span>
        <span>${student.sage}</span>
        <span>${student.sex}</span>
        <span>${2*2}</span>
        <span>${fun("hi")}</span>
    </div>
`;
console.log(tag);

四、ES6函式擴充套件

1、引數預設初始值

2、...的使用:接收多餘引數,擴充套件運算子

//1:引數預設初始值
function foo(param){
    let p = param || "noParam";//初始值:如果傳引數了p=引數值,如果沒有傳引數,p="noParam"
    console.log(p);
}
foo("param1");
foo();

function foo(param = "noParam"){//初始值:如果傳引數了param=引數值,如果沒有傳引數,param="noParam"
    console.log(param);
}
foo("param1");
foo();

function fun({uname="nName",age=0}={}){//函式設定初始值
    console.log(uname);
    console.log(age);
}
fun({uname:"李四",age:20});//李四 20
fun();//nName 0

//2:...接收多餘引數
function fun(a,b,...rest){
    console.log(a,b);
    console.log(rest);//多餘的:陣列
}
fun(10,20,30,40);//10 20 [30,40]

//3:... 擴充套件運算子
function fun(a,b,c,d,e,f){
    console.log(a+b+c+d+e+f);
}
fun(1,2,3,4,5,6);//21
let arr=[1,2,3,4,5,6];
fun(...arr);//21
fun(arr);//輸出結果:1,2,3,4,5,6undefinedundefinedundefinedundefinedundefined

let arr1=[1,2,3];
let arr2=[4,5,6];
let arr=[...arr1,...arr2];
console.log(arr);

3、箭頭函式 

function fn(){
    console.log("fn");
}
let fn=() => console.log("fn");//上面函式的簡寫
let fun =() => {//函式語句不是一條時,大括號不能省略
    console.log("fun1");
    console.log("fun2");
};
fun();

function fun(v){//帶返回值的函式
    return v;
}
let fun=(v)=>v;//上面函式的簡寫
let returnV=fun("abc");
console.log(returnV);

let arr=[1,2,3,4,5];
arr.forEach(function(item,index,array){
    console.log(item,index,array);
});
arr.forEach((item,index,array) => {//上面函式的簡寫
    console.log(item,index,array);
});

4、箭頭函式的注意事項

   1、箭頭函式的this取決於函式的定義,而不是呼叫者,和以前的函式不一樣

    2、不能使用new呼叫

    3、無法使用argument獲取實參列表

//1:箭頭函式的this取決於函式的定義,而不是呼叫者,和以前函式不一樣
function fun(){
    console.log(this);//如果不用call繫結this指的是global,如果用call,此時的this是{ num: 1 }
    setTimeout(()=>{
        console.log(this.num);
    },1000)
}
fun();//undefined,原因是this指的是global,沒有.num
fun.call({num:1});

//2:不能使用new呼叫
let foo = (res) => {
    console.log(res);
};
foo();
new foo();//報錯:TypeError: foo is not a constructor

//3:箭頭函式無法用argument獲取實參列表
let foo = (...rest) => {
    console.log(arguments);//不可使用,無法獲取實參列表
    console.log(rest);//[10,20]
};
foo(10,20);