Node.js官 网地址: https://nodejs.org/en/
中文:http://nodejs.cn/api/
Node是-个构建于Chrome V8引擎之上的一个avascript运行环境
Node使用事件驱动、非阻塞IO模型(异步读写)使得它非常的轻量级和高效
Node中的 NPM是世界上最大的开源库生态系统(类似于github)
使用终端命令node [js文件路径] 开始运行js文件
(1)其实当我们在终端执行Node命令时,并不是我们终端去编译解释js代码,而是电脑会自动打开Node安装包中Node.exe应用程序来打开js文件
Node.exe是一个类似于终端的应用程序,没有界面(CL程序: command-line interface, 命令行界面)
Node.exe工作环境称之 为REPL环境,也就是交互式解释器。
(2) REPL才 是真正解释执行我们js代码的解释器
js都是运行在浏览器端的
ECMAScript:js语法(变量、数据类型、表达式、代码结构(顺序、循环、分支)…)
BOM:浏览器对象模型,用js去操作浏览器的窗口
DOM:文档对象模型,用js去操作页面上的dom树
今天我们说,有了node.js,js也可以运行在服务器端的.
ECMAScript
意思是说在node.js中 不能写dom语法和bom语法
1.有变量提升
2.没有块级作用域,是函数作用域
3.可以重复声明
4.可以重新赋值
let声明变量
1.没有变量提升
2.有块级作用域
3.不能重复声明
4.可以重复赋值
* 没有变量提升
* 有块级作用域
* 不能重复声明
* 不能重新赋值
* 声明必须初始化值
* 一些不会变化的值,比如圆周率PI
* 大事件项目中,保存及地址的就可以用常量,
代码
// 1.没有变量提升
console.log(num0);
const num0 = 20; //报错
// 2.有块级作用域
{
const num5 = 100;
}
console.log(num5); //报错
// 3.不能重复声明
const num1 = 100;
const num1 = 200;
console.log(num1); //报错
// 4.声明必须初始化值
const num2;
console.log(num2); //报错
// 5.不能重新赋值
const num3 = 10;
num3 = 20;
console.log(num3); //报错
对象解构赋值
取对象中属性的值,赋值给变量.
六种写法(代码案例)
// 声明一个变量
let obj = {
name: "雪花",
age: 100,
gender: "男",
score: 200,
};
// es5
// let name1 = obj.name;
// let age1 = obj.age;
// let gender1 = obj.gender;
// let score1 = obj.score;
// console.log(name1,age1,gender1,score1);
// es6
// 第一种写法
// let {name:name1,age:age1,gender:gender1,score:score1} = obj;
// console.log(name1,age1,gender1,score1); //雪花 100 男 200
// 第二种写法
// let {name:name,age:age,gender:gender,score:score} = obj;
// console.log(name,age,gender,score); //雪花 100 男 200
// 第三种写法
// let {name,age,gender,score} = obj;
// console.log(name,age,gender,score); //雪花 100 男 200
// 第四种写法
// let {name,age,gender,fenshu} = obj;
// console.log(name,age,gender,fenshu); // 雪花 100 男 undefined
// 第五种写法
// let {name,age,gender,score:fenshu} = obj;
// console.log(name,age,gender,fenshu); //雪花 100 男 200 180
// 第六种写法
let {name,age = 18,gender,score:fenshu,height = 180} = obj;
console.log(name,age,gender,fenshu,height); //雪花 100 男 200 180
// 作业题
// var {a,b,c} = {"c":10,"b":9,"a":8};
// console.log(a,b,c); // 8 9 10
var {a,b,c,a:d} = {"c":10,"b":9,"a":8};
console.log(a,b,c,d); // 8 9 10 undefined
数组解构赋值
就是把数组中每一个元素的值依次赋值给对象变量
五种写法
let arr = [0,1,2,3];
//es5
// let num1 = arr[0];
// let num2 = arr[1];
// let num3 = arr[2];
// let num4 = arr[3];
// console.log(num1,num2,num3,num4);
// es6
// 第一种写法
// let [num1,num2,num3,num4] = arr;
// console.log(num1,num2,num3,num4); // 0 1 2 3
// 第二种写法
// let [num1,num2,num3,num4,num5] = arr;
// console.log(num1,num2,num3,num4,num5); // 0 1 2 3 undefined
// 第三种写法
// let [num1,num2,num3,num4,num5=50] = arr;
// console.log(num1,num2,num3,num4,num5); // 0 1 2 3 50
// 第四种写法
// let [num1=100,num2,num3,num4,num5=50] = arr;
// console.log(num1,num2,num3,num4,num5); // 0 1 2 3 50
// 第五种写法
let [num1,num2] = arr;
console.log(num1,num2);
console.log(arr[3]);
语法
// es5
//声明一个函数,形参有多个
// function test1(name,age,gender){
// console.log(name,age,gender);
// }
// test1("啵啵",12,"女");
// 如果形参有多个,最好把形参写成一个对象
// function test1(obj){
// console.log(obj.name,obj.age,obj.gender);
// }
// test1({
// name:"啵啵",
// age:12,
// gender:"女",
// }); // 啵啵 12 女
// es6
// 声明一个函数,形参有多个
// function test2({name,age,gender,height=180}){
// console.log(name,age,gender,height);
// }
// test2({
// name:"啵啵",
// age:38,
// gender:"女",
// height:160,
// }); // 啵啵 38 女 160
// 作业题
function sum([a,b,c,d=5]){
console.log(a+b+c+d);
}
sum([10,20,30]); // 65
function sum2([a,b,c,d]){
console.log(a+b+c+d);
}
sum2([10,20,30]); // NaN
箭头函数
匿名函数的一个简写
简写规则
a.function 改成 => , =>可以读成goesto
b.如果只有一个参数,那就可以省略形参小括号
c.如果不是一个形参,0个或多个形参,那就不能省略这个形参小括号
d.如果只有一句话,那就可以省略函数题的大括号
e.如果函数体只有一句话,并且这句话是return返回值,那return也要省略
f.如果函数体不是一句话,那就不能省略这个大括号。
代码
普通的匿名函数
let fn = function(name){
console.log("我的名字"+name);
}
fn("微微");
箭头函数
let fn = name => console.log("我的名字"+name);
fn("微微");
let fn1 = function(name){
return name + 'hello';
}
let fn1 = (name) =>{
return name + 'hello';
}
let fn1 = name =>{
return name + 'hello';
}
let fn1 = name => name + 'hello'
console.log(fn1('smile'));
let fn2 = function(nun1,num2){
console.log(num1+num2);
return num1+num2+30;
}
let fn2 = (num1,num2) =>{
console.log(num1+num2);
return num1+num2+30;
}
console.log(fn2(10,20));
setTimeout(function(){
},timeout)
setTimeout(() =>{
},timeout);
作业题
//作业题
// let fn1 = function(){
// console.log('hello');
// }
let fn1 = () => console.log('hello'); fn1();
// let fn2 = function(name){
// console.log(name+'hello');
// }
let fn2 = name => console.log(name+'hello');fn2("薇薇");
// let fn3 = function(name,age){
// console.log(name+"hello,world"+age);
// }
let fn3 = (name,age) => console.log(name+"hello,world"+age);fn3("薇薇","小小");
// let fn4 = function(age){
// return age+10;
// }
let fn4 = age => age+10;console.log(fn4(10));
// let fn5 = function(name,age){
// console.log(name+'hello');
// return age + 10;
// }
let fn5 = (name,age) =>{
console.log(name+'hello');
return age + 10;
}
console.log(fn5("薇薇",20));
/*
对象成员简写
*/
// 声明一些变量
let name = '千里';
let age = '18';
let gender = '男';
let score = 100;
// 现在声明了一个对象
// 对象里面有name,age,gender,score属性
// 希望这些属性的值是上面对应变量的值
// es5
// var obj = {
// name:name,
// age :age,
// gender:gender,
// score:score,
// sayHi:function(){
// console.log('哈哈,smile');
// }
// }
// console.log(obj);
// obj.sayHi();
// es6
var obj = {
name, // 相当于 name:name,
age ,
gender,
score,
// sum, // 相当于sum:sum,报错了,因为外面没有sum这个变量.
fenshu:score, //这个不会报错,取外面score变量的值,复制个这个fenshu属性
sayHi(){
console.log('哈哈,smile');
}
}
console.log(obj);
obj.sayHi();
对象展开
展开运算符 …
代码
// 声明一个对象
let chinese = {
skin:"黄色皮肤",
hair:"黑色头发",
sayHi(){
console.log("你好,你吃力吗?");
}
}
// 声明一个对象
let zhuBo = {
skill:"唱跳rap打篮球,老铁双击666",
song:"长大碗宽面"
}
// 声明一个对象
let linge = {
// skin:"黄色皮肤",
// hair:"黑色头发",
// sayHi(){
// console.log("你好,你吃力吗?");
// },
// song:"长大碗宽面"
...chinese,
...zhuBo,
gender:"男",
hair:"白发苍苍",
}
console.log(linge);
1. 数组展开
展开运算符 …
a.数组拼接
b.利用Math.max()/MAth.min()来求数组中的最大值/最小值.
代码
// eg01
// let arr1 = [10,20,30];
// let arr2 = [...arr1,40,50];
// console.log(arr1);
// console.log(arr2);
//eg02
// let arr1 = [10,20,30];
// let arr2 = [40,50,60];
// let arrNew = [...arr1,...arr2];
// console.log(arrNew);
// eg03
// 求数组中最大值
let arr1 = [10,3,5,53,12,34,98];
// 以前做法
let max1 = Math.max.apply(Math,arr1);
console.log(max1);
// 数据展开语法
let max2 = Math.max(...arr1);
console.log(max2);
Set
作用和数组类似,和数组不同的是:他不能存放重复的元素
应用场景:数组去重.
代码
//eg01:基本使用
let set1 = new Set([10,20,30,40,10,20,30,50]);
console.log(set1); // [10,20,30,40,10,20,30,50]
//eg02:数组去重
let arr = [10,20,30,40,10,20,30,50];
let set = new Set(arr);
let arrNew = [...set];
console.log(arrNew); // [10,20,30,40,10,20,30,50]
//eg03:简写
let arr1 = [10,20,30,40,10,20,30,50];
let arrNew1 = [...new Set(arr1)]; // arr1去重,得到一个新的数组arrNew
console.log(arrNew1); // [10,20,30,40,10,20,30,50]
模板字符串 ``
会保留原样字符串格式,以及可以占位。
代码
// es5
// 字符串没有格式,里面也不能写变量
// let author = '波波';
// let str1 = "
// 静夜思
// author
// 床前明月光,
// 疑是地上霜,
// 低头思故乡,
// 举头望明月。
// ";
// es6:模板字符串
// let author = '波波';
// let str1 = `
// 静夜思
// ${author}
// 床前明月光,
// 疑是地上霜,
// 低头思故乡,
// 举头望明月。
// `;
// console.log(str1);
// eg01:
let name = '千里';
let age = 30;
let score = 100;
console.log(`我的名字${
name},我的年龄${
age},我的成绩是${
score}`);
//eg02
function test(){
return '哈哈哈';
}
console.log(`想听笑声吗:${
test()}`);
forEach();
遍历数组,把遍历出来的每一项交给回调函数.
没有返回值
let arr = [10,20,30,40];
arr.forEach(function(item,index){
// item 就是遍历出来的每一个项
// index 就是遍历出来每一个项对应的索引
// console.log(item,index);
console.log(item+10);
});
map()
遍历数组,有返回值
let arr = [10,20,30,40];
let arrNew = arr.map(function(item,index){
// item 就是遍历出来的每一个项
// index 就是遍历出来每一个项对应的索引
// console.log(item,index);
return item * item;
});
console.log(arrNew); // [ 100, 400, 900, 1600 ]
filter();过滤器
filter()方法会创建一个新的数组,新的数组中元素是通过检查后符合条件的元素
let arr = [10,20,11,21,31,52,66,71];
let arrNew = arr.filter((item,index)=>{
// item 就是遍历出来的每一个项
// index 就是遍历出来每一个项对应的索引
console.log(item,index);
return item % 2 == 0;
});
console.log(arrNew);
https://www.babeljs.cn/