add: Object.freeze()

This commit is contained in:
qianguyihao 2020-05-30 23:24:59 +08:00
parent cc41ddb71a
commit ada7d784c0
7 changed files with 204 additions and 104 deletions

9
.prettierrc Normal file
View File

@ -0,0 +1,9 @@
{
"printWidth": 300,
"tabWidth": 4,
"semi": true,
"singleQuote": true,
"trailingComma": "es5",
"tslintIntegration": true,
"insertSpaceBeforeFunctionParenthesis": false
}

View File

@ -4,17 +4,17 @@
> 本文的最新内容也会在[GitHub](https://github.com/qianguyihao/Web/blob/master/00-%E5%89%8D%E7%AB%AF%E5%B7%A5%E5%85%B7/01-VS%20Code%E7%9A%84%E4%BD%BF%E7%94%A8.md)上同步更新,欢迎 star。
VS Code 软件本身是为前端同学量身定制的但由于它实在是太好用了于是各种开发方向的码农也正在用 VS Code 作为他们的代码编辑器甚至是一些写作的同学也把 VS Code 作为 markdown 写作工具
写下这篇文章是顺势而为
如果你是做前端开发JavaScript 编程语言为主则完全可以将 VS Code 作为**主力开发工具**这款软件是为前端同学量身定制的但由于它实在是太好用了越来越多的人正在使用它
如果你是做其他语言方向的开发并且不需要太复杂的集成开发环境那么你可以把 VS Code 作为**代码编辑器**来使用纵享丝滑
甚至是一些写作的同学也把 VS Code 作为 markdown **写作工具**毫无违和感
甚至是一些写作的同学也可以把 VS Code 作为 markdown **写作工具**毫无违和感
退而求其次即便你不属于以上范畴你还可以把 VS Code 当作最简单的**文本编辑器**来使用完爆 Windows 系统自带的记事本
写下这篇文章是顺势而为
退而求其次即便你不在以上范畴你还可以把 VS Code 当作**文本编辑器**来使用完爆 Windows 系统自带的记事本
## VS Code 的介绍
@ -100,7 +100,7 @@ VS Code 用得熟不熟,首先就看你是否会用快捷键。以下列出的
| Cmd + ` | | 在同一个软件的多个窗口之间切换 | |
| | | | |
| **Cmd + Option + 左右方向键** | Ctrl + Pagedown/Pageup | 在已经打开的文件之间进行**切换** | 非常实用 |
| Ctrl + Tab | Ctrl + Tab | 在已经打开的文件之间进行跳转 | 不如上面的快捷键实用 |
| Ctrl + Tab | Ctrl + Tab | 在已经打开的文件之间进行跳转 | 不如上面的快捷键 |
| | | | |
| Cmd + Shift + O | Ctrl + shift + O | 在当前文件的各种**方法之间**进行跳转 | |
| Ctrl + G | Ctrl + G | 跳转到指定行 | |
@ -141,7 +141,6 @@ VS Code 用得熟不熟,首先就看你是否会用快捷键。以下列出的
| **Option + Shift + ** | **Alt + Shift + ** | 将代码向下复制 | 写重复代码的利器 |
### 多光标编辑
| Mac 快捷键 | Win 快捷键 | 作用 | 备注 |
@ -152,7 +151,6 @@ VS Code 用得熟不熟,首先就看你是否会用快捷键。以下列出的
| Cmd + Shift + L | Ctrl + Shift + L | 在选中文本的所有相同内容处出现光标 | |
其他的多光标编辑操作很重要
- 选中某个文本然后反复按住快捷键 **Cmd + D** windows 用户是按住**Ctrl + D** 即可将全文中相同的词逐一加入选择
@ -160,7 +158,6 @@ VS Code 用得熟不熟,首先就看你是否会用快捷键。以下列出的
- 选中一堆文本后按住**Option + Shift + i**windows 用户是按住**Alt + Shift + I**既可在**每一行的末尾**都创建一个光标
### 删除操作
| Mac 快捷键 | Win 快捷键 | 作用 | 备注 |
@ -170,11 +167,11 @@ VS Code 用得熟不熟,首先就看你是否会用快捷键。以下列出的
| **option + Backspace** | **Ctrl + Backspace** | 删除光标之前的一个单词 | 英文有效很常用 |
| option + delete | Ctrl + delete | 删除光标之后的一个单词 | |
| | | | |
| **Cmd + delete** | | 删除光标之前的整行内容 | 很常用 |
| **Cmd + Backspace** | | 删除光标之前的整行内容 | 很常用 |
| Cmd + delete | | 删除光标之后的整行内容 | |
| | | | |
备注上面所讲到的移动光标编辑操作删除操作的快捷键在其他编辑器里基本适用
备注上面所讲到的移动光标编辑操作删除操作的快捷键在其他编辑器里大部分都适用
### 编程语言相关

View File

@ -133,14 +133,12 @@ git自动合并成功。不管是git自动合并成功还是在人工解决
git config user.name ""
```
然后当我们再输入`git pull`等命令行时就会被要求重新输入*新的*账号密码此时密码就可以修改成功了最后我们还要输入如下命令还原当前仓库的用户名
```
git config user.name "smyhvae"
```
### 修改已经push的某次commit的作者信息
已经push的记录如果要修改作者信息的话只能 通过--force命令我反正是查了很久但最终还是不敢用公司的仓库尝试
@ -155,7 +153,6 @@ git config user.name "smyhvae"
- [修改 git repo 历史提交的 author](http://baurine.github.io/2015/08/22/git_update_author.html)
### `branch1`的某个`commit1`合并到`branch2`当中
切换到branch2中然后执行如下命令
@ -164,7 +161,6 @@ git config user.name "smyhvae"
git cherry-pick commit1
```
### 20190118-修改GitHub已提交的用户名和邮箱
参考链接亲测有效
@ -176,6 +172,41 @@ git cherry-pick commit1
在执行`./email.sh`如果出现`permission denied`的错误可以先执行`chmod 777 email.sh`修改文件的权限
### 20200520-将Git 项目迁移到另一个仓库
我们假设旧仓库的项目名称叫`old-repository`新仓库的项目名称叫`new-repository`操作如下
1创建旧仓库的裸克隆
```bash
git clone --bare https://github.com/exampleuser/old-repository.git
```
执行上述命令后会在本地生成一个名叫 `old-repository.git`的文件夹
2迁移到新仓库
```bash
cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git
```
这样的话项目就已经迁移到新仓库了
注意我们**不需要**手动新建一个空的新仓库当我们执行上述命令之后新仓库就已经自动创建好了
参考链接
- [复制仓库](https://help.github.com/cn/github/creating-cloning-and-archiving-repositories/duplicating-a-repository)
- [Git 本地仓库和裸仓库](https://moelove.info/2016/12/04/Git-%E6%9C%AC%E5%9C%B0%E4%BB%93%E5%BA%93%E5%92%8C%E8%A3%B8%E4%BB%93%E5%BA%93/)
## git客户端推荐
市面上的Git客户端我基本都用过了我最推荐的一款Git客户端是[Tower](https://www.git-tower.com) 或者 [Fork](https://git-fork.com)。
@ -189,7 +220,7 @@ git cherry-pick commit1
**SmartGit**
商业用途收费 个人用户免费
s
![](http://img.smyhvae.com/20180623_1305.png)

View File

@ -55,15 +55,29 @@ if (true) {
## 变量的声明和赋值
### 变量的声明变量的定义
### 变量的声明/变量的定义
在ES6语法之前统一使用`var`关键字来声明一个变量比如
```javascript
var name; // 生命一个名为 name 的变量
var name; // 声明一个名为 name 的变量
```
补充在ES6语法及之后统一使用 `const``let`关键字来声明一个变量这个以后再讲
PS**在JavaScript中永远都是用var来定义变量**在ES6 之前这和CJava等语言不同
### 变量的声明/定义ES6
在ES6语法及之后可以使用 `const``let`关键字来声明一个变量
```js
const name; // 定义一个常量
let age;
```
如果你想定义一个常量就用 const如果你想定义一个变量就用 let
### 变量的赋值
@ -73,7 +87,7 @@ var name; // 生命一个名为 name 的变量
name= '千古壹号'
```
变量的声明和赋值举例如下
变量的声明和赋值写在一起举例如下
```javascript
var a = 100; // ES5语法
@ -94,7 +108,6 @@ var是英语“variant”变量的缩写。后面要加一个空格空格后
- 变量名我们可以给变量任意的取名字
PS**在JavaScript中永远都是用var来定义变量**在ES6 之前这和CJava等语言不同
### 变量的初始化
@ -212,7 +225,7 @@ console.log(a); // 会报错
### 关键字
**关键字**是指 JS 本身已经使用了的单词不能再用它们充当变量函数名等标识符
**关键字**是指 JS 本身已经使用了的单词我们不能再用它们充当变量函数名等标识符
JS 中的关键字如下
@ -269,6 +282,8 @@ a2 = temp;
```
## 我的公众号
想学习**代码之外的技能**不妨关注我的微信公众号**千古壹号**id`qianguyihao`

View File

@ -110,33 +110,52 @@ person.height = '180';
**如果两个变量保存的是同一个对象引用当一个通过一个变量修改属性时另一个也会受到影响**
上面这句话很重要我们来看例子
上面这句话很重要我们来看看下面的例子
### 一个经典的例子
## 传值和传址的区别
```javascript
var obj = new Object();
obj.name = "孙悟空";
var obj2 = obj;
### 传值
//修改obj2的name属性
obj2.name = "猪八戒";
代码举例
```js
let a = 1;
let b = a;// 将 b 赋值给 a
b = 2; // 修改 b 的值
```
上面的代码中当我修改 obj2 的name属性后会发现obj name 属性也会被修改因为obj和obj2指向的是堆内存中的同一个地址
上方代码中当我修改 b 的值之后a 的值并不会发生改变这个大家都知道我们继续往下看
### 传址一个经典的例子
代码举例
```javascript
var obj1 = new Object();
obj1.name = "孙悟空";
var obj2 = obj1; // 将 obj1 的地址赋值给 obj2。从此 obj1 和 obj2 指向了同一个堆内存空间
//修改obj2的name属性
obj2.name = "猪八戒";
```
上面的代码中当我修改 obj2 的name属性后会发现obj1 name 属性也会被修改因为obj1和obj2指向的是堆内存中的同一个地址
这个例子要尤其注意实战开发中很容易忽略
对于引用类型的数据赋值相当于地址拷贝ab占用了同一段地址所以改了ba也会变本质上ab就是一个东西
对于引用类型的数据赋值相当于地址拷贝ab指向了同一个堆内存地址所以改了ba也会变本质上ab就是一个东西
如果你打算把引用类型 A 的值赋值给 B让A和B相互不受影响的话可以通过 Object.assign() 来复制对象效果如下
```js
var obj = {name: '孙悟空'};
var obj1 = {name: '孙悟空'};
// 复制对象:把 obj 赋值给 obj3。两者之间互不影响
var obj3 = Object.assign({}, obj);
// 复制对象:把 obj1 赋值给 obj3。两者之间互不影响
var obj3 = Object.assign({}, obj1);
```
## 对象的分类

View File

@ -1,14 +1,13 @@
## 对象的基本操作
### 创建对象
使用new关键字调用的函数是构造函数constructor**构造函数是专门用来创建对象的函数**
使用 new 关键字调用的函数是构造函数 constructor**构造函数是专门用来创建对象的函数**
例如
```javascript
var obj = new Object();
var obj = new Object();
```
记住使用`typeof`检查一个对象时会返回`object`
@ -22,27 +21,26 @@
向对象添加属性的语法
```javascript
对象.属性名 = 属性值;
对象.属性名 = 属性值;
```
举例
```javascript
var obj = new Object();
var obj = new Object();
//向obj中添加一个name属性
obj.name = "孙悟空";
//向obj中添加一个name属性
obj.name = '孙悟空';
//向obj中添加一个gender属性
obj.gender = "男";
//向obj中添加一个gender属性
obj.gender = '男';
//向obj中添加一个age属性
obj.age = 18;
//向obj中添加一个age属性
obj.age = 18;
console.log(JSON.stringify(obj)); // 将 obj 以字符串的形式打印出来
console.log(JSON.stringify(obj)); // 将 obj 以字符串的形式打印出来
```
打印结果
```
@ -55,12 +53,12 @@
### 获取对象中的属性
**方式1**
**方式 1**
语法
```javascript
对象.属性名
对象.属性名;
```
如果获取对象中没有的属性不会报错而是返回`undefined`
@ -68,24 +66,23 @@
举例
```javascript
var obj = new Object();
var obj = new Object();
//向obj中添加一个name属性
obj.name = "孙悟空";
//向obj中添加一个name属性
obj.name = '孙悟空';
//向obj中添加一个gender属性
obj.gender = "男";
//向obj中添加一个gender属性
obj.gender = '男';
//向obj中添加一个age属性
obj.age = 18;
//向obj中添加一个age属性
obj.age = 18;
// 获取对象中的属性,并打印出来
console.log(obj.gender); // 打印结果:男
console.log(obj.color); // 打印结果undefined
// 获取对象中的属性,并打印出来
console.log(obj.gender); // 打印结果:男
console.log(obj.color); // 打印结果undefined
```
**方式2**可以使用`[]`这种形式去操作属性
**方式 2**可以使用`[]`这种形式去操作属性
对象的属性名不强制要求遵守标识符的规范不过我们尽量要按照标识符的规范去做
@ -95,62 +92,63 @@
```javascript
// 注意,括号里的属性名,必须要加引号
对象['属性名'] = 属性值
对象['属性名'] = 属性值;
```
上面这种语法格式举例如下
```javascript
obj['123'] = 789;
obj['123'] = 789;
```
**重要**使用`[]`这种形式去操作属性更加的灵活因为我们可以在`[]`中直接传递一个**变量**
### 修改对象的属性值
语法
```javascript
对象.属性名 = 新值
对象.属性名 = 新值;
```
```javascript
obj.name = "tom";
obj.name = 'tom';
```
### 删除对象的属性
语法
```javascript
delete obj.name;
delete obj.name;
```
### in 运算符
通过该运算符可以检查一个对象中是否含有指定的属性如果有则返回true没有则返回false
通过该运算符可以检查一个对象中是否含有指定的属性如果有则返回 true没有则返回 false
语法
```javascript
"属性名" in 对象
'属性名' in 对象;
```
举例
```javascript
//检查obj中是否含有name属性
console.log("name" in obj);
//检查对象 obj 中是否含有name属性
console.log('name' in obj);
```
我们平时使用的对象不一定是自己创建的可能是从接口获取的这个时候in 运算符可以派上用场
我们平时使用的对象不一定是自己创建的可能是别人提供的这个时候in 运算符可以派上用场
当然还有一种写法可以达到上述目的
```js
if (obj.name) {
// 如果对象 obj 中有name属性我就继续做某某事情。
}
```
## 遍历对象for in
@ -168,8 +166,8 @@ for (var 变量 in 对象名) {
```javascript
for (var key in obj) {
console.log(key); // 这里的 key 是:对象属性的键(也就是属性名)
console.log(obj[key]); // 这里的 obj[key] 是:对象属性的值(也就是属性值)
console.log(key); // 这里的 key 是:对象属性的键(也就是属性名)
console.log(obj[key]); // 这里的 obj[key] 是:对象属性的值(也就是属性值)
}
```
@ -178,34 +176,30 @@ for (var key in obj) {
```html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title></title>
<script type="text/javascript">
var obj = {
name: 'smyhvae',
age: 26,
gender: '男',
address: 'shenzhen',
sayHi: function () {
console.log(this.name);
},
};
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
var obj = {
name: "smyhvae",
age: 26,
gender: "男",
address: "shenzhen",
sayHi: function() {
console.log(this.name);
// 遍历对象中的属性
for (var key in obj) {
console.log('属性名:' + key);
console.log('属性值:' + obj[key]); // 注意,因为这里的属性名 keu 是变量,所以,如果想获取属性值,不能写成 obj.key而是要写成 obj[key]
}
};
// 遍历对象中的属性
for (var key in obj) {
console.log("属性名:" + key);
console.log("属性值:" + obj[key]); // 注意,因为这里的属性名 keu 是变量,所以,如果想获取属性值,不能写成 obj.key而是要写成 obj[key]
}
</script>
</head>
<body>
</body>
</script>
</head>
<body></body>
</html>
```
打印结果
@ -228,3 +222,4 @@ for (var key in obj) {
console.log(this.name);
}
```

View File

@ -0,0 +1,34 @@
## Object.assgin()
### 对象 obj1 复制给 obj2两者之间互不影响
代码举例
```js
// 复制对象:把 obj1 赋值给 obj1。两者之间互不影响
var obj2 = Object.assign({}, obj1);
```
## Object.freeze() 冻结对象
Object.freeze() 方法可以冻结一个对象一个被冻结的对象再也不能被修改冻结了一个对象则不能向这个对象添加新的属性不能删除已有属性不能修改该对象已有属性的可枚举性可配置性可写性以及不能修改已有属性的值此外冻结一个对象后该对象的原型也不能被修改freeze() 返回和传入的参数相同的对象
代码举例
```js
const params = {
name: 'qianguyihao';
port: '8899';
}
Object.freeze(params); // 冻结对象 params
params.port = '8080';// 修改无效
```
上方代码中 params 对象冻结后如果想再改变 params 里面的属性值是无效的