Snow的个人博客


  • 首页

  • 归档

js定义常量

发表于 2018-10-15

定义常量

js中声明变量的方法是使用关键字 var,该方式不区分数据类型,也不区分常量和变量。在es6中声明变量使用关键字 let 和 const(var 依然可以使用),其中 let 用来声明变量,const 用来声明常量。

  • const 声明的常量(如:const a = 1)的值是不能改变的。(a = 2; 报错)
  • 但是 const 声明的对象的属性是可以改变的(如:const obj = {a: 1}; obj.a = 2)。但不能直接对声明的常量赋值。(obj = {b: 2}; 报错)

使对象的属性值不能改变

使用 Object.freeze() 方法:

1
2
3
4
5
var obj = {
foo: 'bar'
}

Object.freeze(obj)

Git小白入门

发表于 2018-10-11

在GitHub上创建一个仓库

  1. 先注册一个GitHub账号,官网:https://github.com,或者在码云(https://gitee.com)、Coding(https://coding.net)上注册页可以

  2. 新建项目(创建仓库),创建完成后会得到仓库地址,我的项目名是test。如:https://github.com/你的用户名/test.git

将新建的仓库克隆到本地

  1. 打开终端并切换到指定目录(你想将项目放在哪个目录下)

    1
    $: cd Web/Git/

    通过pwd命令查看路径为:/Users/phoenix/Web/Git
    注:我的是 MAC 环境

  2. 克隆项目

    1
    $: git clone https://github.com/你的用户名/test.git

    克隆完成后在我的 Git 文件夹下多了一个 test 文件夹。

提交修改到 master 分支

初健项目时就有一个master分支(一般为主分支),且只有一个master分支
  1. 在test文件夹(项目文件夹)下新建一个 test1.txt 文件,里面填写内容‘第一次提交’

  2. 使用 git status 命令可以看到工作目录和暂存区的状态

    1
    2
    3
    4
    5
    6
    7
    No commits yet

    Untracked files:
    (use "git add <file>..." to include in what will be committed)

    test1.txt
    nothing added to commit but untracked files present (use "git add" to track)
  3. 要将新添加的文件(或新修改的内容)提交到远端仓库,就要用git add命令将要提交的内容添加到暂存区(staging area)

    1
    2
    git add test1.txt # git add 文件名 ,是将指定文件添加进暂存区
    git add . # 是将所有改动的内容(或新增文件)添加进暂存区

    将test1.txt文件添加到暂存区后在使用git status命令查看状态,得提示:

    1
    2
    3
    4
    5
    6
    No commits yet

    Changes to be committed:
    (use "git rm --cached <file>..." to unstage)

    new file: test1.txt
  4. 使用git rm命令可以将暂存区里的内容移除

    1
    2
    git rm -f <file>: 强制从staging区移除文件,同时也移除出工作目录.
    git rm --cachedf <file>: 从staging区移除文件,但留在工作目录中.

    运行命令git rm --cached test1.txt后在运行命令git status, 得提示:

    1
    2
    3
    4
    5
    6
    7
    No commits yet

    Untracked files:
    (use "git add <file>..." to include in what will be committed)

    test1.txt
    nothing added to commit but untracked files present (use "git add" to track)

    说明:git rm --cached <file>从staging区移除文件,但留在工作目录中

    如果运行git rm -f test1.txt, 那么项目文件夹下也没有 test1.txt 文件了,因为git rm -f <file> 强制从staging区移除文件,同时也移除出工作目录.

  5. 重新来一次,将文件添加到暂存区后不移除。使用git commit提交已经被add进来的改动.

    1
    2
    3
    git commit -m “the commit message"
    git commit -a 会先把所有已经track的文件的改动add进来,然后提交(有点像svn的一次提交,不用先暂存). 对于没有track的文件,还是需要git add一下.
    git commit --amend 增补提交. 会使用与当前提交节点相同的父节点进行一次新的提交,旧的提交将会被取消.

    使用git commit -m '第一次提交'提交,得提示:

    1
    2
    3
    [master (root-commit) 728a3eb] 第一次提交
    1 file changed, 1 insertion(+)
    create mode 100644 test1.txt
  6. 使用git push命令吧提交的内容推送到远端

    1
    2
    3
    4
    5
    6
    git push # push所有分支
    git push origin master # 将本地主分支推到远程主分支
    git push -u origin master # 将本地主分支推到远程(如无远程主分支则创建,用于初始化远程仓库)
    git push origin <local_branch> # 创建远程分支, origin是远程仓库名
    git push origin <local_branch>:<remote_branch> # 创建远程分支
    git push origin :<remote_branch> #先删除本地分支(git br -d <branch>),然后再push删除远程分支

    使用git push origin master命令,得提示:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     1 file changed, 1 insertion(+)
    create mode 100644 test1.txt
    PhoenixdeMacBook-Air:test phoenix$ git push origin master
    Counting objects: 3, done.
    Writing objects: 100% (3/3), 241 bytes | 120.00 KiB/s, done.
    Total 3 (delta 0), reused 0 (delta 0)
    remote:
    remote: Create a pull request for 'master' on GitHub by visiting:
    remote: https://github.com/frPhoenix/test/pull/new/master
    remote:
    To https://github.com/frPhoenix/test.git
    * [new branch] master -> master

    现在去刷新你的远端仓库就可以看到 test1.txt 文件了

