当前位置: 首页 > article >正文

Nodejs-初体验-1

一、区别
Node Version Manager (NVM):

是一个用于管理和切换不同版本的 Node.js 的工具。NVM 不是 Node.js 或 npm 的一部分,但它可以帮助你安装和管理 Node.js。

Node.js:

是一个开放源代码、跨平台的 JavaScript 运行时环境,它使得在服务器端运行 JavaScript 变得可能。

npm :

是 Node.js 的包管理器,它是一个命令行工具,用于安装和管理 Node.js 包。

二、关系

nvm 管理 nodejs 和 npm 的版本,npm 可以管理 nodejs 的第三方插件。

在这里插入图片描述

三、npm命令
npm install

当你首次克隆一个项目或者需要安装项目依赖的时候,会使用到 npm install 命令。这个命令的作用是从项目的 package.json 文件中读取依赖列表,并自动下载这些依赖包到本地的 node_modules 目录下。这确保了所有开发者和生产环境都能使用相同的依赖版本,从而避免“在我的机器上能运行”的问题。

例如,如果你在一个新的项目目录中运行 npm install,npm 将会查找 package.json 文件中的 dependencies 和 devDependencies 字段,并根据这些字段列出的包名和版本来安装相应的软件包。

npm start

npm start 是一个用于启动 Node.js 应用的标准命令。它通常会调用 package.json 文件中的 “start” 脚本。这个脚本可以是一个简单的命令,比如 node app.js,用来启动应用的主要入口文件;也可以是更复杂的命令组合,用于执行构建、启动服务器等操作。

如果 package.json 中没有定义 “start” 脚本,npm start 默认会执行 node server.js。这意味着它会尝试运行名为 server.js 的文件作为应用的起点。

JavaScript数据类型
1、数字

JavaScript 中的数字可以是整数或浮点数。它们用于执行算术运算和存储数值。

let integerNumber = 42;
let floatingPointNumber = 3.14;
2、字符串

字符串是一系列字符的集合,用于表示文本。字符串可以使用单引号或双引号括起来。

let greeting = 'hello,js';
let message = "hello,js!";
3、布尔

布尔类型只有两个值:true 和 false。它用于表示逻辑状态,条件判断的结果通常是布尔值。

let  flag = true;
let flag = false;
4、对象

对象是一种复杂的数据类型,它可以存储键值对。对象用于表示实体或复杂的数据结构。

let person ={
name :"jack",
age:12,
job:"deveploper"
}
5、数组

数组是一种有序的集合,可以包含不同类型的数据。数组用于存储和访问多个值。

let color =["red","green"];
let number = [2,22,34];
6、undefined和null

undefined 表示一个未定义的值,而 null 表示一个空值。它们通常用于表示缺失或不存在的数据。

let undefinedValue;
let nullValue;
7、typeof操作符

typeof 操作符用于检查变量或值的数据类型。它返回一个字符串,表示相应的数据类型。

console.log(typeof 42)
Javascript中的类
1.类(Class)

类是一种蓝图或模板,用于创建对象。在ES6(ECMAScript 2015)及以后的版本中,JavaScript引入了类的语法,使得对象的创建更加清晰和易于管理。

class Person {  
  // 类体  
}
2. 构造器(Constructor)

构造器是一个特殊的方法,用于在创建对象时初始化对象。在类中,构造器名为constructor。当使用new关键字创建类的实例时,会自动调用构造器。

class Person{
constructor(name,age){
this.name = name;
this.age = age;
}
}
const person = new Person('Alice',30);
console.log(person.name);
console.log(person.age);
3. 类属性(Class Properties)

在ES2020(ES11)之前,类属性只能在构造器内部定义。但从ES2020开始,你可以在类体中直接定义属性。

class Person {  
  name = 'Unknown'; // 类属性  
  
  constructor(age) {  
    this.age = age;  
  }  
}  
  
