概要:
数据类型、模板字符串、严格模式、变量的作用域、循环结构、
函数、对象、 全局对象、模块对象、包和NPM
1.数据类型:
- 原始类型 String\number\boolean....直接赋值即可
- 引用类型 ES原生对象、Node.js对象、自定义对象...常需要new关键字
var empObj = new Object();
function Myjob(name,age) {
this.name = name;
this.age = age;
}
var ls = new Myjob('hahah',18);
console.log(ls.age);
2.模板字符串(ES6中使用的一个新的字符串的形式)
- 使用模板方式定义字符串,数据可以实现换行(类似html中的<pre>标签)
- 可以使用${}拼接变量,并且可以执行运算
var info=`
用户名:哈哈哈
密码:123
`;
console.log(info);
3、严格模式(ES5中新增的比普通模式更为严格的js运行模式)
- 在整个脚本文件中使用严格模式,开头"use strict";常用于新项目
- 在单个函数内启用严格模式,function(){"use strict",....};常用于老项目维护
- 严格模式下的规则:修改常量的值是非法的(会报错),不允许对未声明的变量赋值、匿名函数的this不再指向全局
4、变量的作用域(全局、局部、ES6中新增块级作用域)
- 块级作用域:只在当前代码块中使用的作用域
- 代码块:任何一个{}都是一个代码块:if\for\while...
- 代码块中使用‘let’声明块级作用域变量,出了代码块便不能使用(可以避免变量冲突,因为出了就没用了)
5、循环结构
- for...in循环由于遍历对象的成员名
- for...of...(ES6):遍历数组的元素值
-
var arr=[1,2,3]; for(let i of arr){ console.log(i); }
6、函数
- 匿名函数的自调
-
//匿名函数自调的两种语法 (function (i) { console.log(i) })(11111111111111); +function (i) { console.log(i); }(11);
- 箭头函数 (省略了function关键字) ((i,j参数)=>{....})();等同于(function (i,j参数){...})();!!!箭头函数只适用于匿名函数,若想变成一般函数的话就写成var f1 = (a)=>{}; 注意:箭头函数中没有arguements对象,若参数只有一个则(i)可写成 i
- 关于闭包:闭包实际上就是在一个函数体内部嵌套一个函数,使变量的值保存
-
//时钟 for(var i=0;i<4;i++){ setTimeout((num=>{ return ()=>{console.log(num);} })(i),1000); }
7.对象
创建对象的方式:
(1)对象直接量方式:var a = {name:"hahha"}
(2)构造函数方式 function a(b){...} var a1 = new a(...)
(3)原型继承方式:var parent = new Object(); var child = Object.create(parent);
(4)ES6新增方式:class方式:描述一类事物统一的属性和功能的程序结构(类:相似对象属性和功能的抽象集合)
//使用class时必须启用严格模式
"use strict";
//创建自定义对象
class Emp {
//构造函数仅用于属性
constructor(ename,salary){//声明一个构造函数
this.ename=ename;
this.salary=salary;
}
work(){
return `${this.ename} is working.`;
}
sal(){
return `${this.ename}'s salary is ${this.salary}.`;
}
}
//实例化
var e1 = new Emp("tom",8000);
//实现继承
class Programer extends Emp{
constructor(ename,salary,skills){
super(ename,salary);
this.skills=skills;
}
work(){
return super.work()+'skills are'+this.skills;
}
}
var p1 = new Programer("Jack",1000,"前端");
console.log(p1.ename);
console.log(p1.work());
console.log(p1.skills);
8.全局对象
Node.js中的全局对象是global
-
Global对象的成员属性和成员方法
1.console 用于向stdout(标准输出)和stderr(标准错误)输出信息。
console.log() //向stdout输出日志信息
console.info() //同上
console.error() //向stderr输出错误信息
console.warn() //同上
console.trace() //向stderr输出栈轨迹信息
console.dir() //向stdout输出指定对象的字符串表示
console.assert() //断言,为真的断言,错误信息不会输出;为假的断言,抛出错误对象,输出错误信息,并且终止脚本的运行,可以自定义错误信息。
console.time() console.timeEnd()//测试代码的执时间 注意:console中的成员方法是异步的,输出顺序和书写顺序不一定完全一致。 -
2.process 进程
process.arch //获取CPU架构类型
process.platform //获取操作系统类型
process.env //获取操作系统环境变量
process.cwd() //获取当前文件所在工作目录
process.execPath //获取Node.js解释器所在目录
process.versions //获取Node.js版本信息
process.uptime() //获取Node.js进程运行时间(s)
process.memoryUsage()//获取Node.js进程内存使用信息
process.pid //获取进程ID号
process.kill( pid ) //向指定进程ID号发送退出信号
- 3.定时器 (异步的)
global.setTimeout()//一次性定时器
global.setInterval()//周期定时器
global.setImmediate()//在下次事件循环开始之前立即执行的定时器
global.nextTick()//本次事件循环结束之后立即执行的定时器
//一个简单的一次性定时器
var counter = 0;
var timer = setTimeout(function () {
counter++;
console.log('%d hello',counter);
clearTimeout(timer);
},1000)
//周期性定时器,输出1,2,3,4,5
var counter2=0;
var timer2=setInterval(function () {
counter2++;
console.log(counter2);
if(counter2>=5){
clearInterval(timer2);
}
},1000)
//使用一次性定时器模拟周期性定时器的效果
var counter3=0;
var timer3=setTimeout(function () {
counter3++;
if(counter3<=5){
console.log(counter3);
setTimeout(arguments.callee,1000)
}else{
clearTimeout(timer3);
}
},1000)
9.模块对象
Node.js中使用Model(模块)来规划不同的 功能对象
模块的分类:
(1)核心分类——Node.js的内置模块
(2)第三方模块
(3)自定义模块
每一个被加载的js文件对应一个模块对象,包含响应的功能和函数
模块中声明的变量或函数的作用域叫做“模块作用域”,这些变量和函数都不是global的成员,默认只能在当前的js文件(当前模块)中使用。
Node.js启动时运行的第一个模块叫做“主模块”——main module,也是自身模块。
获取主模块对象:
process.mainModule
require.main
除主模块之外的其他模块都称为子模块。
默认情况下,某一个模块不能直接使用其他模块中封装的数据,但是每个模块可以导出(exports)自己内部的对象供其他模块使 用,也可用引入(require)并使用其他模块导出的对象。
每一个模块内部都可以使用一个变量:module,指向当前模块自己。
//判断当前模块是否主模块
console.log(require.main===module);
模块的引入:require()
(在交互模式下,Node.js自带的模块无需引入,直接使用)
导出模块中的属性和方法供其他模块使用:exports
预定义的模块作用域成员:
__dirname //当前模块文件所在的目录
__filename //当前模块文件所在的目录以及文件名
module //指向当前模块的引用
module.exports //指向当前模块中待导出的供其他模块使用的对象
exports //指向module.exports对象的引用
require //引入其他模块,使用其他模块的module.exports对象
--------circle.js-------
//求圆的面积和周长
const PI = 3.14;
var size = function (r) {
return PI*r*r;
}
var peri = function(r){
return PI*2*r;
}
exports.s=size;
exports.p=peri;
----------1.js-------------
var c=require('./circle.js');
console.log(c.s(5));
console.log(c.p(5));
//求圆的面积和周长
const PI = 3.14;
function Circle(r) {
this.size=function () {
return PI*r*r;
};
this.peri=function () {
return PI*2*r;
}
}
//零散的输出可以使用exports,但是若是构造函数就得使用module.exports
module.exports=Circle;
---------------导入的js-----------------
var c=require('./circle.js');
//构造函数必须得实例化
var circle=new c(5);
console.log(circle.size());
console.log(circle.peri());
自定义模块:
(1)文件模块
没有后缀的文件模块,被作为js文件加载
.js后缀的文件模块,被作为js文件加载
.json后缀的文件模块,被作为JSON字符串加载,会自动解析为对象
.node后缀的文件模块,被作为C/C++二进制加载(写不出来)
(2)目录模块-----目录模块引用时只需引用目录名即可
包含一个package.json文件的目录模块
package.json:
"main": "hello.js" 指向该模块的文件
包含index.js文件的目录模块
包含index.json文件的目录模块
包含index.node文件的目录模块
放到node_modules目录下的模板,引入的时候不用写路径,直接写模块名称即可
模块查找的顺序:
(1)文件/目录模块的缓存
(2)原生模块的缓存
(3)原生模块
(4)文件/目录模块
10、包(package)和NPM(node package manager)
包是根据CommonJS规范,对模块进行的标准封装
包规范:
----包是一个目录
-----目录中包含一个package.json包说明文件,存放于包顶级目录下
-----目录中包含js文件,如有index.js,可以放到包顶级目录下
----其他js文件,放到lib目录下
---二进制文件放到bin目录下
---文档应放到doc目录下
---单元测试文件放到test目录下
CommonJS规范要求,包应该位于当前目录或者父目录下的node_modules文件夹下,require函数由近及远依次查找。
参考链接:http://javascript.ruanyifeng.com/nodejs/packagejson.html#toc0
NPM包管理器
npm官网:www.npmjs.com
npm是Node.js的包管理工具,用于下载、安装、升级、删除包,或者发布并维护包。
Node.js的安装文件中,已经集成了npm。
下载第三方包
(1)安装在当前项目目录下
npm install 包名
会安装到指定目录的node_modules文件夹下
查看目标路径:npm root
(2)安装到全局
npm install 包名 -g
会安装到npm目录下
查看目标路径:npm root -g
列出已经安装的包:npm ls
更新已经安装的包:npm update 包名
卸载已经安装的包:npm uninstall 包名
生成包:
使用npm init命令,可以在当前目录下生成一个package.json文件
发布包:
(1)在http://www.npmjs.com上注册用户(此步可以省略)
(2)使用npm adduser命令注册账号或登录已有账号
(3)进入配置完成的包目录,使用npm publish命令发布包
(4)到npmjs.com上搜索已发布的包