javascript特性小结

来源:互联网 发布:季汉 知乎 编辑:程序博客网 时间:2024/05/18 02:07
数组中的length属性,表示0到最末一位的长度,并不是表示数组中的实际的个数,如 a = []; a[5] = "4"; a[1000] = 58; a.length是1001。表示的0到1000的总长度。
JavaScript只给数组中实际的存储了value的index分配内存。index超出0~2的32 -1,均视为数组的属性。


Function被定义之后,可以作为两种方式来运用,一种作为函数,直接调用(使用();表示调用函数),函数体没有返回语句时,返回undefined,第二种作为纯对象来使用(使用new操作符和构造器),返回这个对象的引用。


Function被定义之后,prototype属性自动被创建,初始化且作为函数的一个属性。prototype初始时有一个属性constructor(引用构造器函数),没有其它的属性,prototype不能引用对象本身的属性,而当属性被添加在prototype之上时,这些属性可以作为通过构造器初始化的对象的属性。
即prototype添加的属性,在所有对象上被应用,所有的对象共用一个prototype.


对象的属性分为自身拥有的属性和prototype拥有的属性,但是分别对属性的访问方式是一致的。prototype不属于OwnProperty.


每个Class有一个prototype属性和一组properties.所有的实例都从prototype继承属性,
当一个对象访问一个属性的时候,首先查找自身是否拥有这个属性,如果没有查找到,则查找prototype是否有这个属性。
当一个对象的一个属性被write的时候,如果对象没有这个属性,对象不会去prototype中查找这个属性,它会创建一个这样的属性,并对它进行write.如果此时prototype也有这个属性存在,则通过对象访问这个属性,prototype的那个属性会被隐藏。


不仅自定义的类可以拥有prototype属性,内置的String,Date也可以拥有prototype。prototype只应用在类级别的对象之上。不应用在变量之上。


不要对Object.prototype添加任何的属性,因为任何对象都是从Object继承而来,如果在Object.prototype添加了属性,任何一个对象都会拥有这些属性,会给你产生迷惑。


undefined: 已声明但没有赋值的变量(一个变量声明但没有赋值的时,它的值就是undefined),
或一个不存在的对象属性(访问一个对象中不存在的属性时,返回undefined)。
访问一个对象中不存在的函数(相当于首先访问这个对象不存在的这个属性,然后作为一个方法进行调用.即undefined()调用,会出现异常)
null:表示无值.
undefined,null的区别就是二者的typeof(undefined)和typeof(null)返回的值不相同,
typeof(undefined):undefined typeof(null):object
对变量或者对象的属性进行判断是否为undefined和null时, if(o == null) 和if(o=undefined)效果是一致的.
if(o.test == null) 和 if(o.test == undefined)效果也是一致的.
可以这样理解, <1>一个变量开始不存在,然后对它进行操作,会出现异常.
<2>一个变量o开始已经存在(一个变量声明但没有赋值的时,它的值就是undefined,但也可以赋值为null),
如果它的值是null,那么typeof(o):"object",它的值是undefined,那么typeof(o):"undefined"
<3>一个对象o的属性p不存在,o.p返回undefined.如果o.p()或o.p.property会出现异常(相当于首先访问这个对象不存在的这个属性,然后作为一个方法进行,即undefined()或null()调用,会出现异常).
<4>一个对象o的属性p存在,但p是null或undefined,对一个是null或undefined的对象调用属性(含方法)会出现异常.
left||right 操作符,首先对left进行null,undefined判断,如果是true,返回left,如果是flase,返回right.
在javascript中对一个变量或者对象的一个属性判断真假时,判断它的值是否为null或undefined.


在定义JavaScript类时,在类中需要定义函数,因为函数是有自己的一个scope,对类中属性的引用需要this指针.


