不废话,直接上题
一、变量类型和计算
1.1 js中使用typeof能得到的哪些类型?
答:1.值类型 VS 引用类型
typeof undefined ??//undefinedtypeof ‘abc‘ ??????//stringtypeof 123 ????????//numbertypeof true ???????//booleantypeof {} ?????????//objecttypeof [] ?????????//objecttypeof null ???????//objecttypeof console.log //function
1.2 何时使用=== , 何时使用==?
答:强制类型转换:字符串拼接、==运算符、if语句、逻辑运算 ,其余全用三等号
1 100 == ‘100‘ ??????//true 2 0== ‘‘ ????????????//true 3 null == undefined ?//true 4 if (obj.a == null) { 5 ????//这里相当于 obj.a === null || obj.a === undefined的简写形式 6 ????//这是JQuery源码中的推荐写法 7 } 8 console.log(10 && 0) ??//0 9 console.log(‘‘ || ‘abc‘) ?//‘abc‘10 console.log(!window.abc) ?//true11 12 //判断一个变量会被当作 true 还是 false13 var a = 10014 console.log(!!a)
1.3 Js有哪些内置函数?
答:数据封装类对象
Object , Array , Boolean , Number , String , Function , Date , RegExp , Error。
1.4 Js变量按照存储方式区分为哪些类型,并描述其特点
1 //值类型 2 var a = 10 3 var b = a 4 a = 11 5 console.log(b) ????//10 6 ?7 //引用类型 8 var obj1 = {x:100} 9 var obj2 = obj110 obj1.x = 20011 console.log(obj2.x) ?//200
1.5 如何理解json?
答:JSON只不过是一个JS对象而已
JSON.stringify({a:10,b:20})
JSON.parse(‘{"a":10,"b":20}‘)
二、原型和原型链
知识点:
1.构造函数
2.原型五大规则
所有的引用类型(数组、对象、函数),都具有对象特性,即可自由扩展属性(除了“null”以外);
所有的引用类型(数组、对象、函数),都有一个_proto_属性(隐式属性),属性值是一个普通的对象;
所有的函数,都有一个prototype属性(显式属性),属性值也是一个普通对象;
所有的引用类型(数组、对象、函数),_proto_属性值指向它的构造函数的“prototype”属性值;
当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的_proto_(即它的构造函数的prototype)中寻找。
3.原型链
4.instanceof:用于判断引用类型属于哪个构造函数的方法
f的_proto_一层一层往上,能否对应到Foo.prototype,再试着判断f.instanceof Object。
2.1 如何准确判断一个变量是数组类型?
var arr = []arr instanceof Array ??//truetypeof arr ????????//object ?????//typeof 是无法判断是否是数组的Object.prototype.toString.call(arr) === ‘[object Array]‘;
2.2 写一个原型链继承的例子。
答:
var Parent = function(name){ ?this.name = name || ‘parent‘ ;} ;Parent.prototype.getName = function(){ ?return this.name ;} ;Parent.prototype.obj = {a : 1} ;var Child = function(name){ ?Parent.apply(this,arguments) ;} ;Child.prototype = Parent.prototype ;var parent = new Parent(‘myParent‘) ;var child = new Child(‘myChild‘) ;console.log(parent.getName()) ; //myParentconsole.log(child.getName()) ; //myChild
2.3 描述new一个对象的过程。
三、作用域和闭包
3.1 说一下对变量提升的理解
函数声明会提升,一般的变量以及变量表达式不提升
3.2 说明this几种不同的使用场景
答:1.作为构造函数执行
2.作为对象属性执行
3.作为普通函数执行
4.call,apply,bind
//call , apply , bindfunction fn1(name,age){ ???alert(name) ???console.log(this) ??}fn1.call({x:100},‘Lily‘,20) ??//弹出Lily,this ={x:100}function fn2(name,age){ ???alert(name) ???console.log(this) ??}fn2.apply(({y:200},[‘Lily‘,20])) //弹出Lily,this ={y:200}var fn3 = function(name,age){ ???alert(name) ???console.log(this)}.bind({z:300})fn3(‘Lily‘,20) ?????????//弹出Lily,this ={z:300}
3.3 创建10个<a>标签,点击的时候弹出来对应的序号
var ifor (var i = 0; i < 10; i++) { ???(function(i){ ???????var a = document.createElement(‘a‘) ???????a.innerHTML = i + ‘<br>‘ ???????a.addEventListener(‘click‘,function(e){ ???????????e.preventDefault() ???????????alert(i) ???????}) ???????document.body.appendChild(a) ???})(i)}
3.4 如何理解作用域
1.自由变量
var a = 100function F1(){ ???var b = 200 ???function F2(){ ???????var c=300 ???????//当前的作用域没有定义的变量,即“自由变量” ???????console.log(a) //自由变量 ???????console.log(b) ?//自由变量 ???????console.log(c) ???}}
2.闭包
function F1(){ ???var a = 100 ???//返回一个函数(函数作为返回值) ???return function(){ ???????console.log(a) ???}}//f1 得到一个函数var f1 = F1()var a = 200f1() ???????//a=100
3.5 实际开发中闭包的应用
JS常见问题总结一
原文地址:http://www.cnblogs.com/Yannk/p/7471472.html