javascript全面总结(可能别人看的有点乱,不过多看几遍就习惯了,每个*是一个知识点集合)
2010年07月22日
javascript全面总结(可能别人看的有点乱,不过多看几遍就习惯了,每个*是一个知识点集合) 收藏
*
1.JavaScript引擎是单线程运行的,浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序
2.使用定时函数模仿多线程(还是模拟不了多线程的,只有执行完一个function才会去执行另外一个function)
*
1.浏览器中的JavaScript引擎是基于事件驱动的,这里的事件可看作是浏览器派给它的各种任务
这些任务可以源自JavaScript引擎当前执行的代码块:
a.如调用setTimeout添加一个任务;
也可来自浏览器内核的其它线程:
a.如界面元素鼠标点击事件,
b.定时触发器时间到达通知,
c.异步请求状态变更通知等.
*
1.GUI渲染线程与JavaScript引擎线程是互斥的(因为JavaScript脚本是可操纵DOM元素,在修改这些元素属性同时渲染界面,那么渲染线程前后获得的元素数据就可能不一致了)
2.GUI事件触发线程与JavaScript引擎线程是不互斥的(JavaScript脚本的执行不影响html元素事件的触发)
3.定时触发线程与JavaScript引擎线程是不互斥的(JavaScript引擎是单线程的,处于阻塞线程状态就计不了时,定时事件也是异步事件)
*
JavaScript引擎来说,在处理队列中的各任务处理方式都是一样的,只是处理的次序不同而已
*
1.ajax异步请求:由浏览器为XMLHttpRequest新开了一个线程
2.JavaScript引擎始终是单线程运行回调函数,具体点即还是单线程运行onreadystatechange所设置的函数
*
JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里
*
cookie
1.一个cookie 实际就是一个字符串属性,一次就得到了属于当前文档的所有cookies。
(当你读取cookie的值时,就得到一个字符串,里面当前WEB页使用的所有cookies的名称和值)
2.每个cookie除了 name名称和value值这两个属性以外,还有四个属性。这些属性是: expires过期时间、 path路径、 domain域、以及 secure安全。
3.一个完整的cookie格式 ---- 名称=[; expires=][; domain=][; path=][; 安全]
(可以用任何顺序设置)
4.使用js设置cookie格式 ---- document.cookie = "username=" + escape(form.username.value);
( escape() 函数非常重要,因为cookie值里可能包含分号、逗号或者空格。)
5.使用js读取cookie格式 ---- var allcookies = document.cookie;
6.设置过期时间(15分钟):
var expiration = new Date((new Date()).getTime() + 15 * 60000);
expires = expiration.toGMTString();
7.找别人写好的cookie操作类
8.第1行是Cookie名称。
第2行是Cookie的值。
第3行是Cookie所属站点的地址。
第4行是个标记值。
第5行为过期时间的低位(时间为Windows下的FILETIME格式)。
第6行为过期时间的高位。
第7行为创建时间的低位。
第8行为创建时间的高位。
第9行总是为"*",Cookie记录分隔符(一个Cookies文件可以记录多个记录结构)。
*
cookie试验结果
1.document.cookie得到sky@~~local~~[4].txt中的所有记录的名称= (每个"*"代表一条记录)
2.cookie是根据"名称="中的"名称"来唯一定位sky@~~local~~[4].txt中的记录
*
cookie欺骗
*
简单数据类型不是对象,所谓"对象化",就是可以将数据和代码组织成复杂结构的能力。
*
null与undefined
1.null是关键字;undefined是Global对象的一个属性;
2.null是对象(空对象, 没有任何属性和方法),undefined是undefined类型;
3对象模型中,所有的对象都是Object或其子类的实例,但null对象例外;
4.null"等值(==)"于undefined,但不"全等值(===)"于undefined;
5.运算时null与undefined都可以被类型转换为false,但不等值于false。
*
JavaScript的"预编译":在同一段程序的分析执行中,定义式的函数语句会被提取出来优先执行。函数定义执行完之后,才会按顺序执行其他语句代码。
*
函数与对象
1.完全可以把函数当对象来用(function类型的东西都是和object类型一样的东西,这种东西被我们称为"对象")
2.函数比一般的对象多了一个括号"()"操作符,这个操作符用来执行函数的逻辑
3.对象量子论,那么答案一定是:波粒二象性!(函数既有对象的性质又有数组的性质)
*
对象和函数可以象数组一样,用属性名或方法名作为下标来访问并处理
1.可以将对象当数组以属性名作为下标来访问属性 //alert(anObject["aProperty"]);
2.可以将对象当数组以方法名作为下标来调用方法 //anObject["aMethod"]();
3.可以将函数当数组以属性名作为下标来访问属性 //alert(aFunction["aProperty"]);
4.可以将函数当数组以方法名作为下标来调用方法 //aFunction["aMethod"]();
*
this
一般编程语言的this就是对象自己,JavaScript中的this并不一定是函数本身所属的对象
根据this参数,您可以访问到"这个" 对象的属性和方法。(一般对象语言中,方法体代码中的this可以省略,JavaScript不能省略)
*
构造函数
1.可以使用 new 关键字来调用一个构造函数
2.var object=new functionName(); //new操作符创建了一个对象,紧接着就将这个对象作为this参数调用了后面的函数
*
new
1.var object=new functionName();等同于
var object=new functionName;等同于
var object=Function(){...};object(); 等同于
var object=functionName;object();
2.我们就可以这样理解,JavaScript先用new操作符创建了一个对象,紧接着就将这个对象作为this参数调用了后面的函数。(JavaScript内部就是这么做的)
function MyFunc(){};var anObj = new MyFunc(); 等同于
function MyFunc(){};var anObj = {};MyFunc.call(anObj); //new一对象,就是把一函数的所有属性都给一空对象。
3.通过使用 new 去调用函数,对象会持有一个无意义的原型对象。这只会浪费内存而不会带来任何好处。
4.唯一需要用new的地方:适用构造函数--即new可以把代码变数据(或者说是函数变对象)
*
JavaScript里的对象就是字典结构,JSON就是JavaScript对象最好的序列化形式
*
call
1.把a对象的方法放到b对象上执行,那么b对象上的属性被a对象的方法使用了 //a对象.方法名.call(b对象);
2.通过call实现继承,b对象继承a对象 //在b对象中写:a对象.call(this);
3.适用两个call实现多继承
*
类与对象
1.JavaScript的函数具有"类"的所有特征。
2.用构造函数操作this对象创建出来的每一个对象,每一个对象中都存在一个副本(都有各自的成员变量和方法,即--对象)
*
关键字
1.JavaScript的关键字都是小写
2.null,instanceof,debugger,typeof,function,也是关键字
3.undefined是一种简单数据类型,是Global对象的一个属性
*
内置对象
1.JavaScript内置对象都是大写字母开头
2.Object,Function,Number,String,是内置对象
*
alert
1.alert是window对象的方法
2.alert(new String("abc"));返回的是: abc
3.alert(var a=[1,2,3]);返回的是: 1,2,3
*
event
1.event是window对象的对象
2.获取当前鼠标位子:window.event.clientX window.event.clientY
*
JavaScript
1.JavaScript有5种简单数据类型:undefined,null,boolean,number,string
2.JavaScript有1种复杂数据类型:object (包括:数组、内置对象-即new '类名'、json)
3.JavaScript代码只有一种类型:function (包括:"类")
4.typeof(undefined)返回undefined
typeof(null)返回object
typeof(var boolean)返回boolean (需要定义一个变量)
typeof(NaN)和typeof(Infinity)返回number (都是形容数据的:not a number,无穷的)
typeof(var string)返回string (需要定义一个变量)
typeof(function functionA)返回function (需要定义一个函数)
注:typeof返回的只有undefined,null,boolean,number,string,object和function(数组返回的是object)
*
//JavaScript就不应该与面向对象的语言去比较--new可以把代码变数据(或者说是函数变对象),
function定义的所谓代码,其实是一个特殊的对象,即有一个prototype属性
http://blog.csdn.net/niuyongjie/archive/2009/11/15 /4810835.aspx
*
eval
1.eval函数将把最后一个表达式或者语句所包含的值或引用作为返回值。
2.加上圆括号的目的是迫使eval函数在评估JavaScript代码的时候强制将括号内的表达式转化为对象,而不是作为语句来执行。举一个例子,例如对象字面量{},如若不加外层的括号,那么eval会将大括号识别为JavaScript代码块的开始和结束标记,那么{}将会被认为是执行了一句空语句。
*
得到对象的所有属性
for(x in 对象名)alert(x); //取得属性名
for(x in 对象名)alert(对象名[x]);//取得属性值
*
prototype
1.构造函数的prototype上定义的方法可以通过对象直接调用到,而且代码是共享的
2.当从一个对象那里读取属性或调用方法时,如果该对象自身不存在这样的属性或方法,就会去自己关联的prototype对象那里寻找;如果 prototype没有,又会去prototype自己关联的前辈prototype那里寻找,直到找到或追溯过程结束为止
3.在JavaScript内部,对象的属性和方法追溯机制是通过所谓的prototype链来实现的
4.对象内置的原型对象应该是对外不可见的(除firefox)
5.原型链的最末端,就是Object构造函数prototype属性指向的那一个原型对像
6.使用prototype动态扩展的方法即可被先前建立的对象立即调用
7.给JavaScript内置对象添加属性
String.prototype.trim = function String$trim() {
if (arguments.length !== 0) throw Error.parameterCount();
return this.replace(/^\s+|\s+$/g, '');
}
注:JavaScript是动态对象语言,指的是可以动态的为一个已经存在的对象添加属性
8.在一个function中,定义私有变量用"var 变量名;",定义公有属性用"this.属性名;"
9.JavaScript组织代码的风格:
a.闭包模型:在函数体内使用this属性来创建"类"的方法 (代码优美,但是内存管理较乱)
b.原型模型:在函数体外使用prototype属性来创建"类"的方法 (代码较乱,但无内存管理问题)
c.JSON形式:直接添加方法,创建一个对象 (代码优美,但是只是一个实体)
*
constructor
1.var test=new Boolean();test.constructor==Boolean;//可理解为类名,即java中的obj.class(constructor是用function的原型--即此函数的具体代码,常称为此类(其实就是此函数名)的构造方法)
2.function有一个prototype属性,使用new生成的对象就没有这个prototype属性(只有function类型才有prototype属性)
3.function定义的对象中有prototype属性,这个prototype属性指向一个prototype对象
4.prototype对象中有一个constructor属性,这个constructor属性指向一个constructor对象
*
$,是指prototype定义的一类方法
$("id") 得到的是页面id为"id"的元素
$F("id") 得到的是页面id为"id"的元素的值,这是只读的,不可写
*
运算符
new (1.创建一个没有成员的对象。 2.为那个对象调用构造函数,传递一个指针给新创建的对象作为 this 指针。 3.然后构造函数根据传递给它的参数初始化该对象。)
typeof (typeof 语法中的圆括号是可选项)
void (运算符对表达式求值,并返回 undefined)
instanceof (object 是 class 的一个实例,则 instanceof 运算符返回 true。格式:instanceof object)
delete (从对象中删除一个属性,或从数组中删除一个元素。格式:delete expression)
*
页面路径
var parent_url = window.parent.location.href.toLowerCase();
var where = document.referrer.toLowerCase();
var self_url = document.location.href.toLowerCase();
*
闭包、作用域
1.var关键字决定了哪个函数是特定变量的作用域的终点
2.作用域链是用来描述一种路径的术语,沿着该路径可以确定变量的值(查找变量最近定义的值)
如:function myFunction (){myVariable = 'inside';}
var myVariable = 'outside';
myFunction ();
alert(myVariable); //提示'inside'
3.内部函数即使在外部函数执行完成并终止之后,仍然可以访问其外部函数的属性--闭包
注:一个函数中的内部函数尽量不要使用外部函数的变量
*
javascript内存泄露
*
同源策略
1.同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性
2.iframe等方式,可以加载其它域的页面,但两个域的脚本不能互相交互
3.突破同源策略方法:(跨域访问)http://zhuhaifeng.javaeye.com/blog/437154
a.document.domain+iframe的设置 (即两个子域页面设置作用域为父域)
b.动态创建script (浏览器不禁止在页面中引用其他域的JS文件,即用标签引入其他域的js即可,如"盗cookie、xssShell")
c.利用iframe和location.hash URL中的锚点(链接)名称
d.利用flash
*
模式对话框
var returnValue = window.showModalDialog('xxx.html','newwindow','dia logHeight:300px,dialogWidth:400px,center:yes,toolba r:no,menubar=no,scroll:yes, resizable:no, status:no');
使用此方法打开一个模式窗口
1.window.showModalDialog()运行完以后(即关闭了打开的模式窗口后)才会运行此后的js语句。
2.刷新打开此模式窗口的父页面:可以在打开的xxx.html窗口中使用javascript:window.returnValue=1;来设置window.showModalDialog()的返回值,然后在调用window.showModalDialog()方法后面对返回值进行判断决定是否刷新页面(即window.location.reload())