JavaScript所有的函数都是类级别上对象,可以任意的添加属性.也可以说在JavaScript中类也可以动态的添加属性
当我们定义一个函数,有一个构造器,借助new(不使用new,返回undefined)用来初始,并产生对象.此时函数本身也是一个对象,拥有的一个constructor属性,没有其它属性
函数定义完毕之后,我们给这个函数添加属性(不使用prototype),因为函数本身也是一个对象,所以可以添加属性,但这些属性仅仅属于这个看作对象的函数的属性。
而当我们使用new 构造器实例化另外一个对象o之时, o对象只拥有函数定义之时所拥有的属性,不包含函数在外部添加进入的属性,添加的属性可以通过prototype来共享。可以看出使用new 和构造器实例化出的对象和函数对象本身是不同的.
可以这样理解:在我们定义函数之时,函数的名字代表一个变量,这个变量引用着这个构造器,它本身没有其它的任何属性。所以JavaScript所有的函数都是对象,可以任意的添加属性.


在使用JavaScript比较操作符时,JavaScript首先调用Object的valueOf()方法,如果这个方法返回primitive value,那么就比较这些值。


JavaScript是基于prototype实现继承的,子类继承父类prototype中的属性。在访问对象中属性时,首先在对象的properties中查找,然后去prototype中查找,然后去object的prototype中查找。


primitive类型有三类,number,boolean,string.
typeof null is "object" typeof undefined is "undefined" typeof 数组变量 is "object" typeof 函数标识符 is "function"
typeof 5 is "number" typeof true is "boolean" typeof "test" is "string"
当知道一个变量不是primitive类型或function类型,则可以使用instanceof操作符知道变量更多的信息。
然而如果typeof f == "function"  f instanceof Function   和   f instanceof Object   也是true.


function 这个关键字也可以看作C++,Java中的class关键字,它就是用来定义类,表明我们正在定义一个类。
typeof Array,Date,Number,Boolean,String  返回  "function"  typeof Math  返回 "object".


客户端JavaScript
一个相同的HTML页面只含有一个JavaScript运行环境。在HTML页面中JavaScript按<script>标记出现的先后顺序执行,外部的.js文件按导入的先后顺序执行。
在HTML的<head>标记中指定页面默认的script语言,<meta http-equiv="Content-Script-Type" content="text/javascript">
实际上,web browser默认的script语言是javascript.
如果你期望改变默认的script语言,<script type="text/javascript"></script>
<script type="text/javascript" language="JavaScript"></script>language属性不是标准,但在 HTML 4之前,已作为一个事实的标准。使用它可以使script向后兼容。
<script defer>defer属性可以延迟这个script片段的执行,在HTML解释器遇到<script>标记时,会停下来让JavaScript解释器解释这段script.defer属性可以延迟这个执行,
让HTML解释器继续执行,被延迟的<script>片段以后被执行的时间是不固定的(IE是唯一支持defer属性的,至少IE7执行的时间是不固定的,可能在遇到下一个没有defer属性<script>片段之前或之后执行,所有的defer<script>执行的顺序也是不相同的)。但在onload事件之前。


在客户端javascript中,<!--这个标记可以看作是一行注释的开始,在这个标记所在的行上,如果有代码在<!--之前,会执行,在<!--之后,不会执行。
-->这个也表示一行注释,如果有代码在-->之前,不会执行,不能有代码放到-->之后,否则产生错误。


void 操作符用法格式如下: 
1. javascript:void (expression)
2. javascript:void expression 
expression 是一个要计算的 JavaScript 标准的表达式。表达式外侧的圆括号是可选的,但是写上去是一个好习惯。
可以使用 void 操作符指定超级链接。表达式会被计算但是不会在当前文档处装入任何内容。void 运算符对表达式求值,并返回 undefined。在希望求表达式的值,但又不希望脚本的剩余部分看见这个结果时,该运算符最有用。
在HTML页面加载和解析的时候,document.write输出的HTML标记会插入到<script>所在的位置。onload发生在HTML页面加载和解析完毕。


核心javascript没有包含任何的线程机制,客户端的javascript是单线程。
如果我们想在DOM文件加载完毕,而不是整个HTML包含图片等还未加载的东西,我们需要激发事件:
在IE 利用其独家支持的 条件注释 配合 script defer 属性
<!--[if IE]><script defer src="ie_onload.js"></script><![endif]-->  
在Mozilla
document.addEventListener("DOMContentLoaded", function(){alert("DOM加载完毕!")}, null);
在加载HTML页面的时候,用户就可以与页面交互,不需要等到HTML加载和解释完毕,和onload事件之后。


