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);