zoukankan      html  css  js  c++  java
  • JS高级程序设置笔记(一)

    第一章

     
    1.1 
    ECMA:欧洲计算机制造商会
    ISO/IEC:国标标准话组织和国际电工委员会
    1.2JavaScript实现
    一个完整的JavaScript实现应该由以下三个不同的部分组成
    (1)核心(ECMAScript)
    (2)文档对象模型(DOM)
    (3)浏览器对象模型(BOM
    1.2.1 ECMAScript
    组成部分:语法、类型、语句、关键字、保留字、操作符、对象。
    1.2.2 文档对象模型(DOM)
    文档对象模型是针对XML但经过拓展用于HTML的应用程序编程接口(API Application Programming Interface)。
    DOM把整个页面映射为一个多层节点结构。
    DOM级别:
    DOM1级由两个模块组成DOM核心(DOM Core)和DOM HTML。其中Dom核心规定的是如何映射基于XML的文档结构,以便对文档汇总任一部分的访问和操作。DOM HTML模块则在DOM核心的基础上加以拓展,添加了针对HTML的对象和方法。
    DOM2级:在原先DOM的基础上拓充了鼠标和用户界面事件、范围、和遍历等细分模块。而且通过对象接口增加了对CSS的的支持。
    DOM2级引入的下列新模块,也给出了众多新类型和新街口的定义:
    DOM视图:定义了跟踪不同文档视图的接口。
    DOM事件:定义了事件和事件处理的接口。
    DOM样式:定义了基于CSS为元素应用样式的接口。
    DOM遍历和范围:定义了遍历和操作文档树的接口。
    3 :其他DOM标准
    除了DOM核心和DOM HTML接口以外,另几种语言还发布了只正对自己的DOM标准,新定义和新接口
    SVG(可伸缩矢量图)
    MathML(数学标记语言)
    SMIL(同步多媒体集成语言)
    1.2.3浏览器对象BOM
    BOM只处理浏览器窗口和框架;但人们习惯也把所有针对浏览器的JavaScript拓展算作BOM的一部分以下就是一些这样的拓展
    弹出新浏览器窗口的功能
    移动。缩放、和关闭浏览器窗口的功能;
    提供浏览器详细信息的Navigator对象
    提供浏览器所加载页面的详细信息的location对象
    提供用户显示器分辨率详细信息的screen对象
    对cookies的支持
     
    第二章
    2.1<script>元素
    <script>元素定义了下列6个属性
    async:可选。表示应该立即下载脚本文件。只对外部文件起作用
    charset:可选。表示通过src属性指定的代码子集
    defer:可选。便是脚本可以延迟到文档完全被解析和显示之后再执行
    language:已废弃
    src:可选。表示要执行的外部代码文件
    type:可选。看作是language的代替品;表示编码代码使用的脚本语言的内容类型
     
    使用<script>元素的方式有两种:直接在页面中嵌入Javascript代码和包括外部javaScript文件
    使用<script>元素嵌入JavaScript时,只需要指定type属性。然后想下面吧javascript代码直接放在内部就可以
    2.1.1标签的位置
    按照传统的方法,所有的<script>标签都应该放在<head>标签里:目的是把所有外部文件的引用都放在相同的地方。
    缺点就是,必须等所有的JS文件加载完成之后才能开始呈现页面,会导致在拥有很多js文件的情况下,会出现很严重的延迟问题。会让浏览器页面在很长一段时间里都是空白的状态。为了解决这个问题,闲杂都把<script>标签放在<body>元素中页面内容的后面。
    <body>
    <!--这里放内容-->
    <script type="text/javascript" src="#"></script>
    <script type="text/javascript" src="#"></script>
    .....
    </body>
     
    2.1.2延迟脚本
    <script>元素里有一个属性defer。这个属性的用途是表明脚本在执行的时候不会影响页面的构造。也就是说js文件会在所有页面都加载完成之后再运行。
    <script type="text/javascript" src="#" defer="defer"></script>
    <script type="text/javascript" src="#" defer="defer"></script>
    2.1.3
    异步脚本
    HTML5为<script>元素定义了async属性。这个属性与defer属性相似,都是来改变脚本行为,和defer类似,都只对外部JS文件起作用
    js的运行顺序,从上到下,执行顺序也是这样
     
    <script type="text/javascript" async src="#">
    function compare(a,b){
    if(a>b){
    alert("a is more than b");
    }
    else{
    alter("a is less than b");
    }
    }
    </script>
    2.1.4 在HTML中的用法
    <script type="text/javascript" async src="#">
    function compare(a,b){
    if(a>b){
    alert("a is more than b");
    }
    else{
    alter("a is less than b");
    }
    }
    </script>
    2.2 嵌入代码与外部文件
    虽然HTML支持把js文件直接写在head元素中,但是还是建议使用外部js文件。有点有
    1:可维护性强
    2:可缓存
    3:适应未来
    第三章 基本概念
    3.1语法
    和C还有类似C的语言很接近如java,perl的语法
    3.1.2区分大小写
    js脚本语言是区分大小写的
    3.1.2标识符
    所谓表示符,就是指变量、函数、属性的名字。
    表示符需要按照以下规则执行
    1:第一个字符必须是字母,下划线,或者美元符号。
    2:其他字符可以是字母,下划线,美元符号
    按照规则:ECMAScript标识符采用驼峰大小写格式,也就是第一个字母小写,剩下的每个单词的第一个字母大写
    3.1.3注释
    ECMAScript使用C风格的注释,包括单行注释和块级注释:
    //单行注释
    /**/块级注释
    3.1.4严格模式
    要在整个脚本内启用严格模式,可以在顶部添加如下代码:
    "use strict"
    例如
    function compare(a,b){
    "use strict"
    if(a>b){
    alert("a is more than b");
    }
    else{
    alter("a is less than b");
    }
    }
    3.1.5:语句
    和java的语句定义相似
    每句在结束的时候使用";"号隔开,使用if的时候虽然只有一句的情况下是可以不用加"{}"号的但是为了规范,还是要加上中括号,使结构看起来清晰。
    3.2关键字和保留字
    关键字用来控制语句的开始或者结束,或者执行某些特定的用途,一下就是ECMA脚本的全部关键字(带*号的是5新增的关键字)
                           
    break
     do 
    instanceof
    typeof
    case 
    else
     new
     var
    catch
    finally 
    return
    void
    continue
     for
    switch
    while 
    debugger*
    function
    this 
     with
    dafault
    if 
    throw
     
     delete
    in
    try
     
     
     
     
     
         
    3.3变量
    ECMA的变量是松散类型的,所谓松散类型就是可以用来保存任何类型的数据。换句话来书每个变量只是用来保存值的占位符而已,定义变量要使用var操作符:
    var message="h1";
    用var定义的变量术语局部变量,函数结束时,这个变量也会随着销毁的。
    如果没有加var 例如
    message="h1";
    可以用宇哥语句定义多个变量,只需要中间用逗号隔开极即可
     
    3.4数据类型:
    ECMAScript中有五种简单的数据类型(基本数据类型):undefined、null、Boolean、Number和String
    还有一种复杂类型——object,object本质上是由一组无序的名值组成的。
    3.4.1typeof操作符:
    鉴于ECMAScript是一种松散类型,因此需要一种手段来检测给定变量的数据类型——typeof就是负责提供这方面信息的操作符。对一个使用typeof操作符可能返回下列某个字符串:
    "undefined"——如果这个值未定义
    "boolean"——如果这个值是布尔值
    "string"——如果这个值是字符串
    "number"——如果这个值是数值
    "object"——如果这个值是对象或者null
    "function"——如果这个对象是函数
    var message="some string";
    alert(typeof message);//string
    alert(typeof (message));//string
    alert(typeof 95);//number
    3.4.2undefined类型
    undefined类型只有一个值,及特殊的undefined。在使用var声明变量但是没有对其加以初始化时,这个变量的值就是undefined,例如
    var one;
    alert(one==undefined);//true
    3.4.3null类型
    null是第二个只有一个值得数据类型,这个特殊的值是null。从逻辑上来看,null表示空,当定义的一个变量等null时,他与undefined==返回值是ture。
    3.4.4 boolean类型
    boolean是用的最多的一种类型,他有两个值,ture和false。这两个值与数字值不是一回事,所以ture不一定等于1,false也不一定等于0;
    3.4.5Number类型
    number类型是让人最关注的数据类型,用来表示整数和浮点数值(float类型)
    整数类型10进制 8进制 16进制
    var intNum=55;
    8进制(数字值0~7)第一位必须是0 ,8进制在严格模式下是无效的,会导致js报错
    var intNum = 070;//8进制的56
    16进制:面前两个值必须是0x后面任意十六进制数字(0~9 a~f)
    javas中的保存数值的方式,可以保存正值负值和0。
     
    1:浮点数值
    对于极大或者极小的值可以使用e表示法
    var floatName = 3.125e7;//31250000
    2:数据范围;
    ECMA能表示的最小数值保存在Number.MIN_VALUE中——在大多数浏览器中,这个值是5e-324。
    能够表示最大的值放在Number.MAX_VALUE中——在大多数浏览器中,这个值是1.7976931348623157e+308;
    3:NaN
    非数值(Not a Number )
    4:数值转换
    有单个函数可以吧非数值转换为数值:Number()、parseInt()、parseFloat();
    Number()函数转换规则
    如果是boolean值:ture和false将会分别被转换为1和0
    如果是数字值:只是简单的传入传出
    如果是null值:返回值是0
    如果是undefined值:返回Nan
    如果是字符串,遵循下列规则
       如果字符串中只包含数字,就转换成十进制数
       如果字符串中有效的浮点格式,就会转换成对应的浮点格式
       如果字符串中包含十六进制数,就会自动转换成10进制数
       如果字符串是空的,则转换成0;
       如果字符串中包含上述格式之外的值,则转换成NaN
     
    一般处理整数的时候会使用parseInt(),他会忽略空格或者不是字符的数,会直接找到数字来进行解析。
    可以指定输出结果
    parseInt("10" 进制数);//按照XX进制来进行解析
    小数就用parseFloat()来进行转换
     
    3.4.6 String类型
    字符串类型例:
    var StringInt="string"或者'string';
    2字符的特点,ECMAScript中的字符出是不可变的,也就是说,字符串一旦创建,他们的值就不能改变。要改变某个变量的保存的字符串,首先要销毁原来的字符串,然后在用另一个包含新字符串的字符填充该变量;例如
    var lang="java";
    lang="java"+"script";
    3字符串转换
    要把一个值转换成另一个值可以利用tostring()方法 (null undefined 没有tostring()方法)
    var num=10;
    alert(num.tostring(可以填写需要的进制数值));
    alert(num.tostring(2));//输出2进制的字符串
     
    在不知道要转换的值是不是null或undefined的情况下,还可以使用转型函数string(),这个函数能够将任何类型的值转换为字符串。String()函数遵循以下几条转换规则
    1:如果值有tostring()方法,则调用该方法(没有参数)并返回相同的参数
    2:如果返回值是null,则返回"null"
    3:如果值是undefined 则返回undefined。
    例子
    var value1=10;
    var value2=true;
    var value3=null;
    var values;//声明了但是没有初始化
     
    alert(String(value1));//"10"
    alert(String(value2));//"true"
    alert(String(value3));//"null"
    alert(String(values));//"undefined"
     
    3.4.7object类型(对象)
    和java中的创建对象大同小异
    把一个函数赋值给一个变量
    创建一个对象的方法
    var o = new object();//新创建一个object对象,把它赋值给一个变量o o可以使用这个对象里的所有函数和方法
    object的每个实例都具有下列属性和方法
    1:constructor 保存着用于创建当前对象的函数
    2:hasOwnPropery(properyName)同于检查给定属性在当前对象实例中是否存在
    3:isprototypeof(object)用于检查传入对象是否是传入对象的原型
    4:propertyIsEnumerable(propertyName)用于检测是否能用for-in语句来枚举
    5:toLocaleString()返回对象的字符串表示
    6:  tostring()返回对象的字符串表示
    7:  valueOf()返回对象的字符串,数值或布尔值表示
     
    3.5操作符
    3.5.1 一元操作符:只能操作一个值得操作符叫做医院操作符
    1递增和递减:
    自加和自减放在前后的区别
    在前 例:
    var num1=2;
    var num2=20; 
    var num3=--num1+num2;//21
    var num4=num1+num2;//21
     
    例2:
    var num1=2;
    var num2=20; 
    var num3=num1--+num2;//22
    var num4=num1+num2;//21
    区别就显而易见了
     
    2:一元加和减操作符
    一元加操作符在数值面前,对数值不会产生任何影响,如下列例子:
    var num=25;
    num=+num;//25
    但是一元操作符用在非数值上就会像Number()一样对这个值执行转换。换句话说就是,布尔值False和true转换成0,1;字符串值会按照一组特殊的规则进行解析。而对象是先调用他们的valuesof()和tostirng()方法,然后再转换得到值。
    例子:
    var s1 ="01";
    var s2="1.1";
    var s3="z";
    var b=false;
    var f=1.1
    var o={ valueOf:function(){
                          return -1;
    }};
     
    s1=+s1;//1
    s2=+s2;//1.1
    s3=+s3;//NaN
    b=+b;//0
    f=+f;//1.1
    o=+o;//-1
     
    3.5.2位操作符 
    计算一个数的二进制补码:需要经过下列3个步骤
    1:求这个数的二进制码;
    2:求二进制的反码;0替换1;1替换0;
    得到的二进制反码加1;
     
    ECMAscript会尽力向我们影藏这些信息。换句话说,再以二进制字符串形式输出一个负数时,我们看到的只是这个负数绝对值得二进制码前面加上了一个符号,如下面的例子
    var num=-18;
    alert(num.tostring(2));//-10010
     
    1.按位非(NOT)
    按位非操作符由一个波浪线~表示,执行按位非的结果就是返回数值的反码。
    var num1=25;//8个0 00011001
    var num2=~num1;//8个1 1110 0110 -26
    这里,对25执行按位非操作,结果得到了-26.这也验证了按位非操作的本质:操作数的负值减一。
     
    2.按位与(AND)
    按位与用&表示,他有两个操作符。本质上讲,按位与操作就是将两个数值的每一位对齐,然后根据下表的规则来执行
    第一个数值得位            第二个数值的位            结果
    1                                           1                     1
    1                                           0                     0
    0                                           1                     0
    0                                           0                     0
    就是要同时两个都位都为1或者都为0的时候结果才会是相同的。
    25&3
    25:0000 0000 0000 0000 0000 0000 0001 1001
    3:  0000 0000 0000 0000 0000 0000 0000 0011
    or: 0000 0000 0000 0000 0000 0000 0000 0001 //1
     
    3.按位或(OR)
    按位或用一个竖线表示(|),同时也有两个操作数。遵循下面的正值表
    第一个数值得位            第二个数值的位            结果
    1                                        1                        1
    1                                        0                        1
    0                                        1                        1
    0                                        0                        0
    看上列的表可以发现,只要有一个位是1返回的就是1,否则就返回0;
    25|3:
    25:0000 0000 0000 0000 0000 0000 0001 1001
    3:  0000 0000 0000 0000 0000 0000 0000 0011
    or: 0000 0000 0000 0000 0000 0000 0001 1011 //27
     
    4.按位异或
    按位异或(XOR)
    按位异或操作符由一个插入符号(^)表示,也有两个操作数。一下是按位异或的真值表。
    第一个数值得位            第二个数值的位            结果
    1                                        1                        0
    1                                        0                        1
    0                                        1                        1
    0                                        0                        0
    规则:两个位上只能有一个为1时才能返回1;如果两个都是1 或者两个都是的话,都返回0;
    25^3
    25:0000 0000 0000 0000 0000 0000 0001 1001
    3:  0000 0000 0000 0000 0000 0000 0000 0011
    or: 0000 0000 0000 0000 0000 0000 0001 1010
     
    5左移:
    位数向左移动X,空白的位置用0补上;
    例:2 10
    var oldValue=2;
    var newValus=oldValus<<5
    10>>1000000//64
    左移不会影响符号位,换句话说,如果将-2左移5位,得到的值就是-64,而不是64.
     
    6,有符号的右移:
    和左移放好相反,
    var oldValue=64;
    var newValus=oldValus>>5//2
    1000000>>5=10;
    7:无符号的右移
    负数的无符号右移会变成一个比较大的数;
     
    3.5.3 布尔值的操作
    布尔值操作符一共有三个 与(and) 或(or)    非(not)
    1:逻辑非:!
    2:逻辑于:&& 同时为真才能返回true
    3:逻辑或:|| 有一个为真就能返回ture
     
    3.5.4
    ECMAScript定义了三个乘性操作符 乘法 除法 和求模
    1乘法:
    在处理特殊值的情况下,乘法遵循的规则:
    1如果操作符都是数值,执行常规的乘法;如果成绩超过了最大表示范围,则显示Infinity或者-Infinity
    2如果有一个数十NAN,则返回值是NAN
    3如果是一个Infinity与0相乘结果是NAN
    4如果是Infinity与非0相乘 结果是Infinity或者-Infinity 取决一所乘的数有没有带单位
    5如果有一个数不是数值,则在后台调用Number()方法然后再进项上面的过程
    6 如果是Infinity与Infinity相乘 得到的数十Infinity;
     
    2除法
    除法的规则和乘法相似
     
    3求模:
    取余 就是相除然后取最后一个剩下来的值
    比如25%5 余1 得出的数就是1;
     
    3.5.5加性操作符
    1加法
    如果两个数都是数值,执行常规的加法计算,然后根据下列规则返回结果:
    1:如果有一个数十NAN,则结果就是NAN
    2:如果Infinity加Infinity 结果就是Infinity
    3:如果是-Infinity加-Infinity 结果就是-Infinity
    4:如果是Infinity加-Infinity 结果就是NAN
    5:如果是+0加+0,结果就是+0;
    6:如果-0+-0结果就是-0;
    7:+0+-0则结果就是+0;
    8:如果两个数都是字符串,结果就是将两个字符串进行拼接
    9:如果有一个数是字符串,则另一个数转换成字符串再与第二个数拼接;
     
    2:减法:
    和加法的规则相似
    规则有了相反的地方,如果有一个是字符串,就先使用valueof()方法,再计算;
     
     
    3.5.6关系操作符
    关系操作符遵循以下规则:
    1:如果两个操作数都是数值,则执行数值比较。
    2:如果两个操作数都是字符串,则比较两个字符串的字符编码值
    3:如果两个操作数一个是数值,另一个转化为数值,然后执行数值比较
    4:如果是对象,就先用valueof方法,如果没有就调用tostring方法
    5:如果一个操作数是布尔值类型,就先转换为数值
     
    3.5.7 相等操作符
    1:相等和不相等
    在转换不同的数据类型的时候,想等和不相等操作符遵循下列基本规则:
    1:如果一个数十boolean值类型,先转化,true是1;false是0;
    2:如果一个操作数是字符串,另一个操作数是数值,在比较相等之前现将字符串转换为数值
    3:如果一个操作数是对象,一个不是,先用valuesof方法,用得到的基本类型去按照前面的规则进行比较
    这两个操作在进行比较的时候要遵循下列规则
    4:null和undefin是想等的
    5:要比较相等性之前,不能将null和undefined转换成任何值。
    6:如果有一个操作数是NAN,相等返回false 不相等返回true 重要提示:及时两个数都是NAN也会返回false  因为按照规则NAN 不等与NAN
    7:如果两个数都是对象,则比较它们是不是同一个对象。如果两个操作数都指向同一个对象,则返回true,否则返回false。
    2全等:
    必须数值和数据类型完全一样的时候才会返回true 否则就是返回false。
     
    3.5.8条件操作符:
    var max =(num1>num2)?num1:num2;
    判断num1是不是比num2大,如果打就返回第一个值,如果否就返回冒号后面的值。
     
    3.5.9赋值操作符
    用=号来进行
    作用就是将左边的值付给右边!
    从左向右!
    例:
    var num1=10+12;将10+12的和赋值给num1;
    可以合并来写如:
    var num=10;
    num=num+10;
    合起来写就是
    num+=10;
     
    3.5.10
    逗号操作符
    使用逗号可以在一条语句中执行多个操作;如以下的例子:
    var num=1,num2=2,num3=3;
    如果一次性给一个变量同时服了很多的值,那么最后变量的值等于最后一个付给的值
     
    3.6语句
     
    1if语句
    语法:
    if(判断体){
    如果满足判断就执行结构体里面的内容
    }else{
    不满足的时候就执行else里面的函数
    }
     
    3.6.2do-while语句
    do-while是一中后测试循环语句;特点就是先执行循环体里面的内容再执行while里面的判断
    这种循环体最少会执行一次
    语法:do{循环体被容}while(判断条件experssion);
     
    3.6.3 while语句
    while语句属于前测试语句。也就是说,在执行循环体之前,先回对出口条件进行判断。因此while里的循环体有可能永远不会被执行
    语法:while(expression){
    statement;
    }
     
    3.6.4 for语句
    for语句也是一种前测试语句,先判断后循环
    语法for{变量值;结束条件;修改}{var i=0;i<5;i++}{expression}
     
    3.6.5for-in语句
    for-in语句是一种精准的迭代语句,可以用来枚举对象的属性
    语法for(property in expression)statement
    例子:
    for(var propName in window){
    document.write(propName);
    }
     
    3.6.6lable语句
    使用lable语句可以在代码中添加标签,以便将来使用。一下是lable语句的语法
    lable:statement
    例子:
    start:for(var i=0;i<count;i++){
    alert(i);
    }
    这个例子中定义的start标签可以在将来由break或continue语句引用。加标签的语句一般都要与for语句等循环语句配合使用。
     
    3.6.7break和continue
    相同的地方,都可以使循环的执行,区别是,break会让强制跳出循环,而continue之会跳出本次循环,后面的循环会继续执行。
     
     
    3.6.8with语句
    with语句是将代码的作用域设置到一个特定的对象中去;语法
    with(expression)statement;
    定义with语句的主要目的是为了简化多次编写同一个对象的工作,如下面的例子所示
    var qs=location.search.substring();
    var hostName=location.hostName;
    var url=location.href;
    以上几个代码都包含了location对象,用with语句如下
    with(location){
    var qs=search.substring();
    var hostName=hostName;
    var url=href;
    }
    严格模式下不允许使用with语句,否则会报错
     
    3.6.9switch语句:
    switch语句和if语句的关系相当密切,switch语句是一种控制流语句;语法:
    switch(expression){
    case value:statement;
    break;
    case value:statement;
    break;
    case value:statement;
    break;
    default:statement;
    }
    例子:
    switch(i){
    case 25:
        alert(25);
    break;
    case 26:
        alert(26);
    break;
    case 27:
        alert(27);
    break;
    default:
    alert("other");
    }
    还可以合并
    switch(i){
    case 25:
    case 35:
        alert(25or35);
    break;
    case 26:
        alert(26);
    break;
    case 27:
        alert(27);
    break;
    default:
    alert("other");
    }
    3.7函数
    函数对于任何一个语言来说都是核心的概念,通过函数可以封装任意多条语句,在任何地方,任何时候调用。
    ECMA中的函数使用function关键字来声明。
    function functionName(arg0,arg1......argn){
         statement;
    }
    例子:
    function sayHi(name,message){
        alert("Hello"+name+","+message);
    }
    注意,如果函数包含返回值,那么在返回值之后的语句永远不会执行,因为在函数检测到return之后就会结束。
    严格模式对函数有一定的限制:
    1:不能把函数命名为eval或arguments;
    2:不能把参数命名为参数同名的情况
    3:不能出现两个命名同名的情况
    如果发生上面几种情况,就会导致语法错误,代码无法执行。
     
    3.7.1 理解参数
    在函数体内可以通过argument对象来访问这个参数数组,从而获取传递给函数的每一个参数。
    arguments对象只是与数组类相似(但是他并不是array的实例),他可以使用方括号的语法访问他的每一个元素,当然也可以使用.length属性来确定传递进来多少个参数.
    function sayHi(){
       alert(arguments.length);
       alert("Hello"+arguments[0]+","+arguments[1]);
    }
     
    3.7.2没有重载
    ECMAScript函数不能像传统意义上的重载。
     
    4:变量、作用域和内存问题
    4.1.1动态属性:
    对于引用变量的值,我们可以为其添加属性的方法,也可以改变和删除其属性的方法。
    var person=new object();
    person.name="java";
    alert(person.name);//java
    但是我们不能给基本属性添加属性,虽然不会报错,但是返回值是undefined。
     
    4.1.2复制变量的值:
    如果从一个变量向另一个变量复制基本的值,会在变量的对象上创建一个新值,然后把该复制到为新变量分配的位置上。
     
    4.1.4检测类型:
    要检测一个变量是不是基本数据类型,可以用typeof操作符是最佳的工具但是检测引用类的值时,这个操作符的用处不大。通常我们并不是想知道某个值是对象,而是想知道他是很慢类型的对象,为此ECMAScript提供了instanceof操作符,去语法如下:result=variable instanceof constructor
    如果变量是给定的引用类型那么instanceof操作符始终会返回true ,如果检测到的是基本类型的值,则该操作符始终会返回false
     
    4.2 执行环境及作用域
    执行环境 是js中最为重要的一个概念。执行环境定义了变量或函数有权访问的其他数据,决定了他们各自的行为。每个执行环境中都有一个与之关联的变量对象,
    全局执行环境是最外围的一个执行环境。当这个环境里的内容执行完毕时,这个环境就会毁灭。
     
    每个函数都有自己的执行环境。
     
    4.2.1 延长作用域链
    虽然执行环境的类型总共有两种——全局和局部(函数),但是还是有其他方法来延长作用域。具体来说就是,就是当执行流进入下一列任何一个语句是,作用域链就会得到加长:
    try-catch语句的catch快
    with块
     
     
     
     
    第五章:
    5.1object类型
    创建object实例的方式有两种。第一种是使用new操作符后跟object构造函数如
    var person = new object();创建对象
    另一种方式是使用对象字面量表示法 对象字面量是对象定义的一种简写方法,目的在于简化创建包含大量属性的对象过程。例:
    var person ={
        name :"java";
        age : 29;
    }
    在使用对象字面量语法时,属性名也可以使用字符串
    例子:
       var person = {
            "name":"java";
             "age" :26;
     }
    在创建对象的时候如果花括号里没有填写内容,那么就和第一种创建方法是一样的。
     一般来说,访问对象属性时都是使用点表示发,这也是很多面向对象语言中通用的语法,不过在js中可以用方括号表示法来访问对象的属性,在使用方括号法时,应该将要访问的属性以字符串的形式放在方括号里,如下面所示:
    alert(person["name"]);
    alert(person.name);
    方括号表示法主要的优点是可以通过变量来访问属性 如:
    var propertyName = "name";
    alert(person[property]);
    如果属性名中有一个空格,就不能通过点表示法来获取属性的值了,这时候就可以通过方括号表示法来取得属性的值
    person[frist name]="java";//通常除非非要使用变量来访问属性,一般我们都建议使用点表示法。
     
    5.2Array类型
    Array类型就是我们通常说的数组类型
    创建数组的基本方法一般有两个:
    第一种:使用array的构造函数:
    var color=new Array();如果你知道数组内要保存的元素个数,你就可以里面设置,该数量会自动变成length属性的值。例如下面创建length为20的数组:
     var color = new Array(20);
    也可以直接向数组内传递需要保存的项:如下
    var color = new Array("red","green","black");
    构造函数的时候也可以省略new操作符:例子:
    var color= Array(3);
    var name = Array("java");
    创建数组的第二种方式是使用数组字面量表现法。数组字面量由一对包含数组项的方括号表示,多个数组之间以逗号隔开,如下所示:
    var colors=["red","blue","green"];//创建了一个包含三个字符串的数组
    var names= []//创建了一个空数组
    var values=[1,2,3];//创建了一个有3项的数组
    读取数组是的索引都是从0开始的!!!
    数组的length属性永远比索引大1!!
    我们可以用这个属性将数组末尾移除或者向数组内添加新项:例子:
    var color = ["red","green","black"];
    color.length=2;
    alert(color[2]);//undedfind
    数组中的length属性很有特点它不是只读的!!
    同样也可以使用这个方法给数组内添加新的元素:例子:
    var colors=["red","green"];
    colors[colors.length]="black";
    colors[colors.length]="pink";
    解释,刚开始数组内有两个元素,length值为2,但是索引值只有0 和 1,所以当我们取值取length的位置的时候,其实是一个空的位置(undefined),所以我们就能给他添加新的属性。
     
    5.2.1 检测数组
    自从ECMAScript出现之后,就出现了确定某个对象是不是数组的经典问题
    。对于一个网页,或者一个全局作用域而言,使用instanof操作符就能得到满意的答案
    if(value instanceof Array){
       //对数组内执行某些操作
    }
    新增了Array.isArray()方法。这个方法的目的最终确定某个值到低是不是数组,而不管他在那个全局环境执行环境中创建的。这个方法的使用方法如下:
    if(Array.isArray(value)){
        //对数组执行某些操作
    }
    5.2.2转换方法
    所有对象都具有tolocaleString(),toString(),valueOf()方法,其中调用数组的toString()方法会返回有数组内所有元素由逗号分割的一个字符串。
    有时候toLocaleString()方法经常也会返回与toString()和valuesOf()方法相同的值,但是也不总是如此,。而前面两个值得唯一不同之处在于这一次为了取得每一项的值,调用的是每一项的toLocaleString()方法,而不是toString()方法。
    如果你想用不同的分隔符去分割返回的字符床串的值可以使用join()方法:例如:
    var color=["green","black","white"];
    alert("color.join("&")");//green&black&white;
     
    5.2.3 栈方法
    栈是一种LIFO(last-in-first-out)后进先出的数据结构,也就是说最新添加的数被最早的溢出了。而栈中项的插入(叫做推入)和移除(叫做弹出),只发生在一个位置,栈的顶部。ECMAScript为数组专门提供了push()和pop(),方法,以便实现类似栈的行为。
    push()方法可以接受任意数量的参数,把他们逐个添加到数组的尾部,并返回修改后数组的长度。而pop()方法则从数组末尾移除最后一项。减少length值,然后返回移除的项:
    例子:
    var colors = new  Array();//创建一个数组
    var count = colors.push("red","green");//推入两项
    alert(count);//2
     
    count=colors.push("black");
    alert(count);//3
     
    var item=colors.pop;//取得最后一项
    alert(item);//black
    alert(colors.length);//2
     
    push()方法负责往数组里添加新的值,会改变length属性的值。
    pop()方法会取得数组内最后一位的数,并且将它移除。后进先出
     
    5.2.4 队列方法
    堆栈是后进先出,而队列刚好和他相反,FIFO(first-in-first-out)先进先出
    可以用push()方法给数组内添加元素:push("red","black");
    然后可以用shift()方法移除数组内第一个元素;
    例子:
    var colors=new Array();
    vat cont=colors.push("red","black");
    alert(count.length);//2
     
    var item = colors.shift();
    alert(item);//red
    alert(colors.length);//1
     
    5.2.5 重排序方法
    数组内已有的数可以用reverse()和sort()方法来进行重新排序,区别是:reverse()是将数组内的元素从大到小排序,而sort()方法是按照升序来排序,就是从小到大来排序。
    var nums=[1,2,5,9,7];
    nums.sort();
    alert(nums);//1,2,5,7,9
     
    5.2.6操作方法
    concat()方法可以基于当前数组中的所有项创建一个新的数组。
    slice()方法,他能够基于当前数组中的一个或者多个项创建一个新的数组;
    slice()方法里面的可以有两个参数值,当只有一个值得时候,新的数组会拥有从这个值开始,之后所有的值,如果有两个值得话,新数组就会有这两个数字之间的所有元素;例子:
    var nums = [1,2,3,4,5,6,7];
    var newInt = nums.slice(2);//从位置2开始复制 3,4,5,6,7
    var newTwo = nums.slice(3,5);//从位置3开始复制到位置5结束 4,5
     
    接下来我们来介绍splice()方法,这个方法算是数组里最强大的方法了,他有很多种用法。splice()的主要用途是向数组的中部插入项,但是使用这种方法的方式则有如下3三种。
    删除 splice()方法可以删除任意数量的项,只需指定2个参数;要删除的第一项的位置和要删除的项数,例如:splice(0,2)会删除数组内的前两项;
    插入:可以向指定位置插入任意数量的项,可以再传入第四,第五一致任意多的项,传递三个参数,起始位置,要删除的项,和要插入的值。例如:splice(2,0(要删除的项),"red","green");
    替换:可以向指定位置插入任意数量的项,且同时删除任意数量的项,只需指定3个参数,起始位置,要删除的项数和要插入的项数。插入的项数不必与删除的项数相等。例如:splice(2,1."red","green")//会删除当前数组位置2的项,然后再从位置2开始插入字符串"red","green"
     
    5.2.7位置方法
    indexof()和lastIndexOf()位置方法;这两个方法都接受两个参数:要查找的项和(可选的)表示查找起点位置的索引。其中indexof()方法从数组的开头开始查找(位置0),向后。lastIndexOf()方法则从数组的末尾开始寻找。
    这两个方法都会返回查找项在数组内的位置,或者在没有查找的情况下返回-1;在比较第一个参数与数组中的每一项时,会使用全等操作符;也就是说必须严格相等;
    例子:var number = [1,2,3,4,5];
    alert(number.indexof(4));//返回位置3
    alert(number.lastIndexOf(4));//返回1
    5.2.8 迭代方法
    定义了5个迭代方法,每个方法都接受两个参数:要在每一项上运行的函数和(可选的)运行该函数的作用域对象-影响this的值。传入这些方法的函数会接受三个参数:数组的值,该项在数组中的位置和数组对象本身。
    以下是5个迭代方法的作用
    every()对数组中的每一项给定函数,如果该函数对每一项都返回true,则返回true;
    filter()对数组中的每一项给定函数。返回该函数会返回true的项组成的数组。
    foreach()对数组中的每一项给定函数。没有返回值
    map()对数组中的每一项给定函数。返回每次函数调用的结果组成的数组
    some()对数组中的每一项给定函数。如果该函数对任一项返回true,则返回true
    以上的函数都不会修改数组中函数的值。
     
    5.2.9归并方法
    新增了两个归并数组的方法:reduce()和reduceRight(),这两个方法都会迭代数组的所有项,然后够键一个最终返回的值,其中reduce()方法从数组的第一项开始,逐个遍历到最后。而reduceRight()则从数组的最后一项开始,向前遍历到第一项。
    这两个方法都接收两个参数:一个在每一项上调用的函数和(可选的)作为归并函数基础的初始值。传递给这两个函数接收四个参数:前一个值,当前值,项的索引和数组对象。
    遍历数组内的所有项,来执行函数,最后返回一个总值
     
     
    5.3Date类型
     
    创建一个date对象
     var now = new Date();对象获得当前的日期和时间;
    Date.parse()和Date.UTC();
    parse()方法接收一个表示日期的字符串参数,接收以下格式
    1:"月/日/年"如 6/13/2004
    2:“英文月名 日 年” 如January 12,2004
    3:“英文星期几 英文月名 日 年 时 :分 :秒:时区” 如 TUE May 25 2004 00:00:00 GMT-0700
    4:ISO 8601扩展格式 YYYY-MM-DDTHH:mm:ss:ssz(例如 2004-05-25T00:00:00);
    如要创建一个如期对象 2004 5 25 
    var someDate=new Date(Date.prase("May 25,2004"))
     
    5.3.2日期格式化方法
    Date类型还有一些专门用于将日期格式化为字符串的方法,方法如下
    1:toDateString()
    2:toTimeString()
    3:toLocaleDateString()
    4:toLocaleTimeString()
    5:toUTCString()
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    网站统计中的数据收集原理及实现
    启动hadoop报ERROR org.apache.hadoop.hdfs.server.namenode.FSImage: Failed to load image from FSImageFile
    淘宝(大数据库应用)--转载
    MapReduce作业的map task和reduce task调度参数
    Spark和Hadoop作业之间的区别
    分析MapReduce执行过程
    MapReduce框架Partitioner分区方法
    LVS+keepalived实现负载均衡
    Tomcat 详解
    linux Tomcat restart脚本简单版
  • 原文地址:https://www.cnblogs.com/gavinzzh-firstday/p/5335266.html
Copyright © 2011-2022 走看看