创建分支切换分支

  1. 使用git branch创建分支
    1
    git branch <new_branch> # 创建新的分支

我这里创建一个test1分支,git branch test1

  1. 查看分支使用git branch
    1
    git branch

此时得到分支信息:

1
2
3
$ git branch
* master
test1

其中master是自动创建的主分支,test1是刚才新创建的。*号在哪个分支前面代表此时在那个分支上。

  1. 使用git checkout切换分支
    1
    git checkout <branch_name> # 切换分支

切换到test1分支使用git checkout test1,然后在使用git branch查看分支情况,得:

1
2
3
$ git branch
master
* test1

  1. 创建新分支并切换到新分支,使用git checkout -b <branch_name>,如创建并切换到test2分支,git checkout -b test2
    使用git branch查看分支情况,得:

    1
    2
    3
    4
    $ git branch
    master
    test1
    * test2
  2. 查看远程分支使用,git branch -r,得:

    1
    2
    $ git branch -r
    origin/master

因为没有向远端创建过别的分支,所以远端还只有master分支

操作远端分支

将分支切换到test1
  1. 修改文件test1.txt的内容,添加这是添加到test1分支的内容
  2. 使用git status查看得到:
    1
    2
    3
    4
    5
    6
    7
    8
    On branch test1
    Changes not staged for commit:
    (use "git add <file>..." to update what will be committed)
    (use "git checkout -- <file>..." to discard changes in working directory)

    modified: test1.txt

    no changes added to commit (use "git add" and/or "git commit -a")

其中,git checkout -- <file> 是丢弃本次修改的命令,如果执行该命令你会发现刚才添加的内容没有了

  1. 添加好这是添加到test1分支的内容内容后使用git add,git commit命令提交修改,然后是一个知识点:
  • 如果直接使用git push命令(不再该命令后添加任何内容),不会上传成功,会得到提示:
    1
    2
    3
    4
    fatal: The current branch test1 has no upstream branch.
    To push the current branch and set the remote as upstream, use

    git push --set-upstream origin test1

因为远端还没有 test1 分支,所以直接上传会出错。此时应该使用另外一个命令

  • 使用git push origin test1命令,会先在远端创建test1分支然后再上传,上传成功后的提示信息中有这样的信息:
    1
    2
    To https://github.com/frPhoenix/test.git
    * [new branch] test1 -> test1

第一行是上传的仓库地址,第二行是本地的哪个分支推送到了远端的哪个分支。

  1. 直接使用git push是将本地的分支上传到远程的同名分支,也就是远端先创建有一个test1分支,然后使用git push将本地test1分支推送到远端test1分支

比较两个分支git diff

  1. 查看两个分支已经提交的内容的不同
    1
    git diff <branchA> ... <branchB>

我们这里使用git diff master ... test1,得到:

1
2
3
4
5
6
7
8
9
--- a/test1.txt
+++ b/test1.txt
@@@@@ -1,5 -1,5 -1,5 -1,5 +1,3 @@@@@
第一次提交

