【第2章 Node.js基础】2.1 JavaScript基本语法

文章目录

    • 学习目标
    • JavaScript版本与JavaScript运行环境
      • JavaScript版本
      • JavaScript运行环境
    • JavaScript语句与注释
      • 语句
      • 语句块
      • 注释
    • 变量
      • 变量的命名
      • 变量的声明与赋值
      • 变量提升
      • 变量泄露
      • 全局作用域和函数作用域
      • 块级作用域与let关键字
      • 使用const关键字声明只读常量
        • 注意
    • 数据类型
      • 数值(Number)
      • 字符串(String)
      • 布尔值(Boolean)
      • null和undefined
      • 数组(Array)
      • 对象(Object)
      • 符号(Symbol)
      • 映射(Map)
      • 集合(Set)
    • 流程控制
      • 分支结构
      • 循环结构
    • JavaScript的函数
      • 函数声明
      • 函数调用
      • arguments对象
      • rest参数
      • 匿名函数
      • 箭头函数
      • 高阶函数
      • 闭包
    • JavaScript的类
      • ES5通过构造函数生成实例对象
      • ES6引入类作为对象的模板,通过class关键字定义类
    • 严格模式
    • JavaScript编程规范
      • 代码格式
      • 命名规范
      • 函数
      • 注释

学习目标

(1)了解JavaScript的基本语法;
(2)能读懂JavaScript代码。

JavaScript版本与JavaScript运行环境

JavaScript版本

  • ECMA组织制定了JavaScript语言的标准——ECMAScript(简称ES) 。
  • 大多数场合使用JavaScript名称,可将JavaScript看作是ES标准的实现语言。
  • 主要版本:
    • 2009年——ES5;
    • 2015年——ES6(ES2015);
    • ES7( ES2016 )、ES8( ES2017 )、ES9( ES2018 )和ES10( ES2019 )。
  • ES6是目前的主流版本,Node.js自6.0版本开始全面支持ES6。
  • Node.js自7.6版本开始就默认支持async/await异步编程。

JavaScript运行环境

  • Node.js REPL交互式运行环境
    在这里插入图片描述

  • 浏览器控制台
    在这里插入图片描述

JavaScript语句与注释

语句

  • JavaScript每条语句都以分号;结束。
  • 一行代码可包含多条语句。
  • 一行语句太长,则可以使用续行符\进行换行。

语句块

  • 语句块是一组语句的集合,作为一个整体使用大括号“{}”封装。
  • 语句块可以嵌套,形成层级结构。

注释

行注释

// 我是单独一行注释
alert('Hello World'); // 我是句尾的行注释

块注释

/* 我要开始注释啦
我要结束注释啦*/

变量

变量的命名

  • JavaScript的变量可以是任意数据类型。
  • 变量名可以是大小写英文字母、数字、符号“$”或“_”的任意组合,但不能以数字开头。

变量的声明与赋值

  • 弱类型的编程语言,所有数据类型都可以用var关键字声明。在定义变量时无须指定变量类型。
var hello; // 声明一个名为hello的变量,此时该变量的值为undefined,表示未定义
  • 使用等号对变量进行赋值,可以将任意数据类型赋值给变量。
  hello='我是个字符串'; //此时变量的值为“我是个字符串”
  • 可以在声明变量的同时对变量进行赋值。
var name = "法外狂徒-张三";
  • 可以反复赋值同一个变量。

变量提升

  • 变量可以在声明之前使用,值为undefined。
console.log(temp);// 返回undefined
 var temp = '你好';
  • ES6用let关键字改变这种行为,变量一定要在声明之后使用。否则报错;
    在这里插入图片描述

变量泄露

  • 用来计数的循环变量使用var关键字声明后会泄露为全局变量。
    var temp = 'Hello!';
    for (var i = 0; i < temp.length; i++) {
        console.log(temp[i]);
    }
   console.log(i); // 返回数字6,泄露为全局变量了。
  • 改用let关键字来声明循环变量避免变量泄露。
 var temp = 'Hello!';
    for (let i = 0; i < temp.length; i++) {
        console.log(temp[i]);
    }
   console.log(i); // 报错未定义,没有泄露

在这里插入图片描述

全局作用域和函数作用域

ES5中只有全局作用域(顶层作用域)和函数作用域。

var temp = '你好!';//全局作用域
function testScope() {
    var temp = '早上好!'; //函数作用域
    console.log(temp);
}
testScope(); //返回函数作用域中的“早上好”!
console.log(temp); //返回全局变量的“你好”!

块级作用域与let关键字

ES6引入块级作用域,使用let关键字声明的变量只能在当前块级作用域中使用。

