JS的基本内容

ops/2024/9/23 3:08:48/

JS中的六中数据类型字符型,数值型,布尔型,Null,undefined和对象Object:符合数据类型,对象是属性和方法的集合甚至是另一种类型的对象。

基本数据类型数值、字符串、null、undefined、布尔(es6:BigInt ,Symbol)

(对于基本数据类型参与运算它的值本身是不能被修改的)

引用数据类型对象、数组、函数 (object,array,function,data,regExp规则)

基本数据类型和引用数据类型的区别:

声明变量时的存储分配【

原始值存储在栈中的简单数据段,它们的值直接存储在变量访问的位置;(将原始值的变量复制给另一个变量时,会将原始值的副本赋值给新变量但是完全独立的拥有相同的值

引用值存储在堆中对象存储在变量处的值是一个指针,指向存储对象的内存地址。(将一个保存着对象内存地址的变量复制给另一个变量时,会把这个内存地址赋值给新变量,也就是这两个变量都指向了堆内存中同一个对象,它们中任何一个做的改变都会反映在另一个变量)

不同的内存分配机制也带来了不同的访问机制:js中不允许直接访问保存在堆内存中的对象,所以我们访问一个对象时,首先得到是这个对象在的内存地址,然后按照这个地址获取这个对象的值,这个也就是所说的按引用访问,而原始类型的值可以直接访问到的

JS变量的定义统一使用var声明,会在需要的时候自动转型,可以先声明然后赋值通常以;号结尾这是个好习惯。

作用域:执行环境中变量或函数的作用范围分为三类:

全局作用域页面打开时创建关闭时销毁

编写在Script标签中的变量和函数在页面的任何位置都可以访问

全局作用域可以被认为是window,因为所有的全集变量和函数都是作为window对象的属性和方法创建的。

局部(函数)作用域:调用时创建,执行完毕销毁,每调用一次创建一个新的,它们之间互不干扰。函数可以访问上层定义的内容但是相邻函数作用域是相互独立的。

ES6之前没有块级作用域是指:定义的对象是全局的windows可查

eg: if (ture){var a =1}console.log(a)能在检测到a的值为1

但是ES6中的话 if(true){let x=1}console.log(x)这种情况是全局访问不了x的值的。

作用域链带scope用途是保证对着执行环境有权访问的所有变量和函数的有序访问。

关于作用域链主要就是进行标识符的查询(变量和函数)标识符的解析就是沿着作用域一级一级的搜索标识符的过程。如果自身作用域中声明该变量就不用使用作用域链

JS的预编译:

预编译是在上下文创建之后js代码执行前的一段时期,在这个时期,会对Js代码进行预处理。全局创建之后会生成会生成变量对象VO,首先寻找变量说明,将var声明的变量作为VO的对象的属性名,值为undefined.然后找函数声明,属性值为函数本身,如果函数名与变量名冲突,函数声明会将变量声明覆盖。

函数预编译(五部曲):

函数上下文创建后,会生成**变量对象AO**

- 寻找变量声明, 变量名作为AO对象的属性名, 属性值置为 undefined

- **寻找形参, 形参名作为AO对象的属性名, 属性值置为 undefined**

- **将实参的值赋予形参, 即替换 AO对象中形参的属性值**

- 寻找函数声明, 函数名作为AO对象的属性名, 属性值为函数本身

- 如果函数名与变量名冲突, 函数声明会将变量声明覆盖

浅拷贝与深拷贝:

浅拷贝是其属性与拷贝源对象的属性共享相同引用,当更改源或副本时,也可能导致其他对象发生改变。(相当于只是一个指向该地址的拷贝一改全改)对于引用数据类型它是一个浅拷贝。

Object.create()方法会把里面传入的对象拷贝到它的原型上浅拷贝。

Object.assign({}, obj)方法相当于创建一个新的接受器{},再将obj合并入当是深拷贝。

引用型拷贝的是地址所以传递一改俱该,基本拷贝属性。

扩展运算符:var obj1 = { ...obj }

深拷贝:指其属性与其拷贝的源对象的属性不共享相同的引用,当更改源或副本时可以确保不会导致其他对象发行改变。

var ob2 =  JOSN.parse(JSON.stringify( ob1)) 原生方法:stringify把obj转换为一个字符串序列然后parse还原为对象属性。注:当拷贝对象中含有函数、symbol、正则和undefined类型时会出现拷贝错误。

对此lodash组件库针对不同类型的拷贝实现。

深拷贝的使用场景:
数据类型的划分、递归处理、循环引用的处理

本质上自己实现的是条件加递归结合的方法

不需要递归的类型直接返回:null 非对象 函数类 Data RegExp正则;

构造函数的原型是否在当前函数的原型链上if ( obj instanceof Map){} 对Map数据结构的处理。先创建const newObj = new Map(),对于map数据结构添加元素是调用它的set方法。对与往数组array中添加时调用push。

!自己跟着实现一遍深克隆和浅克隆的函数

闭包:能够访问到其他函数作用域中的对象的函数,成为闭包。(两个函数之间的关系

匿名函数由作用域链可向外发访问而外部是不可以向内的,存在的内存泄漏的机制现在由于回收解决。

this的基本概念:不能在执行期间被赋值。JS中的this并不是固定不变的它随着执行环境的变化而改变。

js对象和JSON格式的区别:【

JSON的属性一定要加双引号,对象可以加,也不可以不加

JSON不可以进行赋值,不可以属性的形式取值,对象可以

使用JSON.stringify()将js对象转换为json 字符串,以js对象为参数

使用JSON.parse()将json字符串转换为js对象,以json字符串为参数

this指向问题:

在一般函数调用时,this指向的windows

在构造函数中,this指向实例化出来的对象

作为对象的方法调用,this指向调用对象

call和apply调用,this指向第一个调用的对象(传入的参数)没给为空的话就是window

call方法:语法:function.call(thisArg,arg1,arg2,...),其中thisArg是要设置为函数执行上下文的对象,也就是this要指向的对象,从第二个参数开始,arg1,arg2,...是传递给函数参数,通过使用call方法,可以将一个对象的方法应用到另一个对象上

apply

前端里面amd还有cmd怎么区别。

基本数据类型:

number数字类型:可以带小数点,也可以不带,可以用科学计数法

字符串类型String:存储字符的变量,可以是引用类中的任意文本,字符串的变量内容一旦创建就不可以再改变,如果要改变,只能创建新的字符串,抛弃旧的字符串。

字符串模版 `字符串${变量}字符串`

null空,返回的类型是Object原理:在js中二进制前三位都为零就被判断为object类型,null的二进制表示全部都为0.用途:通过将变量的值设置为null来清空变量。

声明变量然后通过console.log(typeof  变量名)查看类型

undefined:表示一个变量只有声明没有赋值,他与Null的值相等但是类型并不同,null缺失值,此处有一个值但是还没有定义。

数组Array:用方括号书写,由逗号隔开,索引了(下标)基于零第一个项目就是[0]以此类推。

对象Object用花括号来书写,对象属性:属性值,用逗号隔开。取值,对象名属性名

函数function:是被设计为特定任务的代码块,会在某个代码调用它的时候执行


http://www.ppmy.cn/ops/45549.html

相关文章

代码随想录算法训练营第四十四天|km46. 携带研究材料、 416. 分割等和子集

代码随想录算法训练营第四十四天 km46. 携带研究材料 题目链接:km46. 携带研究材料 确定dp数组以及下标的含义:i的含义是物品编号从0到i,j的含义是当前背包的最大容量,dp[i][j]背包内物品的总价值确定递推公式:背包…

动手学深度学习(Pytorch版)代码实践-深度学习基础-01基础函数的使用

01基础函数的使用 主要内容 张量操作:创建和操作张量,包括重塑、填充、逐元素操作等。数据处理:使用pandas加载和处理数据,包括处理缺失值和进行one-hot编码。线性代数:包括矩阵运算、求和、均值、点积和各种范数计算…

如何通过手机自学编程入门:探索四、五、六、七方面的学习路径

如何通过手机自学编程入门:探索四、五、六、七方面的学习路径 在信息爆炸的时代,手机已不仅仅是通讯工具,更是知识的宝库和学习的利器。对于渴望入门编程的初学者来说,手机自学编程成为了一种便捷而高效的选择。本文将围绕四个方…

初识C语言第三十天——设计三子棋游戏

目录 一.设计游戏框架 1.打印游戏菜单 2.输入选择判断(玩游戏/游戏结束/输入错误重新输入) 二、玩游戏过程设计 1.设计棋格存放棋子——二维数组 2.初始化棋盘——初始化为空格 3.打印棋盘——本质上就是打印数组 4.游戏过程——1.玩家走棋 2.…

探索k8s集群的存储卷 emptyDir hostPath nfs

目录 一 含义 查看支持的存储卷类型 emptyDir存储卷 1.1 特点 1.2 用途 1.3部署 二、hostPath存储卷 一 含义 容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重…

如果有多个文件夹,怎么快速获得文件夹的名字呢

上一篇写到怎么批量建立文件夹,那么怎么获取批量文件夹的名字呢? 一、啊这,这真是一个好问题二、这个得用Python(文本末尾有打包程序,点击链接运行就可以了)(1)首先建立一个py文件&a…

Linux 使用 yum安装 ELK服务,yum 安装elasticsearch和Kibana(未写完)

文章目录 环境准备ELK组件介绍安装Elasticsearch安装Kibana 丢弃下载ELK 服务安装包Elasticsearch安装 Tips:关闭elasticsearch https修改 es 启动内存 环境准备 ELK组件介绍 ElasticSearch : 是一个近实时(NRT)的分布式搜索和分析引擎&…

微信小程序区分运行环境

wx.getAccountInfoSync() 是微信小程序的一个 API,它可以同步获取当前账号信息。返回对象中包含小程序 AppID、插件的 AppID、小程序/插件版本等信息。 返回的对象结构如下: 小程序运行环境,可选值有:develop(开发版&…