进程与线程的区别
进程是 CPU 资源分配的最小单位 进程可以包含多个线程;线程是 CPU 调度的最小单位;一个进程由多个线程组成;线程是一个进程中代码不同的执行路线;进程之间相互独立 但是同一进程下的线程可以共享进程内的资源
JS 数据类型
JS 数据类型有 7 种 Number Boolean String Null Unedfined Object + Symbol(ES6 加的)
基本类型:Number Boolean String Null Unedfined
引用类型:Object
Symbol 类型的对象用不相等 即创建的时候传入相同的值 可以解决属性名冲突的问题 作为标记
JS 判断数据类型
typeof :string number boolean symbol bigint undefined object function
typeof(null) = object 因为 null 表示一个空对象指针 所以是 object
instanceof:判断引用数据类型:object function array date regexp 判断一个实例是否属于某种类型 原理是右边变量的 prototype 在左边变量的原型链上即可 在 instanceof 查找时会遍历左边变量的原型链直到找到右边变量的 prototype
constructor:函数被定义的时候 JS 引擎会为其添加 prototype 然后再 prototype 上有 constructor 属性 指向引用 但是不可以用 constructor 判断 null 和 undefined 因为他们是无效的对象不会有 constructor ; JS 的constructor 是不稳定的 主要体现在自定义对象上 开发者重写 prototype 之后原有的 constructor 会丢失 变成默认的 object
Object.prototype.toString():判断最准
列举三种强制类型转换和两种隐式类型转换
强制:parseInt parseFloat Number
隐式:== ===
ajax 中 post 和 get 区别
发送机制区别:
1.get 可以再 URL 上添加请求参数 没有请求主体; post 的请求是作为 HTTP 的实体内容发送给 web 有请求主体
2.get 获得的数据会被浏览器缓存 这就导致安全问题
3.post 必须设置请求头 Content-Type 值为 application/x-form-www-urlencoded
4.get 大小限制 4k(1024 字节) post 没有限制
服务器端区别:
1.客户端使用 get 时服务器端用 Request.QueryString 获得参数 用 post 时用 Request.Form 获得参数
2.post 用于创建资源 资源的内容会被加到 HTTP 请求中
3.无副作用的请求用 get 有副作用的请求用 post
用 post 的情况:
1.请求结果有持续的副作用 比如在数据库添加数据
2.如果用 get 使 URL 过长
3.要传送的数据不是用 ASC 编码
用 get 的情况:
1.查找资源
2.无持续性副作用
3.手机的数据和 HTML 表单输入字段名称不超过 1024 字符
call 和 apply 的区别
Call 和 apply 都是用一个对象替换当前对象
B.apply(A, arg) A 调用 B 的方法
B.call(A, arg1, arg2...) A 调用 B 的方法
不同在于 apply 只传一个参数 call 传递多个参数
ajax 的使用
创建 ajax 的过程
1.创建 XMLHttpRequest 对象(异步调用对象)var xhr = new XMLHttpRequest();
2.创建新的 http 请求(方法,URL, 是否异步) xor.open('get', 'demo.php', false);
3.设置响应 http 请求状态变化的函数
4.发送 http 请求 xhr.send(data);
获取异步调用返回的数据
1.页面初次加载时 尽量在 web 服务器一次性输出所有相关数据 在页面加载完成之后 使用 ajax 交互
2.同步 ajax 会发生假死所以建议采用异步 ajax
3.尽量减少 ajax 请求次数
4.ajax 安全问题 敏感数据应该在服务区处理 避免在客户端处理
JS 有几种类型的值以及内存
基本数据类型 存储在栈中
引用数据类型 存储在堆中 指针放在栈中
区别:
1.存储位置不同 原始数据类型直接存储在栈中的简单数据段 占据空间小 大小固定 属于被频繁使用数据 所以放在栈中;引用数据类型存储在堆中的对象 占据空间大 大小不固定 如果存储在栈中会影响程序运行性能
2.引用数据类型在栈中存储了指针 指针指向堆中该实体的起始地址 解释器寻找引用值时会先检索在栈中地址 取得滴之后从堆中获得实体
堆和栈区别
栈:由编译器自动分配释放 存放函数参数值 局部变量等
堆:一般由程序员分配释放 若不释放 程序结束时可能由操作系统释放
谈谈对 this 理解
1.this 总是指向函数的直接调用者
2.如果有 new 那么 this 指向 new 出来的对象
3.在事件中 this 指向目标元素 特殊的是 IE 的 attachEvent 的 this 总是指向全局对象 window
eval
把对应的字符串解析成 JS 代码并运行 它很耗性能 因为运行两次 一次解析成 JS 一次执行
Document 的对象和 window 对象
Window 对象代表浏览器中打开的一个窗口 document 对象代表整个 html 文档 实际上 document 对象是 window 对象的一个属性
IE 和火狐的事件机制有什么区别 如何阻止冒泡
IE:事件冒泡
火狐:事件捕获和事件冒泡 不是所有浏览器都支持事件捕获
jquery 使用 event.stopPropagation() 可以阻止冒泡 旧的 IE 方法:ev.cancelBubble = true
闭包
一个函数可以访问另一个函数作用域中变量 常见构造方法是在一个函数内部定义另外一个函数 闭包的原理是作用域链 所以闭包访问的上级作用域中的变量是个对象
闭包的优点:避免全局变量污染
缺点:内存泄漏
New 操作具体做了什么
1.创建空对象 用 this 变量引用该对象 继承了该函数的原型
2.属性和方法被加入到 this 引用的对象中
3.新创建的对象由 this 引用并隐式的返回 this
json.parse(str) 把 JSON 字符串变成 JS 值或者对象
json.stringify(obj) 把对象或者数组转化成 JSON 字符串
JS 的延迟加载方式
JS 的延迟加载为了提高页面加载速度
defer async 动态创建 DOM 异步载入 JS 用的最多
Defer:延迟脚本;立即下载但延迟执行 延迟到整个页面都解析完毕后运行 按照脚本出线先后顺序执行
Async:异步脚本;下载完立即执行 但不保证按照脚本出线先后顺序执行
同步和异步区别
同步在操作系统中 不同进程协同完成某项工作而先后次序调整(阻塞 || 唤醒) 同步强调的是顺序性 异步不存在顺序性
同步:浏览器访问服务器 用户看到页面刷新 重新发请求 等请求完 页面刷新 新内容出现 用户看到新内容之后进行下一步操作
异步:浏览器访问服务器请求 用户正常操作 浏览器在后端进行请求 等请求完 页面不刷新 新内容也会出现 用户看到新内容
document.write 和 innerHTML 区别
document.write 只能重绘整个页面 innerHTML 可以重绘部分页面
回流与重绘
渲染树中因为元素规模尺寸 布局等改变需要重新构建 => 回流 每个页面在第一次加载的时候至少要有一次回流 在回流的时候 浏览器会使渲染树中受到影响的部分失效 并重构渲染树 在回流之后浏览器将受影响的部分重新绘制到屏幕上 该过程称为重绘
HTML 和 XML 区别
1.XML 用来传输和存储数据 HTML 用来显示数据
2.XML 用的标签不用预先定义
3.XML 标签必须成对出现
4.XML 对大小写敏感
5.XML 中空格不会被删减
6.XML 中所有特殊符号必须用编码表示
7.XML 中图片必须有文字说明
JSON 和 XML 区别
数据体积:JSON 数据体积更小便于传输
数据交互:JSON 和 JS 交互方便
数据描述:JSON 对数据的描述性比 XML 差
传输速度:JSON 快于 XML
常见的响应事件
onclick 鼠标点击;onfocus 获取焦点;onblur 失去焦点; onmousedown 鼠标被按下
DOM 方法
createDocumentFragment() 创建 DOM 片段
createElement() 创建具体节点
createTextNode() 创建文本节点
appendChild() 添加
removeChild() 删除
replaceChild() 替换
insertBefore() 插入
getElementsByTagName() 通过标签名称获取
getElementsByName() 通过元素 name 属性值
getElementById() 通过元素 ID
渐进增强和优雅降级
渐进增强:针对低版本浏览器进行构建页面 保证最基本的功能 然后再针对高级浏览器进行效果 交互等改进 达到更好的用户体验
优雅降级:一开始就构建完整的功能 然后再针对低版本浏览器进行兼容
删除 cookie
1.cookie 失效时间设置为过去时间
2.系统时间设置为当前时间往前一些
attribute 和 property
attribute是dom元素在文档中作为html标签拥有的属性
property是dom元素在js中作为对象拥有的属性
所以 对于html的标准属性来说 attribute和property是同步的 是会自动更新的 但对于自定义属性 他们不同步
ajax 请求的页面历史记录状态问题
1.location.hash 记录 让浏览器记录 ajax 请求时页面状态变化
2.history.pushstate 实现浏览器地址栏的无刷新改变
JS 垃圾回收机制
Q:什么是垃圾
A:没有被引用的对象就叫垃圾 需要被清除 或者被引用但是无法从根访问
1.标记-清除算法
标记阶段:从根集合出发 将所有活动对象和子对象打上标记
清除阶段:遍历堆 将非活动对象连接到空链表
优点:简单
缺点:碎片化;分配速度不理想
2.标记-压缩算法
同 1 差不多 但是标记之后把活动对象排在堆的一侧 消除了内存碎片
3.引用计数算法
统计每个对象引用次数 每次新建删除引用对象的时候更新计数 数值变为 0 直接回收内存
优点:可以即刻回收 不必沿着指针查找
缺点:计数器任务繁重;循环引用无法回收;实现繁琐 每次更新赋值引用都要重算
事件冒泡和事件捕获
事件捕获:事件触发之后从 document 对象到具体对象
事件冒泡:从最特定的时间目标到 document 对象的触发
阻止事件冒泡
return false 不仅阻止了事件往上冒泡 而且阻止了事件本身
event.stopPropagation() 则只阻止事件往上冒泡 不阻止事件本身
for in 遍历 index ;for of 遍历 value