wdely1的博客

记录每天进步的一点点

前端第一次面试的总结(JS部分)

1.检测数据类型(typeof instanceof)

(五种基本数据类型:Undefined、Null、Boolean、Number、String)

(复杂数据类型:Object)

typeof 检测给定变量的数据类型,返回值为字符串

类型结果
Undefined 声明未初始化或未声明,派生自null,判断时相等"undefined"
Null  被认为是一个空的对象引用"object"
Boolean"boolean"
Number  NaN、Infinity、Number.MAX_VALUE"number"
String"string"
函数对象"function"
Symbol"symbol"
宿主对象Implementation-depandent
任何其他对象"object"

注意:

1.Array,Null,对象、window、document使用typeof,会返回object

2.获取一个变量是否存在,if(typeof a!="undefined"){},不要用if(a),若a未声明,则会报错

3.区分数组和普通对象:使用Array.isArray(array) 或者 Object.prototype.toString.call ([object Array])或 Array.constructor == Array

typeof NaN === 'number'; // 尽管NaN是"Not-A-Number"的缩写
typeof [1, 2, 4] === 'object';
Array.isArray([1,2,4]); //true

4.isNaN区分Number

5.利用jquery的$.isPlainObject();$.isArray(obj);$.isFunction(obj)进行判断(未验证)

----------------------------------------------------------------------------------------------

instanceof 用于判断一个变量是否是某个对象的实例(或一个对象在其原型链中是否存在一个构造函数的prototype属性),返回值boolean

var a = new Array();
console.log(a instanceof Array); //true

var s = "12345";
console.log(s instanceof String); //false,检查原型链会找到undefined

var s = new String();
console.log(s instanceof String); //true

---------------------------------------------------------------------------------------------

练习输出:

写一个区分数据类型的函数

//检测数据类型,并返回string类型的名称
var testDataType = function(n) {
  	//几种可能:1.object:对象/数组/null;2.undefined:声明未初始化或未声明3.NaN,Number
  	if(typeof(n) == "object"){
     if(Array.isArray(n)) return "array"; //Object.prototype.toString.call(n) == "[object Array]"
     if(n === null) return "null"; //if(!n)
     if(n.construtor == Object) return "object";
    }else if(typeof(n) == "number"){
    	if(isNaN(n)) return "NaN";
    	return "number";
    
    }else{
    	return typeof(n);
    }
};

2.JS的异步(ajax的执行顺序)

原题再现:以下的执行顺序

$.ajax(){}

console.log("...");

我认为的考点是JS的异步执行的原理以及event loop(事件循环)

具体的概念理解见阮大神的<JavaScript运行机制详解:再谈Event Loop> (评论底下掐架,但是起码阮大神贡献的我理解了)

主要点:

  • 为什么JS会有异步
  • 异步的实现原理

为什么JS会有异步

    之初将JS设计成单线程,是为了避免若两个线程同时修改DOM节点造成复杂的同步问题(但浏览器是多线程)。为了解决单线程在运行过程中为了等待资源,也依旧非阻塞的继续流畅执行,于是有了异步。

异步的实现原理

    实现上:将callback作为参数传递给异步执行函数,当获得返回结果后,再触发callback执行。

    原理上:event loop(事件循环)机制。执行机制如下:

    1)主线程读取JS代码,此时为同步环境,形成一个执行栈(execution context stack)和相应的堆

    2)当主线任务遇到异步任务,给对应的异步进程进行处理(WEB API)

    3)异步任务处理完毕(ajax返回、计时器时间到、DOM事件触发),则将一部任务推入任务队列(task queue)

    4)主线程执行完毕,检查任务队列,若存在等待任务,则取出任务推入主线程执行栈处理(先进先出)

    5)重复执行2,3,4步,称为事件循环


    

阅读更多
想对作者说点什么? 我来说一句

前端面试总结

2018年03月27日 23KB 下载

没有更多推荐了,返回首页

不良信息举报

前端第一次面试的总结(JS部分)

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