JS的基本内容

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:是被设计为特定任务的代码块,会在某个代码调用它的时候执行

相关推荐
XiYang-DING9 分钟前
JavaScript
开发语言·javascript·ecmascript
空中海1 小时前
02 React Native状态、导航、数据流与设备能力
javascript·react native·react.js
空中海2 小时前
02 状态、Hooks、副作用与数据流
开发语言·javascript·ecmascript
空中海2 小时前
04 React Native工程化、质量、发布与生态选型
javascript·react native·react.js
杨超凡3 小时前
豆包收费了?我特么自己用“意念”搓了一个!
javascript
threelab3 小时前
Three.js 咖啡杯烟雾效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能
Heo4 小时前
14_React 中的更新队列 updateQueue
前端·javascript·面试
前端 贾公子4 小时前
解决浏览器端 globalThis is not defined 报错
前端·javascript·vue.js
之歆4 小时前
DAY12_CSS3选择器全攻略 + 盒子新特性完全指南(下)
前端·javascript·css3