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

相关推荐
小曲曲23 分钟前
接口上传视频和oss直传视频到阿里云组件
javascript·阿里云·音视频
学不会•1 小时前
css数据不固定情况下,循环加不同背景颜色
前端·javascript·html
EasyNTS2 小时前
H.264/H.265播放器EasyPlayer.js视频流媒体播放器关于websocket1006的异常断连
javascript·h.265·h.264
活宝小娜4 小时前
vue不刷新浏览器更新页面的方法
前端·javascript·vue.js
程序视点4 小时前
【Vue3新工具】Pinia.js:提升开发效率,更轻量、更高效的状态管理方案!
前端·javascript·vue.js·typescript·vue·ecmascript
coldriversnow4 小时前
在Vue中,vue document.onkeydown 无效
前端·javascript·vue.js
我开心就好o4 小时前
uniapp点左上角返回键, 重复来回跳转的问题 解决方案
前端·javascript·uni-app
刚刚好ā5 小时前
js作用域超全介绍--全局作用域、局部作用、块级作用域
前端·javascript·vue.js·vue
yqcoder6 小时前
reactflow 中 useNodesState 模块作用
开发语言·前端·javascript
会发光的猪。7 小时前
css使用弹性盒,让每个子元素平均等分父元素的4/1大小
前端·javascript·vue.js