function testBlockScope() {
    let name = '小明';
    if (true) {
        let name = '小红';
        console.log(name); // 返回“小红”
    }
    console.log(name); // 返回“小明”
}

使用const关键字声明只读常量

ES6引入const关键字声明只读的常量。

const PI = 3.14159;
console.log(PI); // 输出: 3.14159

PI = 3.14; // 报错: TypeError: Assignment to constant variable.
注意

需要注意的是,const关键字确实可以用于声明只读的常量,但对于对象来说,const并不表示对象本身是不可变的,而是表示对象的引用是不可变的。

当使用const声明一个对象时,你不能再将该常量指向其他对象,但你仍然可以修改对象本身的属性值。

const person = {
  name: "John",
  age: 30
};

person.age = 31; // 可以修改对象的属性值
console.log(person); // 输出: { name: "John", age: 31 }

person = {}; // 报错: TypeError: Assignment to constant variable.

数据类型

数值(Number)、字符串(String)、布尔值(Boolean)、null和undefined、数组(Array)、对象(Object)、符号(Symbol)、映射(Map)、集合(Set)

数值(Number)

  • 不区分整数和浮点数,统一用数值表示。
  • 十六进制数使用0x作为前缀。二进制和八进制数值分别使用前缀0b(或0B)和0o(或0O)。
  • 无法计算结果时就可用NaN表示;Infinity表示无限大。

字符串(String)

  • 字符串是用单引号“'”或双引号“"”括起来的任意文本。
  • ES6提供模板字符串,可使用反引号包括整个模板字符串,使用${}将变量括起来。
var msg = `服务器侦听监听地址和端口:${srvip}:${port},请注意!`;
  • 模板字符串中也可以不嵌入任何变量,通常用于按实际格式输出(如换行)。

布尔值(Boolean)

  • 布尔值只有true、false两种,经常用于条件判断中。
  • 在比较是否相等时,建议使用=== 而不要使用 ==

null和undefined

  • null表示一个空值,即什么也没有。
  • undefined表示“未定义”,仅用于判断函数参数是否正常传递。

数组(Array)

  • JavaScript的数组可以包括任意数据类型。
  • 数组用[]表示,元素之间用逗号分隔。
  • 数组的元素可以通过索引来访问,注意索引的起始值为0。

对象(Object)

  • 对象是一组由键值对组成的无序集合,用{}表示,键值对之间用逗号分隔。
var myObj = {
  isobj: true,
  num: [1,2,3],
  desp: '对象好像可以无所不包'
};
  • 键均为字符串类型,而值可以是任意数据类型。
  • 获取一个对象的属性可用“对象名.属性(键)名”的方式。
  • ES6允许将表达式作为对象的属性名,即把表达式放在方括号内。
let numproperty = 'num';
var myObj = {
    [numproperty]: [1,2,3],
  ['des'+'cription']: '我是个对象'
};

符号(Symbol)

  • ES6引入数据类型Symbol,用于表示独一无二的值,其值通过Symbol()函数自动生成。
  • Symbol值用于对象的属性名,可以有3种表示方法。
let welcome = Symbol();//自动产生一个值
// 第1种表示方法
let myObj = {};
myObj[welcome] = '欢迎光临';
// 第2种表示方法
let myObj = { [welcome]: '欢迎光临' };
// 第3种表示方法
let myObj = {};
Object.defineProperty(myObj, welcome, { value: '欢迎光临' });

映射(Map)

  • ES6引入Map数据结构,与对象类似,但各种类型的数据(甚至对象)都可以作为键。
  • Map本身是一个构造函数,用于生成Map数据结构。
 const myMap = new Map();
  • 可以使用Map结构的set方法添加成员
const myObj = {welcome: '欢迎光临'};
myMap.set(myObj,'我是一个对象');
  • 使用Map结构的get方法读取键(成员)
myMap.get(myObj);  //结果为'我是一个对象
  • Map结构的实例支持遍历方法。
    • keys():返回键名的遍历器。
    • values():返回键值的遍历器。
    • entries():返回键值对的遍历器。
    • forEach():使用回调函数遍历每个成员。

集合(Set)

  • 集合是无重复的、无序的数据结构,类似于数组,即没有重复的值。
  • 集合是一个构造函数,用于生成Set数据结构。
const mySet = new Set();
  • 可以通过add()方法向Set结构加入成员。
  • Set()函数可将Iterable类型的数据结构(数组、集合或映射)作为参数,用于初始化集合。