javascript有same-origin的策略,来自同一个same-origin的script能相互的操作document.
相同host,相同port。才是same-origin.并且即使host,port,而http和https也不是属于同一个origin.
设置同一个document.domain为相同的值,same-origin的约束会放宽.
domain value must have at least one dot in it; you cannot set it to "com" or any other top-level domain.


window的属性
<1>location.
location.search属性,返回?及?之后跟的一串字符串。
window.location = "http://www.yahoo.com";
window.location.href="http://www.yahoo.com";
两种用法都是一样的。
location有两个方法reload.replace.
reload重新加载当前页面。
replace替换掉当前页面,加载新的指定页面。此时,在history对象中也是替换掉当前页,把新加载的页面放入history对象之中,不是在history中添加。
document.location,window.location在IE和firefox中实现的机制不相同,
document.location = "http://www.yahoo.com";document.location.href="http://www.yahoo.com";
window.location = "http://www.yahoo.com";window.location.href="http://www.yahoo.com";
在IE会作为新的item添加到histroy中,firefox不会作为新item,它是替换掉当前的item.
<2>history
back( )
forward( ) 
go( )接受一个整数,可以是整数,也可以使负数。
firefox在window对象上支持back()和forward().
<3>
除IE,从window对象获取窗口的相关信息。
整个窗口的size
window.outerWidth;
window.outerHeight;
窗口左上角的位置(以桌面的左上角为坐标原点)
window.screenX;
window.screenY;
document的size,不包括工具栏,菜单,状态栏,滚动条,标签兰,等
window.innerWidth;
window.innerHeight;
在一个document显示在页面左上角的位置(如果页面有多个document,即有<HTML>多个,每个得document显示在screen上的位置是不同的)
window.pageXOffset;
window.pageYOffset;
以上均为只读属性。
有三个坐标,首先screen坐标系,表明整个浏览器,它以桌面左上角为原点,然后window坐标系,指明window的长,宽,以window的左上角为原点。不包含工具栏等。
然后是document坐标系,指明每个document中各自元素的位置。
<3>screen有关浏览器整个窗口大小的信息
<4>Navigator 浏览器版本和名字的一些信息。
appName 名字
appVersion 版本
userAgent 客户端信息,没有标准支持,最好不使用。
appCodeName 浏览器实现编码名字。IE,firefox,都是"Mozilla".
platform 硬件的运行环境。

打开窗口
window.open()可以接受四个参数,返回打开窗口的引用。
(参数1)新窗口的URL.如果是null或""(空字符串),则打开一个空的窗口。
(参数2)窗口的名字,如果这个相同名字的窗口已经存在,则在这个窗口上加载页面,否则打开新的一个窗口。
(参数3)窗口特性的指定。"width=400,height=350,status=yes,resizable=yes",如果这个参数不指定,则打开一个默认特性的窗口。如果参数指定,指明的特性才应用到窗口
之上,其它没有指明的特性,将忽略。
(参数4)只有当参数2指定名字的窗口已经存在时,true表示在history中取代item,false在history中创建一个新的item,默认是false.

在所有浏览器上支持:offsetLeft ,offsetTop 
offsetLeft,offsetTop:表示一个HTML元素左上顶点在父元素坐标系中的位置。
在所有浏览器上支持:clientX,clientY
event的属性clientX,clientY:表示鼠标事件触发的位置在window坐标系中的位置
在Other浏览器中支持screenX,screenY
event的属性screenX,screenY:表示鼠标事件触发的位置在monitor坐标系中的位置。


在IE中支持offsetX,offsetY,其它浏览器不支持offsetX,offsetY
event的属性offsetX,offsetY:表示鼠标事件触发的位置相对于事件源元素坐标的位置。


