基于对象。JavaScript拥有对象,可以包含数据和处理数据的方法。对象可以包含其他对象。它没有类,但却有构造器可以做类能做的事,包括扮演类变量和方法的容器的角色。它没有基于类的继承,但它有基于原型的继承。
目前绝大多数浏览器中都嵌入了某个版本的JavaScript解释器。这样它就允许可执行的内容以JS的形式在用户客户端浏览器中运行。
<noscript>您的浏览器不支持JavaScript,请检查浏览器版本或者安全设置,谢谢!</noscript>
<noscript></noscript>
是一种防御性编码,如果用户浏览器不支持JS或者设置了过高的安全级别,那么就会显示出相应的提示信息,避免在用户不知情的情况下停止运行或者得到错误结果。
JS通过浏览器对象接口访问和控制浏览器元素,通过DOM接口访问和控制HTML文档,通过给文档定义“事件处理器”的方式响应由用户触发的交互行为。Document是JS访问页面文档对象的主要方式。Window提供了对浏览器、窗口、框架、对话框以及状态栏的访问方法。
要避免定义过多的全局变量。在JS中,利用闭包是一种代替临时变量的好习惯。
在某些特定情况下,定义在函数体内部的匿名函数在执行的过程中形成“闭包”。
void是JS的一个特殊的运算符,它的作用是舍弃任何参数表达式的值,这意味着要求解析器并计算参数表达式内容,但是却忽略其结果。如果刻意去检查void运算的返回值,会发现它返回一个undefined标记(事实上任何一个不带return指令的函数运算的默认返回值都是undefined)在浏览器的缺省行为中,undefined阻止了页面的跳转。
undefined在一定情况下可以取代void(0);
undefined代表“无”;null代表“空”。空依然是一种存在,而无则是存在的对立面。由于JS没有强制检验对象存在的机制,所以它承认无的概念。任何一个未经定义和使用的标识,均可以用“无”来表示。当你直接引用一个未声明的标识,或者声明了一个变量却未对其进行赋值,那么typeof操作返回的结果将是undefined。
在浏览器地址栏输入:
JavaScript:alert(typeof(x)); >>> undefined 未声明
JavaScript:var x;alert(typeof(x)); >>> undefined 未赋值
JavaScript:var x=null;alert(typeof(x)); >>>object
客户端JS的生命周期起始于浏览器开始装载某个请求的特定数据,结束于浏览器发起一个新的请求(通常意味着页面的跳转或者刷新)。
进一步细分:客户端生命周期可以划分为从页面数据被装载到页面数据装载完毕的初始化阶段以及页面数据装载完毕一直到新的请求被发起之前的运行阶段。在前一个阶段里,JS代码被浏览器解析,运行环境被初始化,函数和闭包被建立,而那些可以被立即执行的指令被执行并实时地得到结果。在后一个阶段里,完成初始化的程序化环境进入了一个缺省的等待消息的循环,捕获用户操作引发的事件并做出正确响应。
将JS代码放<head>
头部是在生命周期的初始化阶段执行(更安全,指令不会对装载期的文档内容产生影响,脚本指令被注册到body的onload事件中执行<body onload="PageLoad()">
元素的onload事件将在元素被完全加载后由浏览器发起);放在<body>
是在运行期内执行。(可能会导致文档数据不能加载完全)
一个比较好的习惯就是把除声明之外的所有的脚本指令都放到运行阶段来执行,这样避免了因为初始化期间的DOM元素加载失败或者低级的次序问题而导致脚本失效。
提交表单操作是浏览器提供的一种数据交互的默认方式。现在更多的应用系统采用XML HTTP作为主要的数据交互方式。XML HTTP逐渐取代传统的提交表单,标志着Ajax技术的日趋成熟。
学会合理利用禁忌所带来的安全性,只有在必要的时候才去破解它们,是成为一个优秀程序员所必需掌握的技能。
利用JavaScript的常见攻击有以下几种:
1.伪造表单提交目的地,从而窃取数据。
HTML表单的提交有form的action属性决定,而JS具备从客户端修改form的action的能力。
<body>
<form name="myForm" action="a.action">
<input name="data" type="text" value="a"/>
<input type="submit"/>
</form>
</body>
以上代码定义了一个将数据提交到a.action的表单,在浏览器中访问该页面,点击提交表单按钮,input框中的内容将被提交到a.action处理域。但是在提交表单之前,先清除浏览器中原地址栏中的内容,并输入JavaScript:document.myForm.action="b.action;void(0);"
之后回车,那么数据实际将被提交到b.action处理域中。
2.伪造数据,绕过合法性验证
<form name="myForm" action="a.html" onsubmit="return !/\s+/.test(document.myForm.textData.value) && /\d+/.test(document.myForm.numData.value) || alert('请输入正确的格式!') || false;">
<input name="textData" type="text"/>
<input name="numData" type="text"/>
<input type="submit"/>
</form>
以上代码对表单的合法输入进行校验,要求用户输入的textData域非空,并且numData域为数字串,如果输入非法的话则弹出提示信息阻止表单的提交。
在浏览器 输入JavaScript:document.myForm.onsubmit=function(){return true;};void(0);
轻而易举地便让表单校验失效。
所以,依赖客户端的校验是不安全的。
3.采集数据,窃取网页内容
将一些合法网站上的数据内容通过HTTP请求等方式获取并发布到自己的网页上。
最原始的数据采集源于浏览器对框架的支持。由于主流浏览器上支持任意个数的嵌套框架,因此,一些人将他人制作的网页嵌入自己页面的框架中,作为自己网站内容的一部分。网络上的“盗链”形式的资源窃取由来已久,防御手段是在页面上加入如下代码:
<script>
if(self != top){
top.location = self.location;
}
</script><