const mySet = new Set([1, 2, 3, 4, 4]);//会自动过滤掉其中一个数字4
  • Set结构中的元素可以看作是键,与Map结构不同的是,它只有键名没有键值。
  • Set结构使用与Map结构相同的4种遍历方法来遍历成员。

遍历数组可以采用下标循环,而遍历映射和集合就无法使用下标。为了统一集合类型,ES6引入了新的Iterable类型,数组、映射和集合都属于Iterable类型。这种类型的集合可以通过新的for … of循环来遍历。更好的遍历方式是使用Iterable类型内置的forEach方法。

流程控制

分支结构

  • if () { … } else { … }
  • if () { … } else if () { … } else { … }
  • switch … case
 switch(变量)
{
    case1:
           代码1;
           break;
    case2:
           代码2;
           break;
    default:
           如果以上条件都不满足,则执行该代码;
}

循环结构

  • for
  • for … in
 for (var key in obj) {
    console.log(key); 
}
  • while
  • do … While
  • break
  • continue

循环结构中的条件需使用括号括起。

JavaScript的函数

函数声明

  • 声明函数需要使用function关键字。
 function sumAge(x,y) {
    return  x + y;
}
  • ES6直接支持默认参数
sumAge(x=19,y=20)
  • 在ES5中设置默认参数需要采用变通的方法
function sumAge (x,y) {
    x = arguments[0]===undefined ? 21 : arguments[0]; //设置参数x的默认值为21
    y = arguments[1]===undefined ? 20 : arguments[1]; //设置参数y的默认值为20
    return  x + y;
}

函数调用

  • 声明函数之后使用“函数名(参数)”的形式,按顺序传入参数进行调用。
sumAge(22,20)//两人加起来42岁

arguments对象

  • JavaScript的函数默认带有arguments对象,利用该对象可以获得调用者传入的所有参数。
function sumAge (){
    var sum = 0;
    var numcount= arguments.length
    for (var i=0;i<numcount;i++){
      sum += arguments[i];
    }
    return sum;
}

rest参数

  • ES6引入rest参数(形式为“…变量名”),用于获取函数的多余参数,以代替arguments对象。
function sumAge(...values){
    var  sum = 0;
    for (var val of values){
        sum += val;
    }
    return sum;
}

匿名函数

声明函数时省略函数名。

var sumAge = function (x,y) {
    return  x + y;
};

箭头函数

使用箭头符号(=>)定义函数。

示例箭头函数普通函数
一个参数var f = x => x;var f = function (x) { return x; };
多个参数var sumAge = (x, y) => x + y;var sumAge = function (x, y) { return x + y; };
无参数var f = () => 20;var f = function () { return 20; };
代码块包含多条语句var diffAge = (x, y) => { var diff = x - y; return Math.abs(diff); }var diffAge = function (x, y) { var diff = x - y; return Math.abs(diff); };

以上是箭头函数和普通函数在不同情况下的对比示例。箭头函数是ES6中引入的一种更简洁的函数语法,可以更方便地定义函数。与普通函数相比,箭头函数具有更短的语法和更简洁的写法。

高阶函数

以一个或多个函数作为参数的函数。

function diffAge(m, n, abs) {
    return abs(m-n);
}
diffAge(19, 22, Math.abs);

闭包

  • 当函数作为返回值,或者作为参数传递时,该函数就被称为闭包。
  • 闭包是能够读取其他函数内部变量的函数,可以使用函数之外定义的变量。
var basePrice = 10.00;//起步价
var baseMiles = 3.00;        //起步里程
function taxiPrice(unitPrice, Mileage) {
  function totalPrice() {   //计算总费用 ;这是定义在一个函数内部的函数
    if ( Mileage > baseMiles) {   //超过起步里程
      return  unitPrice*Mileage;  //单价与里程相乘
    }
    else{                    //在起步里程内
      return basePrice;
    }
  }
  return totalPrice ();
}
taxiPrice(2.00,6.00);//打车费用12.00

JavaScript的类

ES5通过构造函数生成实例对象

function Visitor(name, sex) {   //来宾信息
    this.name = name;
    this.sex = sex;
}
VisitorPoint.prototype.getInfo = function () {
    return this.name + ', ' + this.sex;
};
var visitor = new Visitor('张勇', '先生');

ES6引入类作为对象的模板,通过class关键字定义类

class Visitor{
  constructor(name, sex) {
    this.name = name;
    this.sex = sex;
  }
  getInfo() {
    return this.name + ', ' + this.sex;
  }
}
var visitor = new Visitor('张勇', '先生');

