JavaScript面试基础
1.何时使用==和===
if(obj.a == null) {} 只有此时用==,其他时候用===,这是JQuery源码中推荐使用的写法
2.JS中按照存储方式分为:值类型,引用类型
值类型:赋值时不会互相干扰
引用类型:指针类型,会互相干扰,它不是值的拷贝
3.理解JSON
JSON是一个JS对象,也是一种数据格式
JSON.stringify({a:10,b:4}) 转换成字符串
JSON.parse('{"a":10,"b":4}') 转换成JSON对象
4.原型与原型链
用instanceof来判断一个函数是否是一个变量的构造函数
5条原型规则:
★所有引用类型(数组,对象,函数),都具有对象的特性,即:
可自由扩展属性(除了null外)
★所有引用类型(数组,对象,函数),都有一个__proto__属性(隐式原型),属性值是一个普通的对象
★所有函数,都有一个prototype属性(显式原型),属性值是一个普通的对象
★所有引用类型(数组,对象,函数),__proto__属性值指向它的构造函数的prototype属性值
★当试图得到一个对象的某个属性值时,如果这个对象本身没有这个属性,那么它会去它的__proto__(即它的构造函数的prototype)中寻找
问题:
如何准确判断一个变量是数组类型:
描述new一个对象的过程:
创建一个新对象,this指向这个新对象,执行代码(即对this赋值),隐式返回this
zeopto(或其他框架)源码中如何使用原型链
5.闭包使用场景
函数作为返回值
函数作为参数传递
作用域:自由变量,作用域链(自由变量的查找),闭包的使用场景
闭包主要用于封装变量,收敛权限
6.this
作为构造函数执行
作为对象属性执行
作为函数执行
7.异步和单线程
使用异步的场景:定时任务:setTimeout,setInterval;网络请求:ajax,动态img加载;事件绑定(都需要等待,等待过程不能阻塞)
同步与异步的区别:同步会阻塞代码的执行,异步不会(alert是同步执行)
8.其他
获取2017-06-10的日期
获取随机数,要求长度一致的字符串格式
(Math.random在前端中主要是为了清除缓存)
写一个能遍历对象和数组的通用forEach函数(数组API(foeEach,every,some,filter,sort))
9.JS-Web-API
DOM本质:浏览器把拿到的html代码,结构化一个浏览器能识别并且js可操作的一个模型
attribute:html标签的属性
property:js对象标准属性
DOM的基本数据结构:树
10.BOM
如何检测浏览器的类型
navigator.userAgent从这个字符串里来分析
拆解url的各部分
location.protocol返回协议
location.host返回主机
location.pathname
location.search
11.事件
通用事件绑定:
事件冒泡
DOM树形结构,事件冒泡
e.stopPropatation()阻止冒泡
代理:代码简洁,减少浏览器内存占用
12.ajax
同源策略:不允许ajax访问其他域的接口
可以跨域加载资源的三个标签:
<img src=xxx> 用于打点统计
<link href=xx> <script> 可以使用CDN
<script src=xx> 可以使用JSONP
所有跨域请求都必须经过信息提供方允许
JSONP实现原理:
在<script>标签中定义window.callback函数,外域执行后返回的也正好是callback函数
也可以在服务器端设置http header:
13.存储
cookie,sessionStorage,localStorage的区别
cookie:本身用于客户端与服务端通信,但是它有本地存储的功能,于是就被“借用”,使用document.cookie=...获取和修改
cookie缺点:存储量太小,所有http请求都带着,会影响获取资源的效率,API简单,需要封装才能用document.cookie=..
localStorage: API简答易用
localStorage.setItem(key,value),localStorage.getItem(key)
sessionStorage:会话关闭后就会被清理
14.AMD
Require.js
全局define函数
全局require函数
依赖JS,会自动异步加载
15.commJS
Commons不会异步加载JS,而是同步一次性加载
AMD和commonJS使用场景:
要异步加载用AMD,用NPM一般就用commonJS