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步,称为事件循环