严格模式

  • 变量必须声明后使用。
  • 不能出现两个命名参数同名的情况,否则报错。
  • 不能使用with语句。
  • 不能对只读属性赋值,否则报错。
  • 不能使用前缀0表示八进制数,否则报错。
  • 不能删除不可删除的属性,否则报错。
  • 不能删除变量,只能删除属性。
  • eval关键字不会在它的外层作用域引入变量。
  • eval和arguments不能被重新赋值。
  • 不能使用arguments.callee和arguments.caller属性。
  • 禁止this关键字指向全局对象。
  • 不能使用fn.caller和fn.arguments属性获取函数调用的堆栈。
  • 增加了保留字(如protected、static和interface)。

JavaScript编程规范

代码格式

  • 每条JavaScript语句应该以分号结束。
  • 缩进使用2个半角空格或4个半角空格,而不使用Tab键。
  • 每行仅声明一个变量,而不要声明多个变量。
  • 字符串尽量使用单引号。
  • 符号“{”应在行末,表示代码块的开始,符号“}”应在行首,表示代码块的结束。

命名规范

  • 变量推荐使用小驼峰命名法。
  • 常量名建议全部大写。
  • 函数也采用小驼峰命名法,建议前缀部分为动词。
  • 类和构造函数采用大驼峰命名法,同时建议前缀部分为名词。
  • 文件命名尽量采用下划线分割单词。

函数

  • 函数的实现代码尽可能短小精悍,便于阅读。
  • 避免多余的else语句,尽早执行return语句。
  • 尽可能为闭包命名,便于调试跟踪。
  • 不要嵌套闭包。
  • 使用方法链时,每行仅调用一个方法,并使用缩进表明方法的并列关系。

注释

  • 注释要尽量简单,清晰明了,同时注重注释的意义。
  • 尽可能从更高层次说明代码的功能。
  • 尽可能使用英文注释。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/121276.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电脑软件:推荐一款电脑多屏幕管理工具DisplayFusion

下载https://download.csdn.net/download/mo3408/88514558 一、软件简介 DisplayFusion是一款多屏幕管理工具&#xff0c;它可以让用户更轻松地管理连接到同一台计算机上的多个显示器。 二、软件功能 2.1 多个任务栏 通过在每个显示器上显示任务栏&#xff0c;让您的窗口管理更…

rabbitMQ rascal/amqplib报错 Error: Unexpected close 排查

以下是一些可能导致此 RabbitMQ 客户端或任何其他 RabbitMQ 客户端中的套接字读取或写入失败的常见场景 1.错过&#xff08;客户端&#xff09;心跳 第一个常见原因是RabbitMQ 检测到心跳丢失。发生这种情况时&#xff0c;RabbitMQ 将添加一个有关它的日志条目&#xff0c;然…

维控PLC——LX2N :编程口通讯协议

文章目录 说明通讯帧通讯命令字通讯数据地址维控 LX2N&#xff08;LX2V&#xff09;通讯协议举例 说明 该协议适用于维控LX2N系列PLC&#xff0c;关于维控 LX1S的协议在另一篇文章中描述。 通讯帧 通讯采用ASCII码&#xff0c;校验方式采用和校验。 请求帧格式:报文开始命令…

Flutter——最详细(AppBar)使用教程

AppBar简介 Material Design 应用栏(标题栏) 使用场景&#xff1a; 顶部标题栏包括一些常用的菜单按钮 属性作用leading左边工具视图automaticallyImplyLeading左边图标的颜色title标题视图actions右边菜单按钮flexibleSpace其高度将与应用栏的整体高度相同bottom左侧底部文本内…

vr航空博物馆综合展馆趣味VR科普体验

第十期广州科普开放日 10月28日周六上午九点半&#xff0c;广州卓远VR科普基地再次迎来一批前来体验的亲子家庭&#xff0c;陆续到达的市民朋友让整个基地都热闹了起来&#xff0c;他们在这里开启了一场别开生面的VR科普体验。 一期一会&#xff0c;趣味VR科普 10月广州科普开放…

Unity3d C#实现编辑器不运行状态下执行的脚本

第一章方式&#xff1a; 函数前面 [ContextMenu("Play")] &#xff0c;Inspector面板右键调用 第二种方式&#xff1a; OnValidate() &#xff0c;值改变自动执行 using UnityEngine; using System.Linq;public class NightController : MonoBehaviour {pub…

蓝桥杯每日一题203.11.7

题目描述 题目分析 使用dp思维&#xff0c;当前位置是否可行是有上一位置推来&#xff0c;计算出最大的可行位置即可 #include <stdio.h> #include <string.h>#define N 256 int f(const char* s1, const char* s2) {int a[N][N];int len1 strlen(s1);int len2 …

Kibana Dashboard饼图展示keyword子字符串去重统计