----这是添加到test1分支的内容
----
----使用push,test1分支的内容
++++使用push,master分支的内容

  1. 查看工作区的内容与分支有什么不同,使用git diff HEAD

查看提交、撤销提交

  1. 查看提交情况使用git log命令
    1
    2
    3
    4
    git log <file> # 查看该文件每次提交记录
    git log -p <file> # 查看每次详细修改内容的diff
    git log -p -2 # 查看最近两次详细修改内容的diff
    git log --oneline --graph:可以图形化地表示出分支合并历史.

使用git log --oneline --graph能够得到

1
2
3
4
* 2a21b2b (HEAD -> test1) 使用push推送
* 243db38 推动到master、test1分支
* 8141a38 推到test1分支
* 728a3eb (test2) 第一次提交

  1. 使用git revert撤回提交
    1
    2
    3
    git revert HEAD: 撤销最近的一个提交.
    git revert会创建一个反向的新提交,可以通过参数-n来告诉Git先不要提交.
    git revert <$id> # 恢复某次提交的状态,恢复动作本身也创建次提交对象

其中<$id>指的是提交的版本编号,如上面得到的2a21b2b。

操作stash 缓存

1
2
3
4
5
6
7
8
9
git stash将会把当前目录和index中的所有改动(但不包括未track的文件)压入一个栈,然后留给你一个clean的工作状态,即处于上一次最新提交处.
git stash list会显示这个栈的list.
git stash apply:取出stash中的上一个项目(stash@{0}),并且应用于当前的工作目录.
也可以指定别的项目,比如git stash apply stash@{1}.
如果你在应用stash中项目的同时想要删除它,可以用git stash pop

删除stash中的项目:
git stash drop: 删除上一个,也可指定参数删除指定的一个项目.
git stash clear: 删除所有项目.

合并分支内容

将master分支上的内容合并到test1分支上

  1. 使用 git fetch origin <branch>
    1
    git fetch origin master:tmp

//在本地新建一个temp分支,并将远程origin仓库的master分支代码下载到本地temp分支
再使用merge,git merge tmp合并分支,这时可能会有冲突,(删除tmp分支:git branch -d temp)

撤销合并:

1
git reset --hard

  1. 使用 git pull origin <branch>
    从远端拉取内容并合并,合并完成之后需要一次新的提交。

  2. 使用 git rebase

    1
    2
    git rebase <branch>
    git rebase --continue

查看分支之间的关系图

1
git log --graph --decorate --oneline --simplify-by-decoration --all

说明:

–decorate 标记会让git log显示每个commit的引用(如:分支、tag等)

–oneline 一行显示
–simplify-by-decoration 只显示被branch或tag引用的commit

–all 表示显示所有的branch,这里也可以选择,比如我指向显示分支ABC的关系,则将–all替换为branchA branchB branchC

使用arguments对象写阶层函数

发表于 2018-10-08

在函数内部有两个特殊的对象:arguments和this。其中arguments对象包含着传入函数中的所有参数,还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数。

常规方法

1
2
3
4
5
6
7
function factorial (num) {
if (num <= 1) {
return 1;
} else {
return num * factorial(num - 1);
}
}

使用arguments对象的callee属性

1
2
3
4
5
6
7
function factorial (num) {
if (num <= 1) {
return 1;
} else {
return num * arguments.callee(num - 1);
}
}

详见:js高级程序设计(第三版)113页

laravel处理404问题

发表于 2018-10-05

laravel中处理404问题的方法

1. 通过Nginx等服务配置404页面

步骤:
略

2. 通过捕获NotFoundHttpException异常

  • 第一种方法在发生404错误时展示一个404页面,针对接口开发的服务不太适用。
    在app/Exceptions/Handler.php文件中捕获
    添加:
    1
    2
    3
    4
    5
    6
    7
    8
    public function render($request, Exception $exception)
    {
    // 处理404问题
    if ($exception instanceof \Symfony\Component\HttpKernel\Exception\NotFoundHttpException)
    return json_encode(['code' => 501404, 'msg' => '404,没有找到相关路由']);

    return parent::render($request, $exception);
    }

laravel里try catch无效

