一.变量类型
1.变量类型:undefined,string,number,boolean,function,object
变量类型分为值类型与引用类型。
- 值类型:
- 引用类型:对象,数组,函数
注:object类型包括:对象,数组以及NULL.
2.值类型强制类型转换的几种场景:
- 字符串拼接:var a=100+’10’;//10010
- ‘= =’运算符:100 ==‘100’0==‘’null==undefined
- 逻辑运算:100&&0//0
- if语句:var b=100; if(b){}
3.JS内置函数(数据封装类对象)
Object,String,Array,Boolean,Number,Function,Date,RegExp,Error
4.如何理解JSON
是个JS对象,有两个API。
- JSON.parse();//对象转字符
- JSON.stringify()//字符转对象
经典面试题解答:
1.JS中使用typeof能得到哪些类型?
6中基本类型:undefined,boolean,number,string,object,function2.何时使用===何时使用==?
使用==的情况:
if(obj.a==null){}//相当于obj.a===undefined//obj.a===null
除此之外,均使用===
二.原型和原型链
1.构造函数
function Foo(){}//默认自动返回this
2.构造函数扩展:
var a={}
var a=[]
function Foo(){... } //均是构造函数的省略写法
3.原型链的规则和示例:(重要!!!)
- 所有的引用类型,都具有对象特性,即可自由扩展属性。(除了null)
- 所有的引用类型,都具有一个proto属性,属性值是一个普通的对象。
- 所有的函数,都有一个prototype属性,属性值是一个普通对象。
- 所有的引用类型,proto属性指向它的构造函数的prototype属性obj.proto==Object.prototype
- 当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么就回去它的proto中寻找。
经典面试题解答:
1.如何判断一个变量是数组
arr instanceof Array
2.描述一个对象new的过程:
创建一个对象,this指向这个对象;执行代码,并对this赋值,返回this
3.写一个原型链继承的例子(如下)
4.zepto源码中如何使用原型链
function Ele(id){
this.element=document.getElementById(id);
}
Ele.prototype.html=fucntion(val){
var elem=this.element;
if(val){
elem.innerHTML=val;
return this;}//返回了this,就可以链式调用
else{
return elem.innerHTML;}
}
Ele.prototype.on=fucntion(type,fn){
var elem=this.elem
elem.addEventListener(type,fn);
return this;
}
var element=new Elem("btn");
element.html().on("click",fn);//链式调用
三.作用域与闭包
1.执行上下文
- 范围:一个script或是一个函数。
- 全局:变量定义,函数声明
- 函数:变量定义,函数声明,this.arguments.
注:注意函数声明和函数表达式的区别。
2.this:
在执行时才能确认值,定义时无法确认。
以下this的应用场景。
- 作为构造函数执行
- 作为对象属性执行:a.fn//对象指向该对象
- 作为普通函数执行:function(){this}//this===window
- call,bind,apply: function fn(name){console.log(this) alert(name)} fn.call({x:100},’zhangsan’)//{x:100}
3.作用域
JS没有块级作用域,只有函数和全局作用域
4.作用域链
- 自由变量:当前作用域没有定义的变量,即自由变量。
- 去父级的作用域寻找:哪个函数定义了该函数,那么就是该函数的父级作用域。
5、闭包
使用场景:
- 函数作为返回值
- 函数作为参数传递
经典面试题
1.对变量提升的理解:变量定义&函数声明
2.创建10个< a>。点击的时候弹出来对应的序号。
for(i=0;i<10;i++){
(function(i){
var a=document.createElement("a");
a.addEventListener("click",function(e){
e.preventDefault();
alert(i);
})
})(i);
}
3.如何理解作用域?
自由变量。
作用域链,即自由变量的查找。
闭包的两个场景。
4.实际开发中闭包的使用?
//闭包实际应用与封装变量,收敛权限。
function isFirstLoad(id){
var _list=[]
return function(id){
if(_list.indexof(id)==0){
return false;
}else{
_list.push(id)
return true
}
}
}
var firstload=isFirstLoad(10);//true