日志内容 log.info("请求开始 uri: {} header RequestId:{}", request.getRequestURI(), reqId, request.getHeader("request_id"));操作步骤 进入Dashboard菜单 点击Create Dashboard按钮 点击Create Panel按钮 选择Aggregation based 然后选择Pie饼图 …

第十一章《搞懂算法:聚类是怎么回事》笔记

聚类是机器学习中一种重要的无监督算法&#xff0c;可以将数据点归结为一系列的特定组合。归为一类的数据点具有相同的特性&#xff0c;而不同类别的数据点则具有各不相同的属性。 11.1 聚类算法介绍 人们将物理或抽象对象的集合分成由类似 的对象组成的多个类的过程被称为聚…

数字化转型:云表低代码开发助力制造业腾飞

数字化转型已成为制造业不可避免的趋势。为了应对市场快速变化、提高运营效率以及降低成本&#xff0c;制造业企业积极追求更加智能化、敏捷的生产方式。在这个转型过程中&#xff0c;低代码技术作为一种强大的工具&#xff0c;正逐渐崭露头角&#xff0c;有望加速制造业的数字…

高性能网络编程 - The C10M problem

文章目录 Pre概述回顾C10K实现C10M的挑战思路总结 Pre 高性能网络编程 - The C10K problem 以及 网络编程技术角度的解决思路 概述 在接下来的10年里&#xff0c;因为IPv6协议下每个服务器的潜在连接数都是数以百万级的&#xff0c;单机服务器处理数百万的并发连接&#xff0…

Python实用技巧:将 Excel转为PDF

将Excel文件转换为PDF可以方便储存表格数据&#xff0c;此外在打印或共享文档时也能确保表格样式布局等在不同设备和操作系统上保持一致。今天给大家分享一个使用第三方Python库Spire.XLS for Python 实现Excel转PDF的简单方法。 实现步骤 首先&#xff0c;通过pip命令来安装依…

Vue实现面经基础版案例(路由+组件缓存)

一、面经基础版-案例效果分析 1.面经效果演示 2.功能分析 通过演示效果发现&#xff0c;主要的功能页面有两个&#xff0c;一个是列表页&#xff0c;一个是详情页&#xff0c;并且在列表页点击时可以跳转到详情页底部导航可以来回切换&#xff0c;并且切换时&#xff0c;只有…

基于鱼鹰算法的无人机航迹规划-附代码

基于鱼鹰算法的无人机航迹规划 文章目录 基于鱼鹰算法的无人机航迹规划1.鱼鹰搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用鱼鹰算法来优化无人机航迹规划。 1.鱼鹰搜索算法 …

华为数通方向HCIP-DataCom H12-831题库(多选题:141-160)

第141题 项目实施方案主要包含哪些项? A、风险控制措施 B、人员安排 C、时间规划 D、割接流程 答案:ABCD 解析: 项目实施方案主要包括:时间规划、人员安排、割接流程、风险控制措施。 第142题 以下哪些广域网链路属于报文交换网? A、PSIN B、ISDN C、X.25 D、ATM E、MSTP…

工程(十四)——ubuntu20.04 PL-VINS

博主创建了一个科研互助群Q&#xff1a;772356582&#xff0c;欢迎大家加入讨论。这是一个科研互助群&#xff0c;主要围绕机器人&#xff0c;无人驾驶&#xff0c;无人机方面的感知定位&#xff0c;决策规划&#xff0c;以及论文发表经验&#xff0c;以方便大家很好很快的科研…

Node.js中的回调地狱

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

QDockWidget DEMO 动态添加QDockWidget ,无主窗口,禁止tab重叠

效果&#xff1a; 关键代码&#xff1a; 1、删除主窗口&#xff0c;使用QDockWidget替代主窗口 QWidget* p takeCentralWidget();if (p)delete p;setDockNestingEnabled(true);centralWidget new QDockWidget(this);centralWidget->setAllowedAreas(Qt::AllDockWidgetAre…

docker部署es+kibana

es 暴露的端口特别多 &#xff0c;十分耗内存&#xff0c;数据一般要放置到安全目录&#xff0c;挂载 官网推荐的命令&#xff1a;docker run -d --name elasticsearch --net somenetwork -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" elasticsearch…

目标检测标注的时代已经过去了?

在快速发展的机器学习领域&#xff0c;有一个方面一直保持不变&#xff1a;繁琐和耗时的数据标注任务。无论是用于图像分类、目标检测还是语义分割&#xff0c;长期以来人工标记的数据集一直是监督学习的基础。 然而&#xff0c;由于一个创新性的工具 AutoDistill&#xff0c;这…