1. 语言和环境 (平台) 之间的关系
- 语言:编写代码的语法规范;
遵循特定语法规范,编写出来的代码,只是单纯的文本字符串而已,并不具备可执行的特点; - 环境 (平台):提供了执行代码的能力;编写的代码,想要执行,必须依赖于,特定的执行环境;
例如:Javascript代码,可以在浏览器中被执行;所以,浏览器,就是一个 Javascript 的执行环境;
2. Node环境中的 Javascript
- Node.js:就是 Javascript 服务器端,运行环境;可以实现 服务器端的编程;
- 浏览器中 Javascript 的组成部分:ECMAScript核心 + DOM + BOM
- Node.js 中 Javascript 的组成部分:ECMAScript 核心 + 全局成员 + 核心 API 模块
全局成员:console、setInterval、setTimeout …
核心 API 模块:Node 平台 提供的一些 独有的API; - Node.js 中 没有 BOM 和 DOM
由于 Node 服务器端 运行环境中,没有浏览器 和 HTML 的概念;所以,没有 DOM 和 BOM 对象模型,取而代之的,是 全局成员 和 核心 API 模块;
3. Node.js 可以做什么
- 使用 Javascript 编写,符合规范的 后端 API 接口 或网站;
- 开发一些实用的工具 或包;
- 基于 Socket 技术,开发类似于,聊天室 之类的,即时通讯项目;
- 基于 Electron 环境,开发 桌面软件;
4. 环境安装
- 下载 node.js安装包,安装 并配置环境
LTS 版本:【推荐在企业中使用】,长期稳定版 的安装包,运行稳定、安全;
Current 版本:【推荐学习或尝鲜去使用】,安装包中,有最新的Node特性; - 安装 node,同时安装 npm 包管理工具;
- 查看 Node 版本:打开终端 输入 node -v
- 如何进入终端:
shift + 鼠标右键 --> 在此处打开 powershell/cmd 窗口
文件夹地址栏:cmd
5. path 环境变量
- path环境变量:能够让我们在终端中,执行相关的命令,快速启动应用程序;
用户环境变量:每个人独有的
系统环境变量:共有的; (包括path环境变量) - 终端输入命令的形式,快速启动应用程序时,路径查找规则
先在当前运行 终端命令的 目录中查找,如果有,直接运行;
如果没有,则去全局的 path 环境变量中查找;
6. Node 环境中 执行 js 代码的两种方式
1.Ctrl + ~ 快速打开 VSCode 集成的,终端面板,执行 node 命令;
2. node 要执行的 js文件路径,执行指定的 JS文件;
键盘的 ↑ , 快速定位到,上一次执行的命令
tab 快速补全路径
cls 清屏
cd.. 向上一层
REPL 环境 (了解)
- 打开任意终端,直接输入 node 并回车,就会进入 REPL 环境中;
按两次ctrl + c 就能退出 REPL 环境; - REPL中,每个字母代表的意思:
R: Read 的意思,每当我们输入完毕代码之后,只要敲击回车,Node环境就会读取用户输入的代码
E:Evaluate 的意思,表示把 Read 进来的用户代码,调用 类似于 Eval 的函数,去解析执行
P:Print 输出的意思;把第二步中解析执行的结果,输出给用户;
L:Loop 循环的意思,表示当输出完毕之后,进入下一次的 REP循环
7. ECMAScript 6常用语法
1) let 变量 与 const 常量
- var 定义的变量:
存在变量提升问题;
没有块级作用域 (作用域外仍可使用),容易造成变量污染
//使用 var 定义的变量没有 { } 作用域的限制
for (var i = 0; i < 10; i++) {}
console.log(i)//10
//let 关键字定义变量
for (let i = 0; i < 11; i++) { }
console.log(i) // not defined
- let 主要特性:
没有变量提升问题,只有定义后,才能使用;
有 { } 作用域; - const 主要特性:
没有变量提升问题;
有 块级 作用域:
for循环内可以打印10次 const d ;因为每次都是一个单独的作用域, 不冲突, 不是重新赋值;
const 定义的常量,无法被重新赋值;定义常量时,必须定义且初始化,否则报错;
必须定义并赋值; const d =10; const d 不行;
能用const;就不用let;能用let;就不用var;
2) 变量的解构赋值(常用)
把对象中的,属性 当作变量,给解放出来;就能当作变量,直接使用了;
// let { } = user 解构赋值语法;可以使用':'为解构出来的变量,重命名;
let user = {
name: 'zs',
age: 20,
gender: '男'
}
let { name : name123, age, gender } = user
console.log(name123,age,gender)//zs,20,男
//省略了 let age = user.age; let gender = user.gender;
//user.name='zs'仍可以用,相当于声明了一个,新的变量 name123;
//name123 = 'er';可以重新赋值;
3) 箭头函数(常用)
- 普通 function函数
function show() {
console.log('普通 function 定义的 show方法')
}
- 箭头函数
(形参列表) => { 函数体代码 }
//箭头函数,本质上就是一个匿名函数(没有函数名);
//箭头函数内部的 this, 永远指向,箭头函数外部的 this;
//点击 1s后,变成红色
document.getElementById('btn').onclick = function () {
setTimeout(function () {
console.log(this) //setTimeout 里的 this,指向 Window;
this.style.backgroundColor = 'red'
}, 1000)
}
//箭头函数内、外this,都是指向点击的按钮
document.getElementById('btn').onclick = function() {
setTimeout(() => {
console.log(this)
this.style.backgroundColor = 'red'
}, 1000)
}
- 箭头函数变体
function add(x,y) {
return x + y
}
var add = (x,y) => {return x + y}
console.log(add(1,2))//3
变体1:如果箭头函数,左侧的形参列表中,只有一个参数,则左侧 小括号可以省略;
变体2:如果右侧函数体中,只有一行代码,则 { } 可以省略;
变体3:如果箭头函数左侧 只有一个 形参,且右侧只有一行代码,则 两边的 () 和 {} 都可以省略;
function add(x) {
return x + 20
}
var add = x => x + 20 //函数体只有一行代码时,默认把{ }的值,返回回去,所以不要ruturn
console.log(add(3))//23
如果省略了 右侧函数体的 { },默认会把 右侧函数体中,代码的执行结果,当作箭头函数的调用结果, return 出去;
4) 对象中 定义方法 和属性 的便捷方式
let name = 'zs'
let age = 22
function show() {
console.log('我是zs')
}
/*var person = {
name: name,
age: age,
show: show
}
console.log(person)//{ name: 'zs', age: 22, show: [Function: show] } */
var person = {
name,
age,
show, // 上面没有定义的 say 方法
say() { // say: function () {
console.log('ok') // console.log('ok')
} // }
}
console.log(person)// { name: 'zs',age: 22,show: [Function: show],say: [Function: say] }