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>>):
项目时间有限,先学一些急需用到的,其他部分等将来需要时再去补