const person = new Person(25);  
console.log(person.name); // 输出: Unknown  
console.log(person.age); // 输出: 25
4. 类私有属性(Class Private Fields)

私有属性是ES2020(ES11)中引入的一个新特性,允许你在类内部定义只能被类内部方法访问的属性。私有属性通过在属性名前加上#符号来标识。

class Person {  
  #name; // 私有属性  
  
  constructor(name, age) {  
    this.#name = name; // 只能在类内部访问和修改  
    this.age = age;  
  }  
  
  getName() {  
    return this.#name; // 可以在类的方法中访问  
  }  
}  
  
const person = new Person('Bob', 35);  
console.log(person.getName()); // 输出: Bob  
// console.log(person.#name); // 语法错误,外部无法访问私有属性
5. 方法(Methods)

方法是定义在类中的函数,用于执行特定的操作。它们可以访问和修改类的属性。

class Person {  
  constructor(name) {  
    this.name = name;  
  }  
  
  greet() {  
    console.log(`Hello, my name is ${this.name}!`);  
  }  
}  
  
const person = new Person('Charlie');  
person.greet(); // 输出: Hello, my name is Charlie!
6. 静态方法(Static Methods)

静态方法是定义在类上而不是类的实例上的方法。它们通过类本身来调用,而不是类的实例。静态方法不能访问类的实例属性,但可以访问其他静态属性和方法。

class MathUtils {  
  static sum(a, b) {  
    return a + b;  
  }  
}  
  
console.log(MathUtils.sum(2, 3)); // 输出: 5  
// 注意:静态方法不能通过类的实例来调用  
// const utils = new MathUtils();  
// console.log(utils.sum(2, 3)); // 这将不会工作,因为sum是静态的
7. this 关键字

在类中,this关键字用于引用当前对象的实例。在构造器、方法或计算属性中,this指向调用它们的对象实例。

class Person {  
  constructor(name) {  
    this.name = name; // this指向新创建的Person实例  
  }  
  
  greet() {  
    console.log(`Hello, my name is ${this.name}!`); // this指向调用greet方法的Person实例  
  }  
}  
  
const person = new Person('Charlie');  
person.greet(); // 输出: Hello, my name is Charlie!
JavaScript的变量声明var、let、const
一、var

使用var定义变量,可以保存任何类型的值。若不初始化变量,变量会保存undefined。

1.1函数级作用域

使用var定义的变量会成为包含它的函数的局部变量。

function func() {
    var a = 'hi'; // 局部变量
}
func();
console.log(a); // ReferenceError: a is not defined

变量a在函数内部使用var定义,调用函数func,会创建这个变量并给它赋值。函数执行结束后,变量就会被销毁,所以上述代码最后一行会报错,显示变量a未定义。

若在函数内部,不使用var操作符,直接给变量a赋值,那么a就成为了全局变量,可以在函数外部访问到。在浏览器环境下,a成为window对象的属性。

function func() {
    a = 'hi'; // 全局
}
func();
console.log(a); // hi
console.log(window.a); // hi
console.log(window.a === a); // true

1.2 变量提升

使用var声明变量,会自动提升到函数作用域顶部,如下代码:

function func() {
    console.log(a);
    var a = 1;
}
func(); // undefined

代码没有报错,输出了undefined,这是因为变量的声明被提升到了函数作用域顶部,等价于如下代码:

function func() {
    var a;
    console.log(a);
    a = 1;
}
func(); // undefined

1.3 重复声明

另外,使用var重复声明同一个变量也可以:

function func() {
    var a = 1;
    var a = 2;
    var a = 3;
    console.log(a);
}
func(); // 3

1.4 全局变量挂载到 window

浏览器环境中,全局作用域下,使用var声明的变量,会挂载到window对象上。

var a = 1;
console.log(window.a === a); // true

二、let

let也可以声明变量,但和var操作符有很大的区别。

2.1 块级作用域

