javascript你真的知道了吗?
下面是我对javascript的一些总结,虽然这些问题很多人都知道,但是还是有很多人并不知道是为什么,例如为什么我们在调用方法的时候有时候加小括号,有时候不加小括号,大多数的人都知道什么时候该加什么时候不该加,但是你真的知道为什么吗?
Javascript是大小写敏感的语言。我的这篇文章大小写很不规范,请大家见谅。
我们都知道javascript是对操作网页的行为,在web开发过程中有着举足轻重的地位,主要是用来做一些网站特效,给用户良好的体验。
其实说到网站特效,开发人员都会做,网上到处都是源代码,要什么特效直接复制改下代码就OK,但是却很少人去了解javascript的内在。
说到javascript不得不说的就是dom,也就是document object model(文档对象模型)。
我们说我们的浏览器只接收三种语言,html,css,javascript。当我们在浏览器中输入网址的时候,服务器会将服务端的代码解释成浏览器认识的语言。然后返回给我们的浏览器。

其实在浏览器中是有解析器的,以前的浏览器都是用的同一个解析器,现在ie chrome ff等浏览器都有自己的解析器,浏览器将接受过来的代码和语法解析出来,翻译成文字和图形界面。当我们浏览器解析的时候,遇到图片的时候,浏览器又会再发一个请求,向服务器请求一个图片。所有很多网站都把很多的图片放在一张图片上,这样我们浏览器就只需要向服务器请求一张图片。
其实,浏览器接收到服务器发回的html代码后,进行解析,并生成dom树对象(存在浏览器的缓存里)这个dom对象并不只是包含了html等标签节点,还包含有document,和window,每一个节点都是node的实现对象
dom就是把html的页面模拟成一个对象,就像xmldocument一样,把xml模拟成一个对象,提供了操作各个节点的方法。我们操作网页的元素,就是操作页面的dom,
浏览器并不是按照html代码生成图形界面的,而是根据我们解析出来的dom树生成图形界面的
引用类型:我们可以统称为object;所有的引用类型都是object的子集。
先我们看下数组Array是什么东西,一般都说Array是一个以序号为key,以值为value的键值对,也就是json。确实可以这样理解。我们举个例子:
Var arr=new Array();
arr[“a”]=1;
arr[“b”]=2;
for(var k in arr){
alert(k+”----”+arr[key]);
}
我们得到的结果是:a----1;b----2;
这样似乎验证了我上面说的结论。
但是我们改一行代码,Var arr=new object();我们可以看到同样的效果。
其实数组跟字典根本没关系,在js中的object是一个混合的集合,可以存放任何类型的键值对。我们的Array只是我们object中的一个子集而已。Array就是一个数组,但是js中的数组里面提供push(),pop()等等这些方法,数组就是模拟一个栈。
下面我们说说typeof和instanceof的区别,typeof是获取对象的类型,而instanceof是获取对象的实例。
var s=“张三”;
alert(typeof s);
我们可以看到弹出一个“string”的消息框;
Var s=”张三”;
alert(s instanceof String);
大家可以试试看会弹出什么结果。
其实结果并不像我们想想的那样弹出一个true而是弹出了false。
这样我们就很郁闷了 ,难道s不是string?似乎我们有种被调戏的感觉。
因为String是值类型,我们的 instanceof值能判断引用类型。
我们来验证一下。
Var arr=new array();
Alert(arr instanceof Array);这个时候会弹出true;
我们再用typeof判断一下Alert(typeof arr)这个时候会返回object。
我们总结一下:typeof用于获取对象的类型,,用于判断值类型的对象,如果遇到了引用类型,那么久返回object。
Instanceof用于判断对象的实例,只能去判断引用类型,如果遇到值类型的话就返回false。
我们做网站一般都会建一个外部的js文件,我们来看看外部js文件和内部js的区别。
外部js代码
<head runat="server">
<title></title>
<script src="JScript1.js" type="text/javascript"></script>
</head>
<body>
<form id="form1" runat="server">
<div>
内容。
</div>
</form>
</body>
</html>
1.我们会看到当我们弹出对话框的时候,页面上并没有任何内容。
<head runat="server">
<title></title>
<script type="text/javascript">
alert("内部js")
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
内容。
</div>
</form>
</body>
</html>
2.我们会看到弹出对话框的时候还是没有显示内容。因为代码是由上而下执行的 。当我们弹出对话框的时候并没有执行到下面的代码。那由此就产生的很多问题,我们要在js代码中操作dom节点,而我们的js代码一般都放在head标签中,那当我们执行js代码的时候都下面的html代码都还没加载。这就出来了一个onload事件,这个事件就是当我们的html代码加载完毕的时候执行的。
看下面的代码
<head runat="server">
<title></title>
<script type="text/javascript">
Function load()
{
alert("内部js");
}
</script>
</head>
<body onload=” load()”>
<form id="form1" runat="server">
<div>
内容。
</div>
</form>
</body>
</html>
3.这个时候我们会看到我们的页面是先显示内容然后再弹出消息框的 。
我们再来看下这段代码
<head runat="server">
<title></title>
<script src="JScript1.js" type="text/javascript"></script>
<script type="text/javascript">
function load() {
alert("内部js")
}
</script>
</head>
<body onload="load();">
<form id="form1" runat="server">
<div>
内容。
</div>
</form>
</body>
当弹出“外部js”的时候,我们的页面并没有显示内容,这似乎让我们想到了什么 。
当我们的外部js文件执行的时候会中断当前浏览器的运行。
那如果我们的外部js需要对dom树进行操作,那就无法完成。
所以一般情况下我们会把js文件放在页面的下面。这样就没问题了。
下面说说一个最容易晕而我们都知道该怎么用的问题,那就是我们调用一个方法什么时候该加小括号,什么时候不该加小括号。
我们定义这么一个方法
Function show()
{
Alert(“我真帅”);
}
下面的html中我们家一个input标签。
<input type=”button” id=”btnLogin” onclick=”show();” />
这个时候加括号代表的是我们调用上面的show方法。
这个都没什么好说的 。
我们去掉onclick事件的代码,
我们在js代码中动态的去操作执行。
Document.getelementbyid(“btnLogin”).onclick=show()
首先第一点,这里有等号,也就是说等号右边的先执行,
我们知道,当我们的方法加上小括号的时候就是执行方法 ,这里我们看下 。
我们相当于把show方法执行后的结果赋值给onclick这个事件,而我们的show方法并没有指定返回值,所有执行后返回的是undefined,就相当于我们把undefined赋值给了onclick这个事件,而我们onclick这个事件是需要去执行一个方法的,我们的方法能去执行undefined吗??
Document.getelementbyid(“btnLogin”).onclick=show;
这样才是正确的,把上面的理解了,对于这个就很好理解了 ,我们没有加小括号,就是说我们将这个方法对象赋给onclick这个事件,再说的悬乎一点,就是将这个方法的指针赋给onclick,当onclick触发的时候就通过方法指针来调用方法里面的内容。

浙公网安备 33010602011771号