【H2O2|全栈】JS入门知识(五)

目录

JS

前言

准备工作

数组API(一)

API概念

数组常见API(一)

arguments

作用域

概念

全局作用域

局部作用域

块级作用域

变量的作用域

作用域链

案例

预解析

概念

变量预解析

函数预解析

案例

对象

概念

优点

属性和属性值

创建对象

遍历对象

结束语


JS

前言

本系列博客主要分享JavaScript的基础语法知识,本期为第五期,包含一些简单的js语法。今天的内容主要包括数组的常用API,作用域,变量,预解析以及对象的相关内容。

与HTML和CSS相比,JS加入了很多逻辑性的元素在里面,所以需要一定的逻辑思维能力,要求能够整合一些知识。如果遇到不理解之处,可以参阅同系列之前的章节。

准备工作

软件:【参考版本】Visual Studio Code

插件(扩展包):Open in browser, Live Preview, Live Server, Tencent Cloud AI Code Assistant, htmltagwrap

浏览器版本:Chrome

系统版本: Win10/11/其他非Windows版本

*我的电脑是Win10的版本,仅供参考*

数组API(一)

API概念

API,英文全称为Application Programming Interface,即应用程序编程接口。 

通常来说,API是软件系统中的一组预定义函数、协议或规则,用于不同软件应用程序之间的通信和数据交换

之前我们知道,可以使用  arr.length  调用数组的长度,类似的,我们也可以使用相同的方式调用数组的API。

不过需要注意,API通常为函数或者方法,因此在调用时不要忘记小括号和必要的参数(如果有)。

数组常见API(一)

今天主要来讲部分常用的数组API,先列在表格里——

API作用
splice(index, number)在数组的index位置开始删除number个元素
splice(index, number, content)在数组的index位置开始删除number个元素,并且替换上content的内容
unshift(item)在数组开头增加指定元素
shift()在数组开头删除一个元素
push(item)压栈,即在数组的末尾增加指定元素
pop()弹栈,即在数组的末尾删除一个元素
slice(start, end)从数组中截取指定左闭右开区间(索引)内的元素
arr1.concat(arr2)在指定的数组的末尾拼接另一个数组
join("separator")将数组转化为字符串,并且在元素之间添加分隔符separator
sort()默认升序排序,元素有多个字符时,取数组元素的第一个字符进行排序

sort(function(a, b) {

        return a - b

})

内置匿名函数进行排序,以 a - b 为正值设置升序排序,此时 b - a 为负值,即设置降序排序
reverse()将数组内容翻转

arguments

arguments是一种类数组,它有数组的索引和长度,但是没有数组的API。

在函数中,arguments是默认有的,可以用来接收任意长度的数组。

作用域

概念

通常来说,一段程序代码中所用到的名字并不总是有效和可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。

作用域的使用提高了程序逻辑的局部性,增强了程序的可靠性,减少了名字冲突

在es6之前,JS有两种作用域——全局作用域局部作用域

在es6之后,还有一种作用于 {} 内的作用域——块级作用域

全局作用域

全局作用域指的是所有代码执行的所在的整个环境,通常来说,这个环境是window

局部作用域

局部作用域指的是作用于函数内部的代码环境,所以也可以叫函数作用域。

块级作用域

{} 内定义的某些变量,我们希望它只在 {} 中使用,即在块级作用域里使用。

在es6中,使用let和const声明定义的变量,只能在 {} 中使用。

常见的块级作用域有  if()  for()  等。

变量的作用域

根据作用域的不同,变量可以分为两种——全局变量局部变量

全局变量在代码的任何位置都可以使用,在全局作用域下 var 声明的变量都是全局变量。

特殊情况下,在函数内不使用 var 声明的变量也是全局变量(写法不规范,所以不建议使用)。

局部变量只能在该函数内部使用,在函数内部 var 声明的变量是局部变量。

函数的形参实际上就是一种局部变量。