事件属性:
type : 触发的事件类型(IE和Other兼容)
IE: click,mouseover
Other: click,mouseover

事件源
srcElement:在其上触发事件的HTML元素(IE)
target :在其上触发事件的HTML元素(Other)
currentTarget : 当前事件正在被触发的HTML元素上(Other)

事件上浮:
bubbles:指定事件是否已经上浮,true,已经上浮,false,未上浮。可调用stopPropagation()来制止事件上浮。(Other)
cancelBubble:当设定为true时,制止事件上浮。(IE)


默认事件:cancelable:指定事件是否有默认的动作发生,true,有默认动作,false,没有默认动作。可调用preventDefault()来制止事件的默认动作发生。(Other)
returnValue : 当设定为false时,制止事件的默认动作发生。(IE)

button mousedown, mouseup, or click event 它仅仅用在鼠标的状态改变的时候,不能用在鼠标事件被触发时,哪个鼠标按钮被按下的依据(Other)
0 : left-click
1 : middle-click
2 : right-click

在IE指定哪个鼠标按钮被按下
1 : left-click
2 : right-clik
3 : left-click+right-click

window.pageXOffset,window.pageYOffset表示窗口滚动的参数(Other)
document.body.scrollLeft,document.body.scrollTop表示窗口滚动的参数(IE6.0和IE6.0以上)
document.documentElement.scrollLeft,scrollTop表示窗口滚动的参数(IE6.0以下)


scrollHeight,scrollWidth
是对象的实际内容的宽,高,不包边线宽度,高度,会随对象中内容的多少改变  
offsetHeight, offsetWidth
是对象的可见宽度,高度,包滚动条等边线,会随窗口的显示大小改变。

innerHeight, innerWidth(Other)
指定document的宽度,高度,不包含菜单,工具栏,滚动条。
document.documentElement or document.body 的clientWidth,clientHeight.指定document的宽度,高度,不包含菜单,工具栏,滚动条(IE)

**************************************************************************************************************************************************************************
从一个Web服务器获取XML的两种方法:
一:
(1)创建一个空的XML文档,
In Firefox和相关浏览器实现了DOM Level 2 方法。document.implementation.createDocument()
In IE new ActiveXObject("MSXML2.DOMDocument")
function(rootTagName, namespaceURL) {
    if (!rootTagName) rootTagName = "";
    if (!namespaceURL) namespaceURL = "";


    if (document.implementation && document.implementation.createDocument) 
    {
        // This is the W3C standard way to do it
        return document.implementation.createDocument(namespaceURL,rootTagName, null);
    }
    else 
    {    // This is the IE way to do it
        // Create an empty document as an ActiveX object
        // If there is no root element, this is all we have to do
        var doc = new ActiveXObject("MSXML2.DOMDocument");
        // If there is a root tag, initialize the document
        if (rootTagName) 
        {
            // Look for a namespace prefix
            var prefix = "";
            var tagname = rootTagName;
            var p = rootTagName.indexOf(':');
            if (p != -1) 
            {
                prefix = rootTagName.substring(0, p);
                tagname = rootTagName.substring(p+1);
            }


            // If we have a namespace, we must have a namespace prefix
            // If we don't have a namespace, we discard any prefix
            if (namespaceURL) 
            {
                if (!prefix) prefix = "a0"; // What Firefox uses
            }
            else prefix = "";


            // Create the root element (with optional namespace) as a
            // string of text
            var text = "<" + (prefix?(prefix+":"):"") +  tagname +(namespaceURL ? (" xmlns:" + prefix + '="' + namespaceURL +'"') "") +"/>";
            // And parse that text into the empty document
            doc.loadXML(text);
        }
        return doc;
    }
};


xmldoc.async = false;  // We want to load synchronously
if (document.implementation && document.implementation.createDocument) {
        xmldoc.onload = function( ) { callback(xmldoc); };
    }
    // Otherwise, use onreadystatechange as with XMLHttpRequest
    else {
        xmldoc.onreadystatechange = function( ) {
            if (xmldoc.readyState == 4) callback(xmldoc);
        };
    }


xmldoc.load(url);