find

MongoDB文档查询命令: find

1
db.collection.find()

上面的操作命令将会返回集合的全部内容。

阅读全文 »

插入并保存文档

插入是向MongoDB中添加数据的基本方法。

1
>db.foo.insert({'bar':'baz'})

该操作会给文档增加一个”_id”键(如果原来没有),然后将其保存到MongoDB中。

当执行插入的时候,使用的驱动程序会将数据转换成BSON的形式,然后将其送入数据库。数据库解析BSON,检验是否包含’_id’键,并且文档不超过4MB。

阅读全文 »

MongoDB的一些基本概念: 1 文档是MongoDB中数据的基本单元 2 集合可以看做是没有模式的表 3 MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限 4 MongoDB自带Javascript Shell 5 每一个文档都有一个特殊的键_id,它在文档所处集合中是唯一的。
阅读全文 »

在日常工作中,经常用到压缩/解压缩文件,在windows中大家习惯了压缩解压软件,右键即可。在linux系统下,我们也可以利用zip/unzip,tar,rar/unrar等命令,非常方便快捷的对文件进行压缩和解压缩。今天就来看一下zip命令。

阅读全文 »

ES6的解构赋值,可以让我们更加简洁、清晰的进行变量的声明与赋值,同时也减少了代码量,使得代码的可读性更强。

什么是解构赋值?

ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。

摘自阮一峰老师ECMAScript 6 入门

阅读全文 »

Function

函数实际上是对象,每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。由于函数实际对象,因为函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定。函数通常是使用函数声明语法定义的。

1
2
3
4
5
6
7
8
9
10
//函数声明语法
function sum(num1, num2){
return num1 + num2;
}
//函数表达式定义
var sum = function(num1, num2){
return num1 + num2;
}
//Function构造函数,不推荐
var sum = new Function('num1','num2','return num1 + num2');
阅读全文 »

引用类型

引用类型的值(对象)是引用类型的一个实例。对象是某个特定引用类型的实例。新对象是使用new 操作符后跟一个构造函数来创建的。

Object类型

创建Object实例的方式有两种:

  • 使用new操作符后跟Object构造函数
  • 使用对象字面量表示法
    阅读全文 »

变量、作用域及内存问题

基本类型与引用类型的值

基本类型值是简单的数据段,基本类型是按值访问的,可以操作保存在变量中的实际的值。

引用变量值可能有多个值构成的对象,引用类型的值是保存在内存中的对象,Javascript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的的引用而不是实际对象。为此,引用类型的值是按引用访问的。

阅读全文 »

let&const

let和const命令是ES6中新增的用来声明变量的命令。

let命令

let用法与 var 类似,但是 let 声明的变量只在它所在的代码块有效。ES6 let命令实际上为 Javascript 新增了块级作用域。ES5提供了全局作用域和函数作用域,没有块级作用域。

1
2
3
4
5
6
7
8
9
10
11
12
13
{
var a = 1;
let b = 2;
}
a;//1
b;//undefined,调用报错,只在定义时代码块内有效。
var name = 'es6';
while(true){
var name='es5';
console.log(name);//es5
break;
}
console.log(name);//es5

当有了块级作用域后:

1
2
3
4
5
6
7
let name = 'es6';
while(true){
let name = 'es5';
console.log(name);//es5
break;
}
console.log(name);//es6

注意:

  • let声明的变量不存在变量提升。所以使用let变量前,必须先声明,否则会报错。*

暂时性死区:ES6明确规定,如果区块中存在let和const声明的变量,从一开始就形成了封闭作用域。在变量声明之前调用这下变量会报错。

1
2
3
4
5
var tmp = 123;
if(true){
tmp = '123';//Uncaught ReferenceError: tmp is not defined(…)
let tmp;
}
  • 不允许重复声明:let 不允许在相同作用域内,重复声明同一变量。*

const

const声明一个只读的常量,一旦常量声明,就不能改变。如果尝试修改const变量值,就会报错。同时,const一旦声明变量,就必须立即进行初始化,只声明不赋值,同样会报错。
const变量不存在变量提升。与let类似,const变量只在声明所在块级作用域有效,存在暂时性死区,不能重复声明。

1
2
3
const m = 1;
m = 2;//Assignment to constant variable.
const n;//Missing initializer in const declaration

Tips:

当引用第三方库时声明的变量,用const来声明,可避免重命名导致的bug
const 命令声明的常量,也不能提升,同样存在暂时性死区,只能在声明的位置后使用。


2017-11-10 补充:

本质

const 实际上保证的,并不是变量的值不改动,而是变量指向的那个内存地址不得改动。对于简单类型的数据(数值,字符串,布尔值),值就保存在变量指向的那个内存地址,因为等同于常量。但对于复合类型的数据(主要是数组和对象),变量指向的那个内存地址,保存的就是一个指针,const只能保证这个指针是固定,至于它指向的数据结构是不是可变的,就完全不能控制了。

1
2
3
4
5
6
const foo = {}

foo.prop = 123;
foo.prop

foo = {}; //TypeError, "foo" is read-only

上述代码中,常量foo储存一个地址,这个地址指向一个对象。不可变的只是这个地址,即不能把foo指向另一个地址,但对象本上是可变的,所以依然可以为其添加新属性。

1
2
3
4
const a = [];
a.push('hello');//可执行
a.length = 0;//可执行
a = ['world'];//Uncaught TypeError: Assignment to constant variable.

上面代码中,常量a是个数组,数组本身是可写的,但是如果将另一个数组赋值给a, 就会报错。

如果想冻结对象,使用Object.freeze方法

1
2
3
4
const foo = Object.freeze({})
//常规模式下,下面一行不起作用
//严格模式下,该行会报错
foo.prop = 123;