JS笔记-廖雪峰

  |  
 阅读次数

ES6 Map和Set(廖雪峰)

(https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0014345007434430758e3ac6e1b44b1865178e7aff9082e000)

JavaScript的 默认对象 表示方式{}可以视为其他语言中的MapDictionary的数据结构,即一组键值对
但是JavaScript的对象有个小问题,就是必须是字符串。但实际上Number或者其他数据类型作为键也是非常合理的。

为了解决这个问题,最新的ES6规范引入了 新的 数据类型Map
测试浏览器是否支持ES6规范 执行以下代码,如浏览器报ReferenceError错误,那么你需要换一个支持ES6的浏览器:

1
2
3
4
'use strict';
var m = new Map();
var s = new Set();
console.log('你的浏览器支持Map和Set!');

Map(增set 删delete 改set 查get has)

Map是一组键值对的结构,具有极快的查找速度。

var m = new Map([[‘Michael’, 95], [‘Bob’, 75], [‘Tracy’, 85]]);

m.get(‘Michael’); // 95

初始化Map需要一个二维数组,或者直接初始化一个空Map。Map具有以下方法:

1
2
3
4
5
6
7
var m = new Map(); // 空Map
m.set('Adam', 67); // 添加新的key-value
m.set('Bob', 59);
m.has('Adam'); // 是否存在key 'Adam': true
m.get('Adam'); // 67
m.delete('Adam'); // 删除key 'Adam'
m.get('Adam'); // undefined

一个key只能对应一个value,所以,多次对一个key放入value,后面的值会把前面的值冲掉:

1
2
3
4
var m = new Map();
m.set('Adam', 67);
m.set('Adam', 88);
m.get('Adam'); // 88

Set(没有重复的key)

SetMap类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在Set中,没有重复的key
创建一个Set,需要提供一个Array作为输入,或者直接创建一个空Set

1
2
var s1 = new Set(); // 空Set
var s2 = new Set([1, 2, 3]); // 含1, 2, 3

重复元素在Set中自动被过滤:

var s = new Set([1, 2, 3, 3, ‘3’]);
s; // Set {1, 2, 3, “3”}

通过add(key)方法可以添加元素到Set中,可以重复添加,但不会有效果:
通过delete(key)方法可以删除元素:

原生Ajax请求

  |  
 阅读次数

原生Ajax请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function ajax(options) {
options = options || {};
options.type = (options.type || "GET").toUpperCase();
options.dataType = options.dataType || "json";
var params = formatParams(options.data);

//创建 - 非IE6 - 第一步
if (window.XMLHttpRequest) {
var xhr = new XMLHttpRequest();
} else { //IE6及其以下版本浏览器
var xhr = new ActiveXObject('Microsoft.XMLHTTP');
}

//接收 - 第三步
xhr.onreadystatechange = function () {
if (xhr.readyState == 4) {
var status = xhr.status;
if (status >= 200 && status < 300) {
options.success && options.success(xhr.responseText, xhr.responseXML);
} else {
options.fail && options.fail(status);
}
}
}

//连接 和 发送 - 第二步
if (options.type == "GET") {
xhr.open("GET", options.url + "?" + params, true);
xhr.send(null);
} else if (options.type == "POST") {
xhr.open("POST", options.url, true);
//设置表单提交时的内容类型
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.send(params);
}
}

//格式化参数
function formatParams(data) {
var arr = [];
for (var name in data) {
arr.push(encodeURIComponent(name) + "=" + encodeURIComponent(data[name]));
}
arr.push(("v=" + Math.random()).replace(".", ""));
// console.log(arr.join("&"));
return arr.join("&");
}

MongoDB--备份与恢复

  |  
 阅读次数

备份(mongodump)与恢复(mongorestore)

数据备份(mongodump)

Mongodb中 使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中

mongodump命令可以通过参数指定导出的数据量级转存的服务器。

语法

1
2
3
4
> mongodump -h dbhost -d dbname -o dbDirectory
-h:MongDB所在服务器地址,例如:`127.0.0.1`,当然也可以指定端口号:`127.0.0.1:27017`
-d:需要备份的数据库实例,例如:test
-o:备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。

MongoDB在Node.js中的使用

  |  
 阅读次数

Node.js 中使用MongoDB(几乎是标配)

  • mac中安装MongoDB
    brew install mongodb
  • node.js 中使用mongoose第三方库来管理MongoDB
    npm install mongoose –save
  • 为什么使用mongoose:官方的驱动都是 回调方式的API, 而mongoose封装成promise, 可使用await/async
  • 配置连接DB信息,并导出连接的对象
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    import mongoose from 'mongoose' // 引入
    const options = {
    user: 'admin',
    pwd: '123456',
    host: 'localhost',
    port: '27017',
    database: 'hollywood',
    authSource: 'admin',
    }

    const uri = `mongodb://${options.user}:${options.pwd}@${options.host}:${options.port}/${options.database}?authSource=${options.authSource}`

    mongoose.Promise = global.Promise //需要
    mongoose.connect(uri)

    export default mongoose

定义一个模型的概要,类似于关系型数据库中的定义表结构

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import db from '../db.js'
import logger from '../logger'
const Schema = db.Schema

//account对应的字段
const accountSchema = new Schema(
{
name: { type: String, maxlength: 15 },
password: { type: String, maxlength: 20 },
gender: { type: String, enum: ['male', 'female'] },
email: { type: String, maxlength: 25 },
avatar: { type: String },
age: { type: Number },
create_date: { type: Date },
update_date: { type: Date },
},
{
versionKey: false,
},
)

//当account执行save()前,执行该代码片段,有点类似于中间件(这个方法内容仅仅是介绍pre()的使用方法)
accountSchema.pre('save', function(next) {
const currentDate = new Date()
if (!this.create_date) {
this.create_date = currentDate
} else {
this.update_date = currentDate
}
next()
})

//当account执行save()后
> ...

//定义模型的方法
accountSchema.methods.sayHi = () => (console.log('sayHi()!!!!!'))
const Account = db.model('Account', accountSchema)
export default Account

保存到数据库, 并返回一个保存到数据库的对象

1
2
3
4
5
6
7
8
9
import Account from './model'

export default class AccountService {
static async save(json) {
const accountModel = new Account(json)
const account = await accountModel.save()
return account
}
}

Mongoose

Mongoose是MongoDB的一个对象模型工具,是基于node-mongodb-native开发的MongoDB nodejs驱动,可以在异步的环境下执行。

同时它也是针对MongoDB操作的一个对象模型库,封装了MongoDB对文档的的一些增删改查等常用方法,让NodeJS操作Mongodb数据库变得更加灵活简单。

我们通过Mongoose去创建一个“集合”并对其进行增删改查,就要用到它的三个属性:Schema(数据属性模型)、Model、Entity

定义一个Schema

1
2
3
4
5
6
7
8
var mongoose = require("mongoose");

var TestSchema = new mongoose.Schema({
name : { type:String },//属性name,类型为String
age : { type:Number, default:0 },//属性age,类型为Number,默认为0
time : { type:Date, default:Date.now },
email: { type:String,default:''}
});

阅读原文


Git与SVN区别

  |  
 阅读次数

Git不仅是版本控制,也是内容/工作管理系统

  1. Git分布式,SVN不是。与非分布式版本控制系统最核心区别

  2. Git按元数据方式储存,SVN按文件

  3. 分支不同

  4. Git没有全局版本号;SVN有。目前为止相比缺少的一个最大特征

  5. Git内容完整性优于SVN,Git内容存储使用SHA-l哈希算法