JS基础知识(1)

1、JS的基本数据类型和引用数据类型有哪些,两者区别
基本数据类型->string、number、Boolean、null、undefined、symbol
引用数据类型->array、object、function
基本数据类型是保存在栈内存中,操作的是值,改变源数据不会影响新的变量
引用数据类型保存在堆内存中,操作的是地址,改变其中一个会影响另一个

四基(string、number、Boolean、symbol)两空(null、undefined)一对象(object)

2、数据类型中为假的有哪些
false (布尔型)
0(数值型)
null(定义空的或者不存在,现在没有,将来可能有)
undefined(未定义,一直不存在)
NaN(不是一个有效数字)
空字符串(空字符串,字符类型)

3、怎么实现string和number的相互转换
String 转换成 Number:Number()、parseInt()、parseFloat()
Number 转换成 String:String()、toString()

4、获取对象属性 [] 和 . 的区别
. 后面的是这个对象的属性,凡是用.的地方都可以用[]
[] 中括号的内容可以是字符串也可以是变量,基本上[]放的是变量

5、null和undefined的区别
Null:代表空对象指针。现在没有,将来可能会有
undefined:空,未定义。现在没有,将来也不会有(Js中独有的数据类型)

6、检测数据类型的几种方式,以及他们的对比
typeof、instanceof、constructor、Object.prototype.toString.call()
typeof只针对基本数据类型,遇到引用数据类型是不起作用的(无法细分对象)
instanceof用来判断对象和函数,不适合判断字符串和数字
constructor是Object其中的一个属性。默认指向实例的构造函数
通过Object.prototype.toString方法,判断某个对象值属于哪种内置类型

7、何时使用 === 何时使用 ==
判断对象的属性是否存在可以使用双等,其余都用全等
=== 更严谨,不仅值相等类型也要相等,不用进行类型转换,并且比 = = 速度快

8、什么是DOM映射机制
通过DOM中方法获取到的元素,与页面一一对应的这种关系称之为DOM映射
querySelectorAll获取到的元素集合没有DOM映射,必须是元素的内置属性发生变化,浏览器才能监听得到

9、重绘和回流(重排)区别,什么情况会触发重排和重绘
当页面元素(宽高,位置)发生改变,回导致页面重排,浏览器会根据新位置进行重新渲染
回流必将引起重绘,而重绘不一定会引起回流。重绘相对于回流性能消耗较低
任何改变用来构建渲染树的信息都会导致一次重排或重绘
比如添加、删除、更新DOM节点,通过display: none隐藏,调整样式属性,调整窗口大小,滚动等等

10、如何最小化重绘(repaint)和回流(reflow)
(1)需要对元素进行复杂的操作时,可以先display:none隐藏,操作完再显示
(2)需要创建多个DOM节点时,使用DocumentFragment创建完后一次性的加入document
(3)尽量避免用table布局
(4)避免使用css表达式(expression),每次调用都会重新计算值(包括加载页面)
(5)尽量使用css简写,如:用border代替border-width,border-style, border-color

11、什么是暂时性死区
let 和 const 声明的变量不存在变量提升,其作用域都是块级作用域,凡是在声明变量之前使用变量就会报错,
所以,在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”

12、使用js去除字符串空格
str.trim()
使用replace正则匹配:str.replace(/\s*/g,“”)

13、什么是闭包,有什么优缺点
在Js中当函数套函数,子函数使用了父函数的参数或者变量,并且子函数被外界所使用(没有释放),此时父函数的参数和变量,是不会被浏览器垃圾回收机制立马收回,这个时候父级形成了闭包环境。

function fn(){
     let a = 10;
     return function(){
        console.log(a);
        }
 }
let f = fn();
console.dir(f);// 控制台中的closure就代表闭包

优点:
保护—闭包会形成私有作用域,保护里面的私有变量不受外界干扰
存储—闭包可以把父函数的参数或变量存储起来

缺点:
相对于普通函数要消耗内存,闭包使用不当将会在IE(IE9之前)中造成内存泄漏