两类变量的区别是:

  • 全局变量:在任何一个地方都可以使用,只有在浏览器关闭时才会被销毁,因此比较占内存
  • 局部变量:只在函数内部使用,当其所在的代码块被执行时,会被初始化;当代码块运行结束后,就会被销毁,因此更节省内存空间

作用域链

如果函数中还有函数,那么在这个作用域中就又可以诞生一个作用域;

根据在内部函数可以访问外部函数变量的这种机制,用链式查找决定哪些数据能被内部函数访问,就称作作用域链

作用域链的原则为就近原则,即选取最近的元素作为当前使用的元素。

案例

Q:现在,有下面这串代码——

var a = 1;
var b = '11';
function fn1() {
    var a = 2;
    var b = '22';
    fn2();
    function fn2() {
        var a = 3;
        fn3();
        function fn3() {
            var a = 4;
            console.log(a); //a的值 ?
            console.log(b); //b的值 ?
        }
    }
}
fn1();

请问输出的a和b的值是多少?

A:我们使用一张图来分析上述代码的作用域链——

所以,输出应当是4和'22'。

Q:对于下面的代码,输出的值应当是多少?

var a = 10

function fn1() {
    var a = 20
    fn2()
}

function fn2() {
    console.log(a)
}

A:对于  fn2()  而言,虽然它在  fn1()  中被调用了,但是实际上它是被声明在全局中的,所以作用域是window,因此输出值为10。

预解析

概念

JavaScript 代码是由浏览器中的 JavaScript 解析器来执行的。

JavaScript 解析器在运行 JavaScript 代码的时候分为两步:预解析代码执行

  • 预解析:在当前作用域下, JS 代码执行之前,浏览器会默认把带有 var 和 function 声明的变量在内存中进行提前声明或者定义,预解析也叫做变量提升函数提升
  • 代码执行: 从上到下执行JS语句。

注意:预解析会把变量和函数的声明在代码执行之前执行完成。

变量预解析

变量的声明会被提升到当前作用域的最上面,变量的赋值不会提升

函数预解析

函数的声明会被提升到当前作用域的最上面,但是不会调用函数。

案例

Q:对于下面的代码,输出的结果是什么?

console.log(num)
var num = 10

fn1()
function fn1() {
    console.log('打印')
}

fn2()
var fn2 = function() {
    console.log('想不到吧')
}

A:由于变量的值不会提升,所以第一个是默认var num但是未赋值,结果为输出undefined

由于命名函数可以提升,相当于在fn1()之前实质上已经声明函数并在该语句完成调用,结果为输出打印

匿名函数相当于变量,该段代码执行之前,会做变量声明提升,fn在提升之后的值是undefined;而fn调用是在fn被赋值为函数体之前,此时fn的值是undefined,所以无法正确调用,结果为报错 fn is not a function

对象

概念

在 JavaScript 中,对象是一组无序的相关属性方法的集合,所有的事物都是对象,例如字符串、数值、数组、函数等。

  • 属性:事物的特征,在对象中用属性来表示(常用名词表示)
  • 方法:事物的行为,在对象中用方法(函数)来表示(常用动词表示)

以一部手机为对象,那么它的属性和方法应当是——

优点

保存一个值时,可以使用变量,保存多个值(一组值)时,可以使用数组。

如果要保存一个人的完整信息呢?

例如,将“张三”的个人的信息保存在数组中的方式为——

