• Node初体验


    一、介绍
              NodeJS是一个运行环境,其使用了一个事件驱动、非阻塞式(异步) I/O的模型,使其轻量又高效。
     
    二、 宿主环境
              ECMAScript语法规则,需要不同版本实现。如果说ECMAScript运行在浏览器,称为javascript,简称JS。如果说ECMAScript运行flash环境,称为ActionScript,简称AS。如果ECMAScript运行在Node环境,称为Nodejs。这个环境就是宿主环境。必须依赖于某个环境,ECMAScript需要“寄生在某一宿主环境”。
     
    三、环境变量
    我们在cmd窗口中输入node其实是node.exe,exe就是可执行程序
    在命令窗口输入某一个命令,其实调用的是一个可执行程序,可能是.exe或者.cmd等等。此时会优先咋当前执行命令目录查找有没有相应的可执行程序,有则执行,没有则去环境变量(PATH)中去查找,找到执行,找不到报错。
     
    四、第一个Nodejs程序
    打开目录窗口,运行nodejs ,输入node hello.js 回车
    console.log('Hello World');
    注:tab键可以自动补全
     
    五、基础语法
     
    var str = '我平时***';
     
    var arr = ['AS','JS','Node'];
     
    var obg = {
        name : 'Node',
        ver : '6.11.0'
    }
     
    console.log(str);
     
    console.log(arr);
     
    console.log(obj);
     
    function fn () {
        console.log("一个 function");
    }
     
    fn();
     
    var bar = function () {
        console.log("function2");
    }
     
    bar();
     
    for (var i = 0; i <10; i++) {
        if(i<5){
            console.log(i);
        }
    }
    但是
    alert('123');//不能执行
    原因node之中没有BOM,只有ECMAScript.凡是BOM和DOM的内容在nodejs下都没有。
     
    六、node做的扩展
    (1)require(加载并执行另一个js程序,类似于 HTML 的 script 标签)
     
    require('./02syntax.js');
    console.log('当前输出');
     
    (2)__dirname 用来获取当前文件目录dir(directory)
     
    console.log(__dirname);
     
    (3)__filename 用来获取当前文件的绝对路径
     
    console.log(__filename);
     
    (4)global 全局对象,类似于浏览器中的window。
     
      a) setTimeout/clearTimeout
      b) setInterval/clearInterval
      c) console
     
    console.log(global);//可以获取版本号(process)等等很多东西
    var i=0
    var timer=setInterval(function(){
        console.log(i++);
    },1000);
    setInterval(function(){
        clearInterval(timer);
    },5000);
     
    七、ES6(ECMAScript6)
     
    (1)块级作用域
     
    作用域分为三种:全局、函数、块级(ES5中没有);
     
    块级作用域:任何一对花括号({})中的语句集都属于一个块,在块中声明的变量在代码块外都是不可访问的,称之为块级作用域,ES5以前没有块级作用域
     
     
    if(true){
        var a=10;
    }
    console.log(a);
     
    function fn(){
        var b=10;
    }
    console.log(b);
     
     
    (2)关键字 let 和 const
     
    a)let用于声明变量(类似于var),其声明的变量只在当前代码块内有效,实际上是创建了块级作用域
     
    if(true){
        let a=1;
    }
    console.log(a);
     
    let的其他特点:没有变量提升,并且不能重复定义
     
    console.log(typeof str);
    var str =19;
     
    let a=1;
    let a=2;
     
    暂时性死区:在块级作用域中用let声明变量是块级作用域会形成一个封闭的环境,不能访问外部声明的变量。
     
    var c=19;
    if(true){
        console.log(c);
        let c;
    }
     
    b)const 用于声明常量,常量于变量不同,变量声明后其值可以任意更改,而常量一旦赋值就不允许被更改
     
    const a= 1;
    a=2;
    console.log(a);
     
    常量必须赋值
     
    const b;
     
    也会创建块级作用域
     
    if(true){
        const a=1;
    }
    console.log(a);
     
    不能重复声明
     
    const a= 1;
    const a=2;
    console.log(a);
     
    暂时性死区
     
    var c=19;
    if(true){
        console.log(c);
        const c=10;
    }
     
    (3)变量解构赋值
     
    按照某种模式,从数组和对象中提取值,对变量进行赋值这被称为解构。
     
    Es6提供更好的方式来定义多个变量
     
         a) 数组解构赋值:将变量放到一个数组中,其值也是一个数组,,并且左右数组结构一致,这样就可以将右侧数组中的值,按照顺序赋值给左侧的数组中的变量。
     
    var [a,b,c]=[1,2,3];
    console.log(a,b,c);
         
    如果左侧数组中变量不能与右侧数组中的值做对应,则为undefined
     
    var [a,b,c]=[1,,3];
    console.log(a,b,c);
     
    可以为变量初始化值(默认值)
    使用默认值的前提是值为undefined
     
    var [a=10,b,c]=[undefined,12,3];
    console.log(a,b,c);
     
         b) 对象解构赋值
     
    左侧对象里放的是变量的名字,右侧对象放的是变量的值,左右根据属性名来做对应关系。换顺序是没有影响的。
     
    //标准形式
    var {name:name,age:age,gender:gender} = {name:'小明',age:12,gender:'man'};
    console.log(name,age,gender);
    //简写形式
    var {name,age,gender} = {name:'小明',age:12,gender:'man'};
    console.log(name,age,gender);
     
    举个栗子:
     
    var {arg1:name,arg2:age} = {arg1:'小明',arg2:12,};
    console.log(name,age);
     
    嵌套:
     
    var {name:names,age:{age1,age2}} = {name:'小明',age:{age1:12,age2:14}};
    console.log(names,age1,age2);
     
    支持默认值
    使用默认值的前提是右侧值为undefined
     
    var {name:name='小红',age:age=13,gender:gender='woman'} = {};
    console.log(name,age,gender);
     
    以上介绍了解构赋值的语法规则,可以在现实开发中带来很大的便利,提升开发效率。
     
    (4)字符串扩展
         对象方法
    1、includes检测是否包含某一字符
     
    let str= 'my name is it';
    let res=str.includes('m');
    console.log(res);
     
    2、startsWith判断是否是以某一字符串开始
     
    let str= 'my name is it';
    let res=str.startsWith('my');
    console.log(res);
     
     
    let str= 'my name is it';
    let res=str.startsWith('name',2);
    console.log(res);
     
    3、 endsWith判断是否是以某一字符串结束
     
    let str= 'my name is it';
    let res=str.endsWith('it');
    console.log(res);
     
    let str= 'my name is it';
    let res=str.endsWith('name',7);
    console.log(res);
     
    4、repeat可以重复某个字符
     
    console.log('x'.repeat(10));
     
    5、padStart padEnd 可以补全字符串
    在前面补了一个0
    console.log('x'.padStart(10,'0'));//0xxxxxxxxxx
     
         模板字符串
    1、ES6提供了更方便的定义大段的字符串的方式
    使用反引号`
    let html =`<ul>
                <li></li>
                </ul>`;
    --
    let [name,age]=['qqqq',12];
    let p =`<p>我叫${name},我今年${age}岁了</p>`
    console.log(p);
    --
    function say() {
        return `你好`;
    }
    let r =`${say()}小名,我是xx`;
    console.log(r);
     
    (5)数组扩展
    1、Array.from();
     
    function fn(){
        console.log(Array.from(arguments));
    }
    fn(12,13);
     
    2、Array.of();
     
    var arr=[1,2,3];
    Array.of();
    console.log(Array.of(arr));
    --
    console.log(Array.of(3));
    2、find()
    var arr=Array.of(1,2,6,4,4);
    arr.find(function(a,b,c){
        console.log(a,b,c);
    })
    输出:
    1 0 [ 1, 2, 6, 4, 4 ]
    2 1 [ 1, 2, 6, 4, 4 ]
    6 2 [ 1, 2, 6, 4, 4 ]
    4 3 [ 1, 2, 6, 4, 4 ]
    4 4 [ 1, 2, 6, 4, 4 ]
     
    3、findIndex();
     
    var arr=Array.of(1,2,6,4,4);
    arr.findIndex(function(a,b,c){
        console.log(a,b,c);
    })
     
    (6)函数扩展
    a) 默认参数,允许为函数指定默认参数
     
    function fn(a , b =10){
        return a+b;
    }
    console.log(fn(1));
     
    b) reset参数,用于获取多余的参数,将多余的参数装到一个数组中
     
    function fn(a , b ,...c){
        console.log(a);
        console.log(b);
        console.log(c);
    }
    fn(1,2,3,4,5);
     
     
     
    c) 扩展运算符,它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列
     
    console.log(...[1,2,3,4]);
     
    d) 箭头函数,使用“箭头”(=>) 定义函数(重点)
    ES6提供了新的定义函数的方式=>
    函数的组成:名字+参数+返回值(=>)+函数体({})
    let foo = () => {console.log('你好')};
    foo();
     
    八、模块
    (1)系统模块
    系统模块看不到,但能直接用,文件模块知道在哪可以看见。
     
    1、os模块 获取当前操作系统信息、内存和CPU
    使用 require 将模块引入,模块名叫os
     
    const os=require('os');
    // console.log(os);
    console.log(os.freemem());
    console.log(os.totalmem());
    console.log(os.cpus());
    Nodejs做了大量的封装,可以让用户直接使用一些功能,并且这些封装是以模块形式存在的。
     
    2、fs模块 文件读写操作
    创建一个文件夹mkdir 删除rmdir 创建文件 writeFile 读取文件 readFile
    const  fs = require('fs');
    fs.mkdir('abc',(err)=>{
        console.log(err);
    // });//创建文件夹
     
    fs.rmdir('abc',(err)=>{
        console.log(err);
    });//创建文件夹
     
    fs.writeFile('./fs.txt','body {width : 100px}',(err)=>{
        console.log(err);
    });//创建文件
     
    fs.readFile('./fs.txt','utf-8',(err,res)=>{
        console.log(err);
        console.log(res);
    });//创建文件
     
    3、path模块 路径处理,
     
    var path = require('path');
    console.log(path.dirname('./01hello.js'));//获得某路径的上一级
    console.log(path.extname('./01hello.js'));//获得文件扩展名
    console.log(path.parse('./01hello.js'));//解析路径
    console.log(path.isAbsolute(__dirname));//判断是否是绝对路径
    (2)文件模块
     
    a、用户模块
     
    1、Nodejs中文件模块分两种,一种是.js结尾,一种是以.json结尾
     
    2、require加载模块路径
      相对路径,如 ./ 或 ../
      绝对路径,如 E: odejs2day4-code23cart 或 / (类unix系统)
      直接写模块名会被当成系统模块或加载node_modules目录的模块
     
    //通过require可以加载其他模块
    //给require 传入一个模块的路径
    require('./json.js');
    require('./json');//可以省略后缀
     
    3、exports和module.exports暴露模块接口
     
    //nodejs想了一个方法可以使用当前模块下定义的方法或属性可以以返回值的方法开放给其他模块使用 ,可以将当前模块开放(暴露)给另一个模块
    module.exports={
        addCart=addCart;
    }
    exports.addCart=addCart;//这两个起到的作用是一样的
    //在nodejs中提供开放功能的是module.exports,exports只是module.reports的简写,即exports=module.exports
    exports.addCart=addCart;等同于module.exports=addCart;
     
    4、多文件模块(也叫包)指某一个功能模块的集合,通常由多个文件构成,统一到某一目录集中管理,并且使用package.json记录包的相关信息,例如模块名称、版本号、作者等,可使用npm init根据提示创建。
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
         
  • 相关阅读:
    Java JDK和IntelliJ IDEA 配置及安装
    来吧学学.Net Core之登录认证与跨域资源使用
    来吧学学.Net Core之项目文件简介及配置文件与IOC的使用
    【转载】任正非:我的父亲母亲
    HTTP协议中的短轮询、长轮询、长连接和短连接
    跨域资源共享CORS详解
    C#各个版本中的新增特性详解
    仓央嘉措不负如来不负卿
    Redis Sentinel实现的机制与原理详解
    Redis的发布订阅及.NET客户端实现
  • 原文地址:https://www.cnblogs.com/hughman/p/7066691.html
Copyright © 2020-2023  润新知