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