以下代码会报错,因为let声明的作用域,具有块级作用域,即被{}包裹的部分。

if (true) {
    let a = 10;
}
console.log(a); // a is not defined

2.2 不可重复声明

以下代码,执行到let a = 2就会报错,因为变量a在当前块级作用域中已经被声明过了,不能重复声明。

if (true) {
    let a = 1;
    let a = 2; // SyntaxError: Identifier 'a' has already been declared
    let a = 3;
}

另外,如果混用var和let声明变量,也是不允许的,下面的代码都会报错:

let a;
var a; // 报错
var a;
let a; // 报错

2.3 不存在变量提升(暂时性锁区)

使用let声明的变量,不能在声明之前访问它。

if (true) {
    console.log(a); // ReferenceError: Cannot access 'a' before initialization
    let a = 1;
}

2.4 全局变量不会挂载到 window
var a = 1;
let b = 2;
console.log(window.a === a); // true
console.log(window.b === b); // false
2.5 不依赖条件声明
if (typeof name === 'undefined') {
    let name;
}
// name 被限制在 if {} 块的作用域内
name = 'Matt'; // 全局赋值

try {
    console.log(age); // 如果 age 没有声明过,则会报错
} catch (error) {
    let age;
}
// age 被限制在 catch {}块的作用域内
age = 26; // 全局赋值

三、 const

const的特点与let基本一致,但const有一些自己的特点。

3.1 声明变量时必须同时初始化

以下声明报错,因为声明的同时没有初始化变量。

const a; // Missing initializer in const declaration

3.2 不能修改声明后的变量

使用const定义了一个变量后,不能再更改它的值:

const a = 1;
a = 2; // TypeError: Assignment to constant variable

这里有一个误区,实际上,使用const声明的变量,不能修改的是内存地址!!

具体规则如下:

当const定义的常量为基本数据类型时,不能被修改。
当const定义的常量为引用数据类型时,可以通过其属性进行数据修改。
基本数据类型的值就保存在内存地址中,所以const定义的基础数据类型不可被改变。 而引用数据类型指向的内存地址只是一个指针,通过指针来指向实际数据,也就是说,不可被改变的是指针,而不是数据,所以const定义的引用数据类型的常量可以通过属性来修改其数据。
例如,使用const定义了一个数组,虽然不能更改数据类型,但可以通过push等方法,修改这个数组中的数据。

const arr = [];
arr.push(1, 2, 3);
console.log(arr); // [ 1, 2, 3 ]

总结及最佳实践

在这里插入图片描述
通常,写 JavaScript 代码时,遵循以下原则:
不使用var,const优先,let次之。


http://www.kler.cn/a/421944.html

相关文章:

  • C++ 游戏开发入门
  • Python将Excel文件转换为JSON文件
  • 真实情景之:处理用户密码时的“加盐”措施
  • 基于 MVC 的 SpringBoot 高校行政事务管理系统:设计布局与实现效能评估
  • 泷羽sec学习打卡-shell命令5
  • 面向对象(二)——类和对象(上)
  • DevOps工程技术价值流:GitLab源码管理与提交流水线实践
  • 计算机网络-Wireshark探索IPv4
  • C# 元组
  • 外卖开发(三)开发笔记——AOP实现实现公共字段填充、主键回显、抛异常和事务管理
  • Matlab图像处理——基于内容的图像检索GUI
  • 基于云模型的车辆行驶速度估计算法matlab仿真
  • 【C++】数组
  • jmeter 获取唯一全局变量及多线程读写的问题
  • JavaScript实现tab栏切换
  • 从零开始搭建图像去雾神经网络
  • React基础知识三 router路由全指南
  • springboot/ssm高校线上心理咨询室系统Java大学生心理健康咨询平台web源码
  • 用micropython 操作stm32f4单片机的定时器实现蜂鸣器驱动
  • 【数据结构】队列的概念、结构和实现详解