14、JavaScript垃圾回收机制
Js具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行
垃圾回收机制主要有两种方法:
1、标记清除法 
打开页面时,先把所有的变量打上标记,然后把被使用的变量清除标记。如果下次查询之前标记的没有被引用,此时就回收
2、引用计数法
变量每用一次就记录一次,一开始为0,下次引用+1,每少用一次就-1。当变为0时候 就清空回收
直接给变量赋值一个null的地址可以解决闭包消耗的内存

15、什么情况会引起内存泄漏,产生原因及解决方案?
(1)意外的全局变量引起的内存泄漏
   原因:全局变量,不会被回收
   解决:可以使用严格模式避免
(2)闭包引起的内存泄漏
   原因:闭包可以维持函数内局部变量,使其得不到释放
   解决:将事件处理函数定义在外部,解除闭包,或者在定义事件处理函数的外部函数中,删除对dom的引用
(3)没有清理的DOM元素引用
   原因:虽然别的地方删除了,但是对象中还存在对dom的引用
   解决:手动删除即可
(4)忘记的定时器或者回调
   原因:定时器中有dom的引用,即使dom删除了,但是定时器还在
   解决:手动清除定时器和dom

16、什么是原型,什么是原型链,两者关系
原型(prototype):函数自带的属性,函数的实例化对象找不到某个属性或者方法,一定会去构造函数的原型下去找
原型链(proto):实例化对象身上自带一个属性
原型关系链:函数的实例化对象找不到某个属性或方法,一定会去构造函数的原型下去找,如果还没有会去原型下的原型链查找,直到找到Object.prototype为止
两者关系:实例化对象的原型链 === 构造函数的原型

17、Js有哪些解决异步的方案
(1)callback 回调函数
(2)promise
(3)事件监听
(4)async await

18、什么是作用域、作用域链
作用域分为全局作用域、局部作用域(包括es6新增块级作用域)
简单理解作用域就是一个独立的空间,让变量不会暴露。不同作用域下同名变量不会冲突
当前作用域未定义的变量(自由变量)会向父级作用域查找,如果父级没有再一层层往上找,直到全局作用域,这种一层层的关系称为作用域链

19、浅拷贝和深拷贝,实现的几种方式
浅拷贝只复制某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存
深拷贝会开辟一个新的栈,新对象跟原对象不共享内存,修改新对象不影响原对象
简单来说假如B复制了A,当修改A时候B如果跟着改变就是浅拷贝,B没有改变则为深拷贝
浅拷贝实现方式:
Object.assign()、Array.prototype.concat()、Array.prototype.slice()
深拷贝实现方式:
JSON.parse(JSON.stringify())、手写递归、jquery的$.extend

20、声明变量和声明函数的提升有什么区别
变量声明提升:变量申明在进入执行上下文就完成了
只要变量进行声明,无论在哪个位置,js引擎都会将它的声明放在作用域的顶部
函数声明提升:执行代码之前会先读取函数声明,可以把函数申明放在调用它的语句后面
函数声明会覆盖变量声明,但不会覆盖变量赋值

21、对事件冒泡、事件捕获、事件流的理解,怎么阻止冒泡
事件冒泡:就是从目标元素自下而上一直到window(结束)这样一个过程
事件捕获:就是从window自上而下一直到目标元素的这样一个过程
一般是先执行捕获,后执行冒泡
事件流:当一个事件触发时候,一般会经历3个过程,第一个为捕获阶段,第二个为目标阶段,第三个为冒泡阶段这么一个过程
使用stopPropagation() 和 cancelBubble阻止冒泡

22、构造函数、原型对象、实例对象三者的关系
三者的关系是,每个构造函数都有一个原型对象,原型对象上包含着一个指向构造函数的指针,而实例都包含着一个指向原型对象的内部指针。
通俗的说,实例可以通过内部指针访问到原型对象,原型对象可以通过constructor找到构造函数

23、什么是柯里化函数
柯里化(Currying)就是把接收多个参数的函数转换成一个单个参数的函数并且返回接收余下的参数。返回结果是一个新函数
函数柯里化的主要作用和特点是参数复用、提前返回和延迟执行

24、如何理解防抖和节流
防抖:短时间内连续触发的事件,在某个时间期限内事件函数只执行一次
节流:如果短时间内大量触发同一事件,在函数执行一次之后,在指定的时间期限内不再工作,直至过了这段时间才重新生效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值