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

相关推荐
john_hjy39 分钟前
11. 异步编程
运维·服务器·javascript
风清扬_jd1 小时前
Chromium 中JavaScript Fetch API接口c++代码实现(二)
javascript·c++·chrome
yanlele1 小时前
前瞻 - 盘点 ES2025 已经定稿的语法规范
前端·javascript·代码规范
It'sMyGo1 小时前
Javascript数组研究09_Array.prototype[Symbol.unscopables]
开发语言·javascript·原型模式
xgq2 小时前
使用File System Access API 直接读写本地文件
前端·javascript·面试
李是啥也不会2 小时前
数组的概念
javascript
无咎.lsy2 小时前
vue之vuex的使用及举例
前端·javascript·vue.js
fishmemory7sec2 小时前
Electron 主进程与渲染进程、预加载preload.js
前端·javascript·electron
fishmemory7sec2 小时前
Electron 使⽤ electron-builder 打包应用
前端·javascript·electron
JUNAI_Strive_ving3 小时前
番茄小说逆向爬取
javascript·python