JavaScript数据结构与算法
原型和原型链
判断一个函数是否是一个变量的构造函数用 instanceof。
如 a(对象) instanceof Object //返回true,b(数组) instanceof Object // 返回也是true,这个值得留意。
感觉Firefox 浏览器的 console 比 chrome浏览器的用起来要舒服一些,在某些地方显示要更加直观一些,各有特色吧。
构造函数,通常习惯采用左边的写法。
- var a = {} --------- var a = new Object()
- var b = [] ---------- var b = new Array()
- function Fn(){}-------var Fn = new Function()
原型规则:
所有的函数都有一个prototype(显示原型)属性,属性值是一个普通对象。
所有的引用类型(数组,函数,对象)的__proto__(隐式原型)属性值指向它的构造函数的“prototype”属性值。
下图中数组a有__porto__属性,没有prototype属性,a的构造函数是Array。 所以 a.__proto__ === Array.prototype。
(Array,Object,Function的构造函数都是函数function)
函数fn有显示原型和隐式原型。fn的构造函数是Function。所以fn.__proto__ === Function.prototype
判断属性是否属于对象本身,有的浏览器for...in 会把原型中的属性也打印出来。所以可以添加一个判断。
var item
for(item in f){
if(f.hasOwnProperty(item)){
console.log(item)
}
}
判断一个对象a是否属于 Array/Object/Function 应该通过:a.__proto__ === Array.prototype ,a.__proto__ === Object.prototype ,a.__proto__ === Function.prototype 的方式,返回值 为 true 或者 false。
同步和异步的区别
- 同步会阻塞代码执行,而异步不会。
- alert是同步。setTimeout是异步
console.log(1)
setTimeout(function(){
console.log(2)
},0)
console.log(3)
setTimeout(function(){
console.log(4)
},1000)
console.log(5)
alert(6)
console.log(7)
会先打印1、3、5,然后弹出6,点击确定后,再打印7、2、4.。
因为alert是同步,会阻塞。程序会停在alert(6)这个地方。而setTimeout是异步,不会阻塞,会等待程序执行完之后去执行。
前端使用异步的场景有哪些
- 定时任务:setTImeout,setInverval
- 网络请求:Ajax请求,动态<img>加载
- 事件绑定
因为js是单线程的语言,上面列举的三个应用场景在执行过程中都需要等待。为了在等待过程中不卡顿,所以需要异步执行。