var arr = [‘张三’, ‘男', 128, 154]

上述例子中用数组保存数据的缺点是:数据只能通过索引值访问,开发者需要清晰的清除所有的数据的排行才能准确地获取数据,而当数据量庞大时,不可能做到记忆所有数据的索引值。

为了让更好地存储一组数据,对象应运而生:对象中为每项数据设置了属性名称,可以访问数据更语义化,数据结构清晰,表意明显,方便开发者使用。

如果使用对象来表述上述信息,应当如下——

var obj = {
    "name":"张三",
    "sex":"男",
    "age":128,
    "height":154
}

属性和属性值

对象中包含了表达这个具体事物(对象)的属性和方法,采取键值对的形式表示。

  • 键:相当于属性名,即对象中存储具体数据的项
  • 值:相当于属性值,可以是任意类型的值(数字类型、字符串类型、布尔类型,函数类型等),对象方法即对象中存储函数的项

比如,之前在为张三设置名字属性时,使用的就是下面的键值对——

name: "张三",

这里也给一个值为函数的情况吧——

sayHello : function(){
        alert('大家好啊~');
    }

访问对象的属性

  • 对象里面的属性调用 : 对象.属性名 ,这个小点 . 就理解为“ 的 ”
  • 对象里面属性的另一种调用方式 : 对象[‘属性名’],注意方括号里面的属性必须加引号 

示例代码如下——

console.log(obj.name)     // 调用名字属性
console.log(obj['name'])  // 调用名字属性

调用对象的方法

  • 对象里面的方法调用:对象.方法名() ,注意这个方法名字后面一定加括号
  • 也可以利用函数名调用

示例代码如下——

obj.fn()
obj["fn"]()

小结

属性是对象的一部分,而变量不是对象的一部分,变量是单独存储数据的容器

  • 变量:单独声明赋值,单独存在
  • 属性:对象里面的变量称为属性,不需要声明

方法是对象的一部分,函数是单独封装操作的容器

  • 函数:单独存在的,通过“函数名()”的方式就可以调用
  • 方法:对象里面的函数称为方法,方法不需要声明,使用“对象.方法名()”的方式就可以调用 

创建对象

创建对象通常来说有三种方式——字面量new构造函数

使用字面量创建

使用字面量创建的参考代码如下——

var obj1 = {}

这种方式在创建时即可添加属性和属性值,示例代码如下——

var obj = {
    name : 'pink',
    age : 18,
    sex : '男',
    sayHello : function(){
        alert('大家好啊~');
    }
};

使用new Object()创建

该方式用于创建一个空的对象,参考代码如下——

var obj2 = new Object();

实质上,Object()内置了一个构造函数,利用构造函数创建了一个新对象。

为该方法创建的对象赋值的方法示例如下——

obj2.name = 'pink';
obj2.age = 18;
obj2.sex = '男';
obj2.sayHello = function(){
    alert('大家好啊~');
}

注意以下三个要点:

  • Object() :第一个字母大写
  • new Object() :需要 new 关键字
  • 使用的格式:对象.属性 =  值;

使用构造函数创建

构造函数:是一种特殊的函数,主要用来初始化对象,即为对象成员变量赋初始值,它总与 new 运算符一起使用。我们可以把对象中一些公共的属性和方法抽取出来,然后封装到这个函数里面。

使用构造函数的封装格式如下——

function 构造函数名(形参1,形参2,形参3) {
     this.属性名1 = 参数1;
     this.属性名2 = 参数2;
     this.属性名3 = 参数3;
     this.方法名 = 函数体;
}

使用构造函数调用的参考代码如下——

var obj3 = new 构造函数名(实参1,实参2,实参3)

以上代码中,obj即接收到构造函数创建出来的对象。

注意事项

  • 构造函数约定首字母大写
  • 函数内的属性和方法前面需要添加 this ,表示当前对象的属性和方法。
  • 构造函数中不需要 return 返回结果
  • 当我们创建对象的时候,必须用 new 来调用构造函数
  • 构造函数,如 Stars(),抽象了对象的公共部分,封装到了函数里面,它泛指某一大类(class);创建对象,如 new Stars(),特指某一个,通过 new 关键字创建对象的过程我们也称为对象实例化 

new关键字的作用

  • 在构造函数代码开始执行之前,创建一个空对象;
  • 修改this的指向,把this指向创建出来的空对象;
  • 执行函数的代码
  • 在函数完成之后,返回this---即创建出来的对象  

遍历对象

for...in 语句用于对数组或者对象的属性进行循环操作。

示例代码如下——

for (变量 in 对象名字) {
    // 在此执行代码
}

语法中的变量是自定义的,它需要符合命名规范,通常我们会将这个变量写为 k 或者 key

遍历对象获取属性和属性值的示例代码如下——

for (var k in obj) {
    console.log(k);      // 这里的 k 是属性名
    console.log(obj[k]); // 这里的 obj[k] 是属性值
}

扩充知识

我们知道,数组实质上也是一种对象,所以我们也可以用相同的 for ... in 方式对数组进行遍历——

for (var i in arr) {
    console.log(arr[i])
}

此时的i是索引值

此外,我们还可以使用 for ... of 方式对数组进行遍历——

for (var item in arr) {
    console.log(item)
}

此时的item是数组中的元素

结束语

本期的内容到这里就结束了,主要是js的数组的常用API,作用域,预解析以及对象的相关内容。在后续的本系列博客中,我会继续更新js的基础语法知识,并适当地配合上一些案例。

在全栈领域,博主也只不过是一个普通的萌新而已。本系列的博客主要是记录一下自己学习的一些经历,然后把自己领悟到的一些东西总结一下,分享给大家。

文章全篇的操作过程都是笔者亲自操作完成的,一些定义性的文字加入了笔者自己的很多理解在里面,所以仅供参考。如果有说的不对的地方,还请谅解。

==期待与你在下一期博客中再次相遇==

——还在漏气的【H2O2】

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

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

相关文章

MySQL 异常: “Host ‘xxx‘ is not allowed to connect to this MySQL server“

update user set host % where user root; FLUSH PRIVILEGES; 这两行代码就行

Mysql 和MongoDB用户访问权限问题

Mysql 刚给二线运维排查了一个问题,Mysql安装完可用,且可用navicat连接,项目中通过127.0.0.1去连数据库报错了。错误是access denied for user ‘root’localhost,排查思路 1. 密码是否正确 (不需要重置。到Mysql的安装目录下找…

开发规范 - mac系统1小时装机极速装机开发环境

idea 官网下载,然后想办法破解 idea必备配置 设置自动import IDEA插件安装 idea必备插件 maven helperlombokMybatisX jdk配置 jdk不用单配配置,在idea中,选择一个语言环境(jdk8/jdk11/jdk17…),然后默认下载j…

picgo的gitee图床配置

首先picgo默认没有gitee,需要装插件 然后gitee

每月洞察:App Store 和 Google Play 的主要更新

Google Play 和 App Store 的算法不断发展,定期更新和变化会显着影响其功能。对于开发人员和营销人员来说,跟上这些变化至关重要,因为它们会直接影响应用发现和排名。 本文将深入探讨 Google Play 和 App Store 的最新更新,解释它…

浏览器实时更新esp32-c3 Supermini http server 数据

一利用此程序的思路就可以用浏览器显示esp32 采集的各种传感器的数据,也可以去控制各种传感器。省去编写针对各系统的app. 图片 1.浏览器每隔1秒更新一次数据 2.现在更新的是开机数据,运用此程序,可以实时显示各种传感器的实时数据 3.es…

关于pdf合并的七个方法,一键批量合并PDF文档,几步搞定!

pdf是一个支持跨平台使用的兼容性极高的文件格式,同时也是我们日常工作中经常接触到的格式之一。然后,在整理大量pdf格式文件时,如果想要将多个pdf合并成一个应该如何实现呢? 其实pdf合并的方法有很多,如果想要快速对p…

Vue request请求拦截 全局拦截Promise后 api请求捕获异常catch

request.js全局拦截响应结果 else if (res.code 40012) { // 权限不足Message({message: res.msg || Error,type: error,duration: 3 * 1000})return Promise.reject(new Error(res.msg || Error))} api请求后加catch捕获异常 sysUserApi.disableById(row.userId).then(re…

边缘计算与联邦学习:探索隐私保护和高效数据处理的结合

个人主页:chian-ocean 文章专栏 边缘计算与联邦学习:探索隐私保护和高效数据处理的结合 1. 引言 随着物联网(IoT)设备的普及,网络边缘产生了大量数据。将这些数据上传至云端进行集中式计算和处理,既有隐私泄露的风险&#xff…

Python编程基础入门:从风格到数据类型再到表达式

前期已经详细介绍了环境搭建:PycharmPython、VsCodePython Python编程基础入门:从风格到数据类型再到表达式 在编写Python程序时,理解其基础结构和语法是每个初学者的必修课。这篇文章将带你深入了解Python的基本编程风格、数据类型、类型转…

consumer 角度讲一下i2c外设

往期内容 I2C子系统专栏: I2C(IIC)协议讲解-CSDN博客SMBus 协议详解-CSDN博客I2C相关结构体讲解:i2c_adapter、i2c_algorithm、i2c_msg-CSDN博客内核提供的通用I2C设备驱动I2c-dev.c分析:注册篇内核提供的通用I2C设备驱动I2C-dev.…

02篇 机械考研复试简历保姆级教程,考研简历联系导师邮件复试调剂超全攻略 导师喜欢看到的简历(附模板)

考研复试简历怎么写?导师喜欢看到的简历(附模板) 复试简历,重要程度max!绝非小事一桩!它就像是你硬核经历的闪亮外衣,条理清晰、逻辑严谨且设计感十足,一定能在导师心中留下深刻印象…

【新专栏】Excel数据分析与模拟决策-送完整电子版内容

专栏入口:Excel数据分析与模拟决策 购买专栏,即送对应完整版电子书及配套的Excel文件。

【学习笔记】网络设备(华为交换机)基础知识 9 —— 堆叠配置

提示:学习华为交换机堆叠配置,含堆叠的概念、功能、角色、ID和优先级;堆叠的建立过程以及注意事项;包含堆叠的配置命令,以及堆叠的配置案例 一、前期准备 1.已经可以正常访问交换机的命令行接口 Console口本地访问教…

逻辑移位的学习

逻辑移位(Logical Shift)是计算机科学中的一种位移操作,它用于将二进制数的位向左或向右移动。逻辑移位的特点是,无论是左移还是右移,移出边界的位都被丢弃,并用零填充空缺的位。逻辑移位适用于无符号数的处…

【C语言】文件操作(2)(文件缓冲区和随机读取函数)

文章目录 一、文件的随机读取函数1.fseek函数2.ftell函数3.rewind函数 二、文件读取结束的判断1.被错误使用的feof2.判断文件读取结束的方法3.判断文件结束的原因feofferror判断文件读取结束原因示例 三、文件缓冲区 一、文件的随机读取函数 在上一篇的文章中,我们讲…

算法笔记day07

1.最长回文子串 最长回文子串_牛客题霸_牛客网 算法思路: 使用中心扩散算法,枚举所有的中点,向两边扩散,一个中点需要枚举两次,一次当回文串是奇数另一次回文串是偶数的情况。 class Solution { public:int getLong…

JRT怎么从IRIS切换到PostGreSql库

1.执行M导出得到建库脚本文件 2.下载生成的脚本到本地D盘 3.修改驱动为PostGreSql 4.修改连接串 5.到PostGreSql里面创建一个jrtlis的数据库,模式为jrt 6.启动网站点击导入脚本按钮 导入完成了就可以正常使用PostGreSql库了

Linux 进程终止和进程等待

目录 0.前言 1. 进程终止 1.1 进程退出的场景 1.2 进程常见退出方法 1.2.1 正常退出 1.2.2 异常退出 2. 进程等待 2.1 进程等待的重要性 2.2 进程等待的方法 2.2.1 wait() 方法 2.2.2 waitpid() 方法 2.3 获取子进程 status 2.4 阻塞等待和非阻塞等待 2.4.1 阻塞等待 2.4.2 非阻…

萤石联名朱炳仁・铜推出“萤石・国礼大师”AI智能锁 共襄美好家生活

引言:当前,文化与科技正以前所未有的紧密程度相互融合,以人工智能为代表的智能科技的强势介入正推动非遗文化实现从创意策划、生产制造、传播方式乃至保存模式的全面革新,孕育着无限可能。 另一方面,当下智能锁行业竞…