发表于: 2019-11-13 23:47:26
1 1178
今天完成了什么:
复盘demo;
遇到了什么问题:
存在一些前端样式逻辑问题,问题不大;
收获了什么:
看了下面试题,
js规范
#说几条写JavaScript的基本规范?
- 不要在同一行声明多个变量
- 请使用
===/!==
来比较true/false
或者数值 - 使用对象字面量替代
new Array
这种形式 - 不要使用全局函数
Switch
语句必须带有default
分支If
语句必须使用大括号for-in
循环中的变量 应该使用var
关键字明确限定作用域,从而避免作用域污染
#W3C对js的规定有哪些?
- DOM
- BOM
- 事件绑定
- ajax请求(包括http协议)
- 存储
#变量类型
#原始类型
字符串(String
)、数值(Number
)、布尔值(Boolean
)、Undefined
、Null
占用空间固定,保存在栈中,存储的是值。
原始类型存储的是值,是没有函数可以调用的。之所以'1'.toString()
可以被调用,是因为它做了一层封装。被强制转换成了 String
类型,也就是对象类型,所以可以调用toString
函数。
#对象类型
对象(Object
)、数组(Array
)、函数(Function
)
占用空间不固定,地址存在栈内存,值保存在堆中, 复制的是地址,指向同一块内存空间。 使用instanceof
检测数据类型
#原始类型和对象类型区别?
- 原始类型存储的是值,保留在栈内存(空间固定),相等都要重新创建一份
- 对象类型存储的是指针,保留在堆内存(空间不固定),相等时引用的是同一份指针
#类数组和数组的区别是什么?
类数组: 拥有length属性,不具有数组所具有的方法。
#转换为数组
//第一种方法Array.prototype.slice.call(arrayLike);//第二种方法[...arrayLike];//第三种方法:Array.from(arrayLike);
#js内置函数是什么?
内置函数: Object
, Array
, Function
, Boolean
, Number
, String
, Date
, RegExp
, Error
, Json
.
作用: 作为构造器函数
#函数参数是对象会发生什么?
函数参数是对象指针的副本,当参数重新分配对象时,参数的指针会发生变化。两个变量的值也会不相同
#null和undefined的区别是什么?
null
表示空对象指针- 如果定义的变量准备用来保存对象,那么最好初始化为
null
- 如果定义的变量准备用来保存对象,那么最好初始化为
undefined
表示未赋值的变量在使用
==
会发生类型转换.导致相等
#typeof能正确判断类型吗?
typeof
只能判断原始类型,null
除外
在对象类型之中只能识别函数
TIP
js存在的bug, 在最初版本为性能考虑, 使用000开头表示对象, null
表示全0, 所以会错误的判断null
为对象)
#instanceof 的原理:
沿着原型链一层一层向上找, 看是否能找到对应的prototype
#类型转换
#== 和 === 有什么区别?
- 两等(==)有类型转换,三等(===)没有类型转换
- 除了 obj==null 的情况,其余推荐用 ===
JS 中类型转换只有三种情况,分别是:
- 转换为布尔值
- 转换为数字
- 转换为字符串
#对象类型转换字符串:
先调用toString() 再调用valueOf()
#对象类型转换数值:
对象转换:先ValueOf() 后toString()
#JSON
#怎么理解json?
是内置的js对象,也是一种数据格式
有两个方法:
JSON.stringify({a:10,b:11})//把对象变成字符串JSON.parse('{a:10,b:11}')//把字符串变成对象
#XML与JSON的区别?
json数据体积小 , 传递快 , 与JavaScript交互更加方便 , 容易解析 .
但是数据描述性差 , 不如XML
#DOM
#DOM的本质?
DOM: Document Object Model 文档对象模型
DOM本质:
浏览器拿到html代码后,DOM把html代码结构化成浏览器可识别以及js可识别的模型 .
(html代码就是一个字符串,但是浏览器已经把字符串结构化成树形结构了。)
#DOM是哪种数据结构?
数据结构: 树形
#DOM 结构操作:
- 新增节点
document.createElement(node)
- 获取父元素
childNode.parentElement
- 获取子元素
parentNode.childNodes
- 删除节点
parentNode.removeChild(childNode)
#childNodes 和 children的区别?
childNodes
属性返回所有的节点,包括文本节点、注释节点; children
属性只返回元素节点;
#Attribute 和 property有何区别?
区别: Attribute
是对html标签属性进行获取修改, property
是js对象属性的获取修改
对于html的标准属性来说,attribute
和property
是同步的,是会自动更新的 但是对于自定义的属性来说,他们是不同步的
#异步与单线程
#如何理解js单线程?
同一时间只能干一件事
#什么是任务队列?
有同步任务和异步任务
seTimeout
是异步任务 , 执行到异步任务要挂起
同步任务执行完再执行异步任务
#什么是同步(对比异步)?举个例子?
同步:浏览器向服务器请求,用户看到页面,重新发个请求 , 请求完,页面刷新,新内容才出现。
异步:浏览器向服务器请求,用户正常操作,浏览器后端进行请求。请求完,页面不刷新,新内容也会出现。
同步会阻塞代码运行,异步不会
alert
同步,seTimeout
异步
#什么时候需要异步?
在发生等待的情况下 , 程序仍然需要执行其他操作 , 不能阻塞程序运行
#异步使用场景有哪些?
定时任务
网络请求:
ajax
,img
加载, 脚本等文件加载和下载事件绑定
#什么是执行栈?
是一个存储函数调用的栈结构,遵循先进后出的原则。
#解释一下什么是 Event Loop ?
同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数。
当指定的事情完成时,Event Table会将这个函数移入Event Queue
主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。
上述过程会不断重复,也就是常说的Event Loop(事件循环)。
#异步任务执行顺序:
- 首先执行同步代码,这属于宏任务
- 当执行完所有同步代码后,执行栈为空,查询是否有异步代码需要执行
- 执行所有微任务
- 当执行完所有微任务后,如有必要会渲染页面
- 然后开始下一轮 Event Loop,执行宏任务中的异步代码,也就是 setTimeout 中的回调函数
宏任务(script、setTimeout、setInterval、setImmidiate、I/O、UI Rendering
)可以有多个队列
微任务(procress.nextTick、Promise.then、Object.observe、mutataionObserver
)只能有一个队列
当执行栈执行完毕后,会首先执行微任务队列,当微任务队列执行完毕再从宏任务中读取并执行,当再次遇到微任务时,放入微任务队列。
明天计划:
修改bug,晚上demo;
评论