源代码研究,实例:http://fgm.cc/learn/
js面试知识点:
1:原生、闭包、上下文、call、apply、prototype。
2:jsonp:用script标签实现跨域、xss:javascript页面填写攻击。
3:架构,设计模式。
//
开发的项目:贪吃蛇游戏。拼音加加双拼输入法软件。
//
符合意思:##:疑惑,**:重点
1、javascript的实现:
1、javascript:ecmascript(核心),dom(文档对象模型),bom(浏览器对象模型)
2、用ecmascript当核心的语音有node.js,Flash,javascript
3、语法、类型、语句、关键字、保留字、操作符、对象
4、ecma第三版修改内容:字符串处理,错误定义,数值输出;新增加正则表达式,新控制语句,try-catch异常处理
5、ecma第四版:强类型变量,新语句和新数据结构、真正的类和经典继承。(最终被放弃,跨越太大)
6、ecms第3.1版:原生json对象(用于解析和序列化JSON数据)、继承,和高级属性的定义。
2、文档对象模型(DOM):
1、DOM:是针对XML但经过扩展用于HTML的应用程序编程接口。
2、节点:DOM映射为一个多层节点结构,DOM提供API对节点删除、添加、修改。
3、W3C:万维网联盟,制定标准DOM。
4、DOM两个模块:DOM核心(core),DOM HTML在DOM核心基础上扩展添加HTML的对象和方法。(DOM不只针对javascript,很多其他语言也有实现)
5、DOM:dom1映射文档结构,dom2:鼠标和用户界面事件、范围、编立,通过对象接口对CSS的支持。dom3:统一方式加载和保存文档的方法。
3、浏览器对象模型(BOM):
一、
- 弹出浏览器新窗口的功能;
- 移动,缩放和关闭浏览器窗口的功能;
- 提供浏览器详细信息的navigator对象;
- 浏览器加载页面详细信息location对象;
- 用户显示器分辨率详细信息screen对象;
- 对cookies支持;
- XMLHttpRequest对象和IE的ActiveXObject的对象。
二、
- BOM没有标准可以遵循,
- 每个浏览器都可以自己实现。
- html已经正式标准的BOM。
4、在html中使用javascript:
1、script元素:async:立即下载脚本;charset:通过src属性指定的代码的字符集;defer:表示脚步可以延迟到文档完全被解析和显示之后再执行;src:表示用执行代码的外部文件;type:text/javascript。
2、外部引入规范:<script type="text/javascript" scr="example.js"></script>
3、js代码放入body后面解决延迟加载,增加打开页面的速度。
4、XMTHL兼容html规范,这种格式在所以现代浏览器中都可以使用。
<script type="text/javascript">
//<![CDATA[
/* 代码 */
//]]>
</script>
5、js代码尽量使用外部包含的方式。
6、文档类型声明,如果在没声明文档类型,浏览器都会默认开启混合模式。
<!-- HTML 4.01 严格型 -->
<!DOCTYPE HTML PUBLIC "-//w3c//DTD HTML 4.01//EN" "http://www.w3.org/TR/html/strict.dtd">
<!-- XHTML 1.0 严格型 -->
<!DOCTYPE html PUBLIC "-//w3c//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- HTML 5 -->
<!DOCTYPE html>
7、<noscript>:浏览器不支持javascript提醒
5、基本概念(语法,数据类型,流程控制句,理解函数)
1、ECMAScript中的一切函数名都区分大小写。
2、var message;这样未经过初始化变量保留的值是undefined。
3、不建议修改变量保存值的类型。
4、var定义的是局部变量,在函数退出后就会被销毁。
5、不用var定义的全局变量。不建议使用,给未见声明的变量赋值在严格模式下会抛出ReferenceError错误。reference(参考引用)。
6、数据类型(undefined,null,boolean,number,string,object,)
typeof
1、typeof:检测数据的类型。
- undefined:未定义。
- boolean:布尔值。
- string:字符串。
- number:数字。
- object:对象
- null:null
- function:函数。
2、函数在ECMAScript中是对象,不是一种数据类型。函数也一种特殊属性,typeof操作用来区分函数和对象时是有必要的。
undefined
3、引入undefined时为了区分空对象指针和未经初始化的变量。
4、age没有声明,直接alert(age)会报错误。对未经过声明变量typeof是undefined,经过声明的变量typeof也是undefined。如果所有的值都被初始化了,typeof值undefined就知道这值是没声明。(##,**)。
null
5、typeof是object,对象类型定义:var object1 = null;
6、undefined值是派生自null值,所有 alert(null==undefind); // true
boolean
7、boolean类型的true,false是区分大小写的。转化类型函数Boolean()。
number
8、var intNum = 55 ;(十进制) var intNum=070;(八进制)var intNum=0X1f;(十六进制)。在进行算术计算的时候最终会转换为十进制。
浮点数值
9、if(a+b=0.3) //不用做这样的测试。
10、浮点数值保存数值的空间是整数值保存内存空间的两倍。
NaN
11、任何数值除零等于NaN,NaN与任何值都不相等,包括NaN本身,alert(NaN==NaN);//false,is_NaN()函数。
12、alert(isNaN(NaN));//true。alert(isNaN("blue"));//true,不能转换为数值。
数值转换
13、Number():Number("00011");//11
14、parseInt()整理整数:parseInt("123blue") // 123。parseInt("22.5")//22。parseInt("10",[2,8,10,16]) //按不同进制转换。
15、parseFloat()。parseFloat("22.23.66") // 22.23
string
16、toString(): var age=11;age.toString(); //字符串11。String()。
object类型
17、在ECMAScript中,object类型是所有它的实例的基础。Object类型具有的任何属性和方法也同样存在于更加具体的对象中。
18、Constructor:创建对象的函数。
- hasOwnProperty():用于检查给定的属性在当前对象实例中是否存在。
- isPrototypeOf(object):用于检查传入的对象是否是另一个对象的原型。
- propertyIsEnumerable(propetyName):用于检查给定的对象是否能够使用for-in语句。
- toLocaleString():返回对象的字符串,与执行环境的地区对应。
- toString():返回对象的字符串表示。
- valueOf():返回对象的字符串、数值或布尔值。
19、BOM和DOM中的对象都是宿主对象,他们是由宿主实现提供和定义。ECMA不负责定义宿主对象,因此宿主对象可能不会继承object。
js本地对象、内置对象、宿主对象
20、宿主环境:一般宿主有外壳程序创建与维护,只有能够提供js引擎执行的环境都可称之为外壳程序。如:web浏览器,桌面应用系统,web浏览器和桌面应用系统造就的环境即宿主环境。
21、本地对象:独立于宿主环境的ECMA实现通过的对象。包括(Object、Function、Array、Boolean、Number、Date、RegExp(正则表达式)、Error、EvalError、ReferenceError、SyntaxError、TypeError、URLError)。本地对象就是ECMA定义的类(引用类型)。
22、eval()函数:可以把一个字符串当作一个JavaScript表达式一样去执行它。
23、内置对象:有ECMA提供,独立于宿主环境的所有对象,ECMA程序开发执行时出现。意味着开发者不必明确实例化内置对象,它已被实例化。
24、内置对象和本地对象的区别,共同点:都是独立于宿主环境。ECMA只定义了Global和Math两个内置对象(他们也是本地对象,根据定义,每个内置对象都是本地对象)。
25、Global对象:ECMA最特别的对象,因为实际它根本不存在,在ECMA中,不存在独立的函数,isNAN(),parselnt(),parseFloat方法,看起来是函数,实际上都是Global的方法。
26、宿主对象:由ECMA实现宿主环境提供的对象,理解为:浏览器提供的对象。所有BOM和DOM都是宿主对象。
27、自定义对象:开发人员自己定义的对象。
7、js错误捕捉
23、使用了try-catch,那么当出现异常的时候,IE浏览器会传递一个Error对象。
try{ sldfj // throw new Error("-2","输入的值不能大于10"); }catch(e){ for(var p in e){ document.writeln(p + “=” + e[p]); // alert("异常名字:"+e.name); // alert("异常号:"+e.number); // alert("异常的描述信息:"+e.description); // alert("异常的错误信息:"+e.message); } }
输出:name=TypeError message=’sldfj’ 未定义 number=-2146823279 description=’sldfj’ 未定义
24、js错误类型。
//TypeError——当遇到一个意外的类型时引发该异常对象,如未声明的变量。
//SyntaxError——在解析js代码时,其中的语法错误引发该异常对象。
//ReferenceError——使用一个无效的引用时引发该异常对象。
//EvalError——在错误的调用eval函数时引发该异常对象。
//RangeError——在一个数字型变量的值超出了其范围时引发该异常对象。
//URIError——在错误的使用encodeURI或者decodeURI函数时引发该异常对象。
8、操作符
valueOf(): var o ={ varlueOf:function(){ return -1; } } o--; //值变成数值-2
位操作符、逻辑操作符、关系操作符号、相当操作符号、赋值操作符号
9、语句
30、for-in是一种精准的迭代语句。可以枚举对象的属性。
for(var propName in window) { document.write(propName); //枚举window的所有属性。 }
31、for-in迭代到对象为null,undefined就会抛出错误。ECMA5修正这种行为,不抛出错误,而是不执行循环体。我兼容性,for-in之前检测对象不是null,undefined类型。
32、with语句的作用是将代码的作用域设置到一个特定的对象中。(with导致性能下降,调试麻烦,不建议使用)
理解参数
33、arguments包含函数的所有参数,访问:arguments[0], arguments.length传递了多少个参数。
34、ECMA中所有参数传递的都是值,不可能通告引用传递参数。
35、ECMA没重载,java重载(参数的类型,或者个数不同即可),ECMA的重载可以通告arguments实现。
作用域、变量、内存问题
变量
36、基本类型:值指简单的数据段。
37、引用类型:值指那些可能由多个值构成的对象。基本类型赋值是建立一个新值。
38、基本类型没有动态属性,引用类型可以添加动态属性。引用类型赋值是传引用。
传递参数
39、参数传递都是按值传的,在向参数传递引用类型的时候,会把这个值在内存中的地址赋值给一个局部变量,因此这个局部变量的变化会反映在函数外部。(##,**)。对对象进行重新定义,局部变量的变化不会反映在函数外部。
检查类型
40、基本数据类型:typeof,引用类型:instanceof 根据原型链来识别。
执行环境、作用域
41、在web浏览器中,全局执行环境是windows对象。某个执行环境中的所有代码执行完毕后,该环境被销毁(全局环境关闭浏览器或者网页时被销毁)。
作用域链
42、作用:保证对执行环境有权访问的所有变量和函数的有序访问。作用域链中下一个变量对象来自包含(外部)环境。一直延续到全局变量。
43、内部环境可以通过作用域链访问所有的外部环境。外部环境不能访问内部环境中的任何变量和函数。这些环境之间的联系是线性的,有次序的。每个环境都可以向上搜索作用域链,查询变量和函数名。任何环境不能向下搜索。
44、函数的参数也被当做变量来对待,访问规则和执行环境中的其他变量相同。
45、延长作用域链:try-catch 和 with
垃圾收集
管理内存
46、手工释放内存:globalperson=null
引用类型
47、object类型(js对象的创建方法):
var person = new Object(); person.name = "Nicholas"; person.age=29; // var person = { name:"Nicholas"; age:29}
48、var person = {} 与 new Object() 相同,推荐使用字面量表示法。
49、对象变量访问方法:person['name'],person.name
Array类型
50、
var colors = new Array(); var colors = new Array(20); var colors = new Array('red','blue','green');
51、length函数:数组的长度,它不是只读,还可以设置数组。
52、检测数组 value instanceof Array。 Array.isArray(value)。
转换方法
53、
- toLocalString()、toString()、valueOf()方法。
- 调用toString()是返回逗号拼接的字符串。
- valueOf还是数组。
- 为了创建字符串会调用数值每一项的toString()方法。
var colors = ["red","blue","green"]; // 创建一个包含3个字符串的数组。 alert(colors.toString()); //red,blue,green alert(colors.valueOf()); //red,blue,green alert(colors); //red,blue,green
由于alert()要接受的是一个字符串,所以所有会在后台调用toString()方法。
54、join方法
var colors = ['red','grenn','blue']; alert(colors.join(",")); //red,green,blue alert(colors.join("||")); //red || green || blue
55、栈方法:push()、pop()。栈LIFO(后进先出)
66、队列方法:FIFO(后进先出)。push(),shift()。unshift()在前端添加任意个数并返回新数组的长度。
67、重新排序:sort(),从小到大排序。reverse():反转顺序。
68、concat方法:基于当前数组的所以项创建一个新数组。
69、slice方法:基于当前数组中的一项或者多项创建一个新数组。
70、
- splice()方法:删除:可以删除任意数量的项,
- splice(0,2)会删除数组的前两项。
- 插入:向指定位置插入任意数量的项。
- splice(2,0,'red','green')会在当前数组位置2插入字符串red和green。
- 替换:splice(2,1,'red','green')会删除当前数组位置2的项,然后再从位置2开始插入字符串red和green。
71、位置方法:indexOf()方法从数组的开通(位置0)开始向后查找,lastIndexOf()方法则从数组的末尾开始向前查找。
72、迭代方法:every(),some()。numbers.every(function(item,index,array){return (item>2)}); 区别:every转入的函数必须对每一项都返回true,方法才返回true。some有一项是true就返回true。
73、
- filter:返回数组,利用指定函数确定是否在返回的数组中包含的某一项。
- map:返回数组,这个数组的每一项都是在原始数组中对于上运行传入的函数结果。
- forEach:没有返回值。只是对数组中的每一项运行传入函数。与for类似。
74、缩小方法:reduce() 和 reduceRight() 。迭代数组的所有值,构建最终返回值。reduce从数组的第一项开始,遍历到最后。reduceRight从数组最后一项开始,向前遍历到第一项。
DATA类型
75、toDataString()、toTimeString、toLocaleDateString、toLocaleTimeString、toUTCString。
RegExp类型
76、
function类型
77、函数是对象,函数名是指针。
function sum(num1+num2) { return num1+num2; } alert(sum(10,10)); //20 var anotherSum = sum; alert(anotherSum(10,10)) ;//20 sum = null; alert(anotherSum(10,10)); //20
78 、没有重载(深入理解):将函数名想象为指针,助于理解为什么ECMS没有重载。
79、函数声明与函数表达式:解析器会先读取函数声明,并使其在任何代码之前可用。至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被解释执行。
aleft(sum(10,10)); function sum( num1+num2) { return num1+num2; } //以上代码正确执行 aleft(sum(10,10)); var sum = function ( num1+num2) { return num1+num2; }
//以上代码执行产生错误,函数位于一个初始化语句中,而不是一个函数声明。
80、作为值的函数:ECMA函数名本身就是变量,不仅可以像传递参数一样把一个函数传递给另一个函数,还可以将一个函数作为另一个函数的结果返回。
function callSomeFunction(someFunction,someArgument) { return someFunction(someArgument); } function add10(num) { return num+10 } var result1 = callSomeFunction(add10,10) alert(result1 ); // 10