1.alert("aaa"),alert是彈出警告框
2.通常把js代碼放到html的<head>中,或者把JavaScript代碼放到一個單獨的.js
文件,然後在HTML中通過<script src="..."></script>
引入這個文件
3.使用var來進行聲明變量,例如
var x = 1;
4.JavaScript不區分整數和浮點數,統一用Number表示
5.字符串是不可變的,如果對字符串的某個索引賦值,不會有任何錯誤,但是,也沒有任何效果
6.javascrpit是動態類型
7.Map
是一組鍵值對的結構,具有極快的查找速度。
舉個例子,假設要根據同學的名字查找對應的成績,如果用Array
實現,需要兩個Array
:
var names = ['Michael', 'Bob', 'Tracy'];
var scores = [95, 75, 85];
給定一個名字,要查找對應的成績,就先要在names中找到對應的位置,再從scores取出對應的成績,Array越長,耗時越長。
如果用Map實現,只需要一個“名字”-“成績”的對照表,直接根據名字查找成績,無論這個表有多大,查找速度都不會變慢。用JavaScript寫一個Map如下:
var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
m.get('Michael'); // 95
8.JavaScript的函數定義有個特點,它會先掃描整個函數體的語句,把所有申明的變量“提升”到函數頂部。但是 不會提升變量y
的賦值。
9.JavaScript默認有一個全局對象window
,全局作用域的變量實際上被綁定到window
的一個屬性。
10.名字空間
全局變量會綁定到window
上,不同的JavaScript文件如果使用了相同的全局變量,或者定義了相同名字的頂層函數,都會造成命名衝突,並且很難被發現。
減少衝突的一個方法是把自己的所有變量和函數全部綁定到一個全局變量中。例如:
// 唯一的全局變量MYAPP:
var MYAPP = {};
// 其他變量:
MYAPP.name = 'myapp';
MYAPP.version = 1.0;
// 其他函數:
MYAPP.foo = function () {
return 'foo';
};
把自己的代碼全部放入唯一的名字空間MYAPP
中,會大大減少全局變量衝突的可能。
11.JavaScript的變量作用域實際上是函數內部,我們在for
循環等語句塊中是無法定義具有局部作用域的變量,爲了解決塊級作用域,ES6引入了新的關鍵字let
,用let
替代var
可以申明一個塊級作用域的變量,例如:
'use strict';
function foo() {
var sum = 0;
for (let i=0; i<100; i++) {
sum += i;
}
// SyntaxError:
i += 1;
}
12.const
來定義常量,const
與let
都具有塊級作用域
13. this的問題
JavaScript的函數內部如果調用了this
,那麼這個this
到底指向誰?
答案是,視情況而定!
如果以對象的方法形式調用,比如xiaoming.age()
,該函數的this
指向被調用的對象,也就是xiaoming
,這是符合我們預期的。
如果單獨調用函數,比如getAge()
,此時,該函數的this
指向全局對象,也就是window
。
14.filter也是一個常用的操作,它用於把Array
的某些元素過濾掉,然後返回剩下的元素。
例如,在一個Array
中,刪掉偶數,只保留奇數,可以這麼寫:
var arr = [1, 2, 4, 5, 6, 9, 10, 15];
var r = arr.filter(function (x) {
return x % 2 !== 0;
});
r; // [1, 5, 9, 15]
15. Array
的sort()
方法默認把所有元素先轉換爲String再排序,結果'10'
排在了'2'
的前面,因爲字符'1'
比字符'2'
的ASCII碼小。如果不知道sort()
方法的默認排序規則,直接對數字排序,絕對栽進坑裏!
16.JavaScript的Date對象月份值從0開始,牢記0=1月,1=2月,2=3月,……,11=12月。
17.正則表達式
在正則表達式中,如果直接給出字符,就是精確匹配。用\d
可以匹配一個數字,\w
可以匹配一個字母或數字,.
可以匹配任意字符,\s
可以匹配一個空格
18.js創建對象例子:
function Student(props) {
this.name = props.name || '匿名'; // 默認值爲'匿名'
this.grade = props.grade || 1; // 默認值爲1
}
Student.prototype.hello = function () {
alert('Hello, ' + this.name + '!');
};
function createStudent(props) {
return new Student(props || {})
}
19.
JavaScript的原型繼承實現方式就是:
-
定義新的構造函數,並在內部用
call()
調用希望“繼承”的構造函數,並綁定this
; -
藉助中間函數
F
實現原型鏈繼承,最好通過封裝的inherits
函數完成; -
繼續在新的構造函數的原型上定義新方法;
20.npm是Node.js的包管理工具(package manager)。
21.使用module.exports = xxx和require可以進行模塊間的相互調用
22.一個Readable
流和一個Writable
流串起來後,所有的數據自動從Readable
流進入Writable
流,這種操作叫pipe
。
23.nodejs創建的第一個http服務器,代碼如下:
var http=require('http');
var server=http.createServer(function(request,response){
console.log(request.method+" : "+request.url);
response.writeHead(200,{'Content-Type':'text/html'});
response.end('<h1>Hello xiaokeai!</h1>');
});
server.listen(8080);
console.log('Server is running at http://127.0.0.1:8080/');
輸出結果如下:
PS D:\360MoveData\Users\Administrator\Desktop\learnnodejs> node hello
Server is running at http://127.0.0.1:8080/
GET : /
GET : /
GET : /favicon.ico
分析:
代碼中的第一個輸出語句:
console.log(request.method+" : "+request.url);
request.method輸出的是request的訪問方法,是GET或者是POST
request.url顯示的是訪問路徑
通過輸出語句
GET : /
可以看出,訪問方式是GET,而要訪問的路徑'/'正是代表主頁
還有一句輸出
GET : /favicon.ico
每次訪問網頁之時瀏覽器都會發出兩次請求,一次正常請求,一次圖標請求,favicon.ico對圖標請求做專門的處理
之後的
response.writeHead(200,{'Content-Type':'text/html'});
Content-Type
指示響應的內容,這裏是text/html
表示HTML網頁。請注意,瀏覽器就是依靠Content-Type
來判斷響應的內容是網頁還是圖片,是視頻還是音樂。
再之後:
response.end('<h1>Hello xiaokeai!</h1>');
結束響應,告訴客戶端所有消息已經發送。當所有要返回的內容發送完畢時,該函數必須被調用一次。
如果不調用該函數,客戶端將永遠處於等待狀態。
server.listen(8080);
表明服務器一直在監聽8080端口,這時候通過在瀏覽器地址欄輸入localhost:8080即可訪問到剛剛創建的服務器,截圖如下:
至此,完成了一個最簡單的http服務器的創建
http客戶端:
24.nodejs的事件回調
看到兩篇博客,講的都很好,可以相互配合看一下,我就不再多說
http://www.ruanyifeng.com/blog/2014/10/event-loop.html
https://www.cnblogs.com/moxiaowohuwei/p/8438236.html
25.npm start
npm start
啓動。npm start
命令會讓npm執行定義在package.json
文件中的start對應命令:
"scripts": {
"start": "node app.js"
}
26. json
JSON 是用於存儲和傳輸數據的格式。
JSON 通常用於服務端向網頁傳遞數據 。
27.nodejs的tcp協議
創建一個簡單的tcp服務器
var net = require('net');
var server = net.createServer(function (socket) {
// ႎ的接
socket.on('data', function (data) {
socket.write("你好"
});
socket.on('end', function () {
console.log('連接斷開');
});
socket.write("歡迎光臨nodejs");
});
server.listen(8124, function () {
console.log('server bound');
});
客戶端:
var net = require('net');
var client = net.connect({port: 8124}, function () { //'connect' listener
console.log('client connected');
client.write('world!\r\n');
});
client.on('data', function (data) {
console.log(data.toString());
client.end();
});
client.on('end', function () {
console.log('client disconnected');
});
TCP服務事件(圖片來源於<<深入淺出Node.js>>):
項目時間有限,先學一些急需用到的,其他部分等將來需要時再去補