发表于 2018-10-04

引自:https://blog.csdn.net/u013091013/article/details/79579357

问题

在使用laravel框架的时候使用try catch,发现无效,如下:

1
2
3
4
5
try {
echo $a;
} catch (Exception $e) {
echo '出错了';
}

错误信息如下:

1
Undefined variable: a

原因

后来发现laravel5使用命名空间,控制器被强制放到了子命名空间下

解决方法

在文件开头使用 use \Exception,或者

1
2
3
4
5
try {
echo $a;
} catch (\Exception $e) {
echo '出错了';
}

instantiable.

发表于 2018-10-04

我的问题

1
Target [App\Http\Controllers\Article\ArticleController] is not instantiable.

报错对应的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

namespace App\Http\Controllers\Article;

use App\Http\Controllers\Controller;
use App\Repositories\Article\ArticleRepository;
use Illuminate\Http\Request;

class ArticleController extends Controller
{
private $articleRepository = '';
private function __construct(ArticleRepository $articleRepository)
{
$this->articleRepository = $articleRepository;
}

public function create (Request $request) {
return $request->toArray();
....
....

解决方法

  1. 将__construct() 方法前的 private 改为 public。
  2. 待补充

Lumen/laravel添加全局自定义函数

发表于 2018-10-04

创建自定义文件

  • 在任意文件夹下新建一个 functions.php 文件
  • 如:”app/Common/Functions/functions.php”

配置自动加载

  • 在 composer.json 文件中添加配置
    1
    2
    3
    4
    5
    6
    7
    {
    "autoload": {
    "files": [
    "app/Common/Functions/functions.php"
    ]
    }
    }

重新加载配置

  • 运行命令:$ composer dump-auto

Lumen/laravel使用UUID

发表于 2018-10-04

安装Uuid

1
composer require webpatser/laravel-uuid

配置全局函数使用 UUID

  • 配置全局函数得方法参照另外一篇 《添加全局自定义函数》
  • 在全局函数文件中添加如下代码
1
2
3
4
5
6
7
8
use Webpatser\Uuid\Uuid;
/**
* 生成 uuid "de99ff30-6d4c-11e8-b243-27600b662ccc"
* @return string
*/
function uuid() {
return Uuid::generate()->string;
}

编程艺术中的优质代码片段

发表于 2018-10-02

获取 XMLHttpRequest 对象 (兼容处理)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function getHTTPObject () {
if (typeof XMLHttpRequest == 'undefined')
XMLHttpRequest = function () {
try {
return new ActiveXObject('Msxml2.XMLHTTP.6.0');
} catch (e) {}
try {
return new ActiveXObject('Msxml2.XMLHTTP.3.0');
} catch (e) {}
try {
return new ActiveXObject('Msxml2.XMLHTTP');
} catch (e) {}
return false;
}
return new XMLHttpRequest();
}
// 获取
let request = getHTTPRequest();

获取下一个元素节点

1
2
3
4
5
6
7
8
9
function getNextElement (node) {
if (node.nodeType == 1) {
return node;
}
if (node.nextSibling) {
return getNextElement(node.nextSibling);
}
return null;
}

追加 className

1
2
3
4
5
6
7
8
9
10
function addClass (element, value) {
if (!element.className){
element.className = value;
} else {
var newClassName = element.className;
newClassName += ' ';
newClassName += value;
element.className = newClassName;
}
}

DOM Core 与 HTML-DOM 的区别

发表于 2018-10-01

DOM Core 与 HTML-DOM 都是为操作元素或元素属性。只是 DOM Core 是通过相关方法来实现,HTML-DOM 是通过操作对象属性实现。
例如:

  1. HTML-DOM提供了一个 forms 对象,这个对象可以把下面的语句:

    ```
    1
    2
    简化为
    ``` document.forms
  2. HTML-DOM为图片提供 src 属性可以把下面的语句:

    ```
    1
    2
    简化为
    ``` element.src
  3. HTML-DOM为链接提供 href 属性可以把下面的语句:

    ```
    1
    2
    简化为
    ``` element.href
1234
Snow Liu

Snow Liu

36 日志
9 标签
© 2018 Snow Liu
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4