定时器
1.定时器是一个异步对象;
2.定时器有一个返回值,这个返回值代表了在程序中他是第几个定时器
3.定时器的清除原理是阻止了定时器的函数体执行,这个定时器本身仍然存在,其返回值序号也存在
引用数据类型
在存储引用数据类型过程中,我们是拿不到引用数据类型里面的数据的,只有存储完毕,才可以拿到它的值
var obj={
name:'js',
can:(function () {
console.log(obj);
return obj.name;
})(),
do:function () {}
};
console.log(obj.can)
原型链与作用域链
原型链:在构造函数中,如果我们需要找到new出来函数中的某个属性,就会通过--proto--往所属类的原型(prototype)一步一步往上查找,直到找到Object为止,这个查找的过程就称为原型链;
作用域链:在一个函数体中,用到了某个变量,首先我们会在当前作用域下查找这个变量,如果当前作用域下没有,就会一级一级往上查找,直到找到window为止,这个过程称为作用域链;
体验原型题:
判断某个属性是不是函数的公有属性:先使用in判断是不是该函数的属性,然后通过hasOwnProperty判断是不是私有属性,如果是false,则是公有属性!
//in :公有属性和私有属性都可以判断
function FF() {
this.a="aa";
}
FF.prototype.A="AA";
var f=new FF;
console.log("a" in f);
console.log("A" in f);
//hasOwnProperty判断是不是自己的私有属性
console.log(f.hasOwnProperty("a"));
console.log(f.hasOwnProperty("A"));
可以通过constructor.name来判断某个变量是基本数据类型还是引用数据类型:
//可以使用xx.constructor.name来检测xx的数据类型
console.log([1, 2, 3].constructor.name);//"Array"
var obj={a:"a"};
console.log(obj.constructor.name);//"Object"
function fn() {}
console.log(fn.constructor.name);//"Function"
var n=1;
var str="123";
var b=true;
console.log(n.constructor.name);
console.log(str.constructor.name);
console.log(b.constructor.name);
原型是一个对象,拥有constructor属性,如果我们给prototype重新赋值一个对象,此时constructor属性就会丢失,我们可以手动加上constructor的值。
function FF() {
this.x="xx";
}
FF.prototype={
getX:function () {},
constructor:FF
};
var f =new FF();