js

js

JavaScript概述

JavaScript历史

  • 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言)
  • Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0产品中开发出一套livescript的脚本语言.Sun和Netscape共同完成.后改名叫Javascript
  • 微软随后模仿在其IE3.0的产品中搭载了一个JavaScript的克隆版叫Jscript.
  • 为了统一三家,ECMA(欧洲计算机制造协会)定义了ECMA-262规范.国际标准化组织及国际电工委员会(ISO/IEC)也采纳 ECMAScript 作为标准(ISO/IEC-16262)。从此,Web 浏览器就开始努力(虽然有着不同的程度的成功和失败)将 ECMAScript 作为 JavaScript 实现的基础。EcmaScript是规范.

JavaScript简介

1、它是一种客户端语言。

2、一个完整的JavaScript实现是由以下三个部分构成的:

  • 核心(ECMAScript),语法规范(包括语法、类型、语句、关键字、运算符等)
  • 文档对象模型(DOM) Document object model (整合js,css,html)
  • 浏览器对象模型(BOM) Broswer object model(整合js和浏览器)

3、javascript在开发中绝大多数情况是基于对象的,也是面对对象的。

JavaScript引入方式

1.嵌入式:一般没有规定放在哪里,但是一般情况下,都放在<html>标签中和<body>标签平级并写在它后面,因为浏览器加载的时候是从上到下的,需要等标签加载完成了才能找到并操作标签。

    <script>
         alert('222222');
    </script>

 

2.引入js的文件,方法和上面基本一样,就是在script标签的属性中,加入src="js文件.js"

<script src="./js/out.js"></script>

 

基本语法

1、每行结束可以不加分号. 没有分号会以换行符作为每行的结束

2、 注释

多行注释:/* */ 

单行注释: //

3、使用{}来封装代码块

数据的基本类型

5种基本数据类型:Number 、String、Boolean、Undefined、Null

1种复合类型 object

注:

1、可以用typeof()查看类型

2、基本数据类型:存储在栈中

3、引用数据类型:定义的对象存储在堆中,栈中保存的地址

数字类型(Number)

最基本的数据类型

不区分整型数值和浮点型数值

所有数字都采用64位浮点格式存储,相当于Java和C语言中的double格式

能表示的最大值是±1.7976931348623157 x 10308

能表示的最小值是±5 x 10 -324

整数:
           在JavaScript中10进制的整数由数字的序列组成
           精确表达的范围是
-9007199254740992 (-253) 到 9007199254740992 (253)
           超出范围的整数,精确度将受影响
浮点数:
           使用小数点记录数据
           例如:3.4,5.6
           使用指数记录数据
           例如:4.3e23 = 4.3 x 1023

16进制和8进制数的表达:
           16进制数据前面加上0x,八进制前面加0
           16进制数是由0-9,A-F等16个字符组成
           8进制数由0-7等8个数字组成

字符串(String)

是由Unicode字符、数字、标点符号组成的序列
字符串常量首尾由单引号或双引号括起
JavaScript中没有字符类型
常用特殊字符在字符串中的表达
字符串中部分特殊字符必须加上右划线\
常用的转义字符 \n:换行  \':单引号   \":双引号  \\:右划线

布尔型(Boolean)

Boolean类型仅有两个值:true和false,也代表1和0,实际运算中true=1,false=0
布尔值也可以看作on/off、yes/no、1/0对应true/false
Boolean值主要用于JavaScript的控制语句,例如
    if (x==1){

    y=y+1;

    }else    {

    y=y-1;

    }

 

Undefined类型

Undefined 类型只有一个值,即 undefined。当声明的变量未初始化时,该变量的默认值是 undefined。

当函数无明确返回值时,返回的也是值 "undefined";

Null类型

另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。

尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。

复合类型

        var oObj = {
               name:"隔壁老王",
               age:88,
           }

        var type = typeof(oObj);
        alert(type);            //Ojbect
        alert(oObj.name);       //隔壁老王

 

数据类型转换

基本数据类型转换

JavaScript属于松散类型的程序语言
变量在声明的时候并不需要指定数据类型
变量只有在赋值的时候才会确定数据类型
表达式中包含不同类型数据则在计算过程中会强制进行类别转换

数字 + 字符串:数字转换为字符串

数字 + 布尔值:true转换为1,false转换为0

字符串 + 布尔值:布尔值转换为字符串true或false

 

强制数据类型转换

函数parseInt:   强制转换成整数,不四舍五入。   例如parseInt("6.12")=6  ; parseInt(“12a")=12 ; parseInt(“a12")=NaN  ;parseInt(“1a2")=1
NaN是not a number,属于number的一种
函数parseFloat: 强制转换成浮点数  parseFloat("6.12")=6.12
函数eval:       将字符串强制转换为表达式并返回结果 eval("1+1")=2 ; eval("1<2")=true

类型查询函数(typeof)

当你不知道数据转换到是什么类型的时候可以使用这个函数

ECMAScript 提供了 typeof 运算符来判断一个值是否在某种类型的范围内。可以用这种运算符判断一个值是否表示一种原始类型:如果它是原始类型,还可以判断它表示哪种原始类型。

函数typeof :查询数值当前类型
 (string / number / boolean / object )
例如typeof("test"+3)      "string"
例如typeof(null)          "object "        注意null属于object
例如typeof(undefined)     "undefined"
例如typeof(true+1)        "number"
例如typeof(true-false)    "number"

变量

变量的定义

在js中,定义一个变量很简单,只需要var一个变量名就可以了,它会根据你的赋的值自动判断,比如:

        var iNumber = 100;
        var sString = "hello";
        var bBoolean = true;

 

一行可以声明多个变量并且可以是不同类型

        var iOne = 10,iTwo = 20, iThre = 30;

 

变量命名规范

1.区分大小写

2.第一个字符必须是字母/下划线(_)/美元符号($)

3.其他字符可以是字母,下划线,美元符号,数字

4.最好做到见名知意

匈牙利命名法

标记法命名的变量前附加一个小写字母(或小写字母序列),说明该变量的类型。例如,i 表示整数,s 表示字符串,如下所示“

对象o Object 比如:oDiv

数组a Array 比如:aItems

字符串s String 比如:sUserName

整数i Integer 比如:iItemCount

布尔值b Boolean 比如:bIsComplete

浮点数f Float 比如:fPrice

函数fn Function 比如:fnHandler

正则表达式re RegExp 比如:reEmailCheck

常量和标识符

常量 :直接在程序中出现的数据值

标识符

  1. 由不以数字开头的字母、数字、下划线(_)、美元符号($)组成
  2. 常用于表示函数、变量等的名称
  3. 例如:_abc,$abc,abc,abc123是标识符,而1abc不是
  4. JavaScript语言中代表特定含义的词称为保留字,不允许程序再定义为标识符

 

 

 

运算符

算数运算符

  基本运算符

 加(+)、 减(-)、 乘(*) 、除(/) 、余数(% )  加、减、乘、除、余数和数学中的运算方法一样  例如:9/2=4.5,4*5=20,9%2=1
 -除了可以表示减号还可以表示负号  例如:x=-y
 +除了可以表示加法运算还可以用于字符串的连接  例如:"abc"+"def"="abcdef"

  递增(++) 、递减(--)

   假如x=2,那么x++表达式执行后的值为3,x--表达式执行后的值为1
  i++相当于i=i+1,i--相当于i=i-1
  递增和递减运算符可以放在变量前也可以放在变量后:--i

var i=1;
console.log(i++);      这个是先显示再加一
console.log(++i);      这个是先加一再显示
console.log(i--);      这个是先显示再减一
console.log(--i);      这个是先减一再显示

 

  一元加减法

 

   var c="10";
   console.log(typeof (c));      //string
   c=+c;    //类型转换
  console.log(typeof (c));      //number
//---------------------------------------
    var a=1;
    var b=1;
    a=-a; 
    console.log(a)
//---------------------------------------
    var iNumber = NaN;
    console.log(iNumber>3);         //false
    console.log(iNumber>3);         //false
    console.log(iNumber==3);        //false
    console.log(iNumber==NaN);      //false
    console.log(iNumber!=1);        //true

 

 

逻辑运算符

 

与 (&&) 、或(||) 、非(!)

 

1 && 1 = 1

1 && 0 = 0

0 && 0 = 0

 

1 || 1 = 1

1 || 0 = 1

0 || 0 = 0

!0=1
!1=0

注意:

1、如果某个运算数不是原始的 Boolean 型值,与和或并不一定返回 Boolean 值:

  • 如果某个运算数是 null,返回 null。 
  • 如果某个运算数是 NaN,返回 NaN。 
  • 如果某个运算数是 undefined,返回undefined。

2、单个的&和|是位运算

3、AND下

  如果一个运算数是对象,另一个是boolean值,返回该对象

  如果两个运算数都是对象,返回第二个对象

4、OR下

  如果一个运算数是对象,并且该对象左边的运算数值均为false,则返回该对象

  如果两个运算数都是对象,返回第一个对象

 

赋值运算符

JavaScript中=代表赋值,两个等号==表示判断是否相等

例如,x=1表示给x赋值为1

if (x==1){...}程序表示当x与1相等时

if(x==“on”){…}程序表示当x与“on”相等时

 配合其他运算符形成的简化表达式

例如i+=1相当于i=i+1,i*=1相当于i=i*1,

 

关系运算符

等于 ( == )  、不等于( != ) 、 大于( > ) 、 小于( < ) 
大于等于(>=) 、小于等于(<=)

特殊的例子:

1、
var bResult = "Blue" < "alpha";
alert(bResult);   //输出 true,字符串 "Blue" 小于 "alpha",因为字母 B 的字符代码是 66,字母 a 的字符代码是 97。
2、
var bResult = "25" < "3";
alert(bResult);   //输出 "true",字符串 "25" 和 "3"。两个运算数都是字符串,所以比较的是它们的字符代码("2" 的字符代码是 50,"3" 的字符代码是 51)。
3、
var bResult = "25" < 3;
alert(bResult);   //输出 "false",字符串 "25" 将被转换成数字 25,然后与数字 3 进行比较

 

总结:

比较运算符两侧如果一个是数字类型,一个是其他类型,会将其类型转换成数字类型.

比较运算符两侧如果都是字符串类型,比较的是最高位的asc码,如果最高位相等,继续取第二位比较.

 

控制语句

if语句

if-else基本格式

if (表达式){

语句1;

......

}else{

语句2;

.....

}

 

功能说明:

如果表达式的值为true则执行语句1,否则执行语句2

 

if语句嵌套格式

if (表达式1) {

    语句1;

}else if (表达式2){

    语句2;

}else if (表达式3){

    语句3;

} else{

    语句4;

}

 

运行流程如图所示:

switch语句

switch基本格式

 

switch (表达式) {
    case 值1:语句1;break;        //当满足case,执行语句1,然后break退出switch,执行switch的下一条语句
    case 值2:语句2;break;
    case 值3:语句3;break;
    default:语句4;              //所以条件都不满足会执行语句四
}

 

 例子:

 

var x=3
        switch(x){
            case 1:y="星期一";    break;        
            case 2:y="星期二";    break;
            case 3:y="星期三";    break;
            case 4:y="星期四";    break;
            case 5:y="星期五";    break;
            case 6:y="星期六";    break;
            case 7:y="星期日";    break;
            default: y="未定义";
        }
        console.log(y);     //结果为星期三
        switch(x){
            case 1:y="星期一";    break;        
            case 2:y="星期二";    break;
            case 3:y="星期三";
            case 4:y="星期四";
            case 5:y="星期五";    break;
            case 6:y="星期六";    break;
            case 7:y="星期日";    break;
            default: y="未定义";
        }
        console.log(y);     //结果是星期五,在switch中,跳出switch一共有两种方式,一个是break跳出来,一个是switch顺序执行完。这个例子结果是星期五的原因是,它满足等于3的条件,然后赋值为星期三,但是这个条件后面没有break来跳出switch,所以它会继续顺次执行,而且不管满不满足条件,直接执行语句,当遇到等于五并且给y赋值为了星期五之后,就跳出了循环。

补充:

首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断;而 switch 只能对基本类型进行数值比较。两者的可比性就仅限在两个基本类型比较的范围内。
说到基本类型的数值比较,那当然要有两个数。然后重点来了——
if 语句每一句都是独立的,看下面的语句:
if (a == 1) ...
else if (a == 2) ...
这样 a 要被读入寄存器两次,12 分别被读入寄存器一次。于是你是否发现其实 a 读两次是有点多余的,在你全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是 if 语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个 a。
于是 switch case 就出来了,把上面的改成 switch case 版本:
switch (a) {
        case 0:
                break;
        case 1:
}
                
总结:

1.switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化
2.switch-case只将表达式计算一次,然后将表达式的值与每个case的值比较,进而选
  择执行哪一个case的语句块
3.if..else 的判断条件范围较广,每条语句基本上独立的,每次判断时都要条件加载
  一次。
所以在多路分支时用switch比if..else if .. else结构要效率高。
View Code

 

for语句

for循环基本格式

for (初始化;条件;增量){

    语句1;

    ...

}

 

功能说明

实现条件循环,当条件成立时,执行语句1,否则跳出循环体

 

详细解释:当执行的for的一开始,先执行初始化的操作。然后判断条件是否满足,满足则继续执行循环体内语句,不满足则直接退出执行for循环体之后的语句。满足时,执行完循环体内语句后,执行增量的语句。增量语句执行完毕之后,再进行判断,如果满足则继续执行,执行方式和第一次时一致。

        var iSum=0;

        for(var iNum=1;iNum<=10;iNum++){

            iSum+=iNum;

        }

        console.log(iSum);

while语句

 while基本格式

while (条件){

语句1;

...

}

 

功能说明

运行功能和for类似,当条件成立循环执行语句花括号{}内的语句,否则跳出循环

 例子:

var i=1;

while (i<=7) {

    document.write("<H"+i+">hello</H "+i+"> ");

    document.write("<br>");

    i++;

}

//循环输出H1到H7的字体大小

异常处理语句

try {
    //这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行
}
catch (e) {
    // 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。
    //e是一个局部变量,用来指向Error对象或者其他抛出的对象
}
finally {
     //无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。
}

 

 

注:主动抛出异常 throw Error('xxxx')  

 

ECMA对象

从传统意义上来说,ECMAScript 并不真正具有类。事实上,除了说明不存在类,在 ECMA-262 中根本没有出现“类”这个词。ECMAScript 定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。

var o = new Object();

 


这种语法与 Java 语言的相似,不过当有不止一个参数时,ECMAScript 要求使用括号。如果没有参数,如以下代码所示,括号可以省略:

var o = new Object;

 


注意:尽管括号不是必需的,但是为了避免混乱,最好使用括号。

 

 在 ECMAScript 中,所有对象并非同等创建的。
一般来说,可以创建并使用的对象有三种:本地对象、内置对象和宿主对象。

宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序。如:web浏览器,一些桌面应用系统等。即由web浏览器或是这些桌面应用系统早就的环境即宿主环境。

 

1、本地对象
ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。

再来看一下,“本地对象”包含哪些内容:

Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError


由此可以看出,简单来说,本地对象就是 ECMA-262 定义的类(引用类型)。

2、内置对象
ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现”。这意味着开发者不必明确实例化内置对象,它已被实例化了。

同样是“独立于宿主环境”。根据定义我们似乎很难分清“内置对象”与“本地对象”的区别。而ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。

如此就可以理解了。内置对象是本地对象的一种。而其包含的两种对象中,Math对象我们经常用到,可这个Global对象是啥东西呢?

Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在,但大家要清楚,在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。类似于isNaN()、parseInt()和parseFloat()方法等,看起来都是函数,而实际上,它们都是Global对象的方法。而且Global对象的方法还不止这些。有关Global对象的具体方法和属性,感兴趣的同学可以看一下这里:JavaScript 全局对象参考手册


 3.宿主对象
由ECMAScript实现的宿主环境提供的对象,可以理解为:浏览器提供的对象。所有的BOM和DOM都是宿主对象。

4.自定义对象

这个可能让人有些发懵,简单总结一下:

 1 JS中,可以将对象分为“内部对象”、“宿主对象”和“自定义对象”三种。
 2 1,内部对象
 3 js中的内部对象包括Array、BooleanDateFunction、Global、Math、Number、Object、RegExp、String以及各种错误类对象,包括Error、EvalError、RangeError、ReferenceError、SyntaxError和TypeError。
 4 
 5 其中Global和Math这两个对象又被称为“内置对象”,这两个对象在脚本程序初始化时被创建,不必实例化这两个对象。
 6 
 7 2.宿主对象
 8 宿主对象就是执行JS脚本的环境提供的对象。对于嵌入到网页中的JS来说,其宿主对象就是浏览器提供的对象,所以又称为浏览器对象,如IE、Firefox等浏览器提供的对象。不同的浏览器提供的宿主对象可能不同,即使提供的对象相同,其实现方式也大相径庭!这会带来浏览器兼容问题,增加开发难度。
 9 
10 浏览器对象有很多,如Window和Document等等
11 
12 3.自定义对象
13 顾名思义,就是开发人员自己定义的对象。JS允许使用自定义对象,使JS应用及功能得到扩充
总结

 

 

object对象ECMAScript 中的所有对象都由这个对象继承而来;Object 对象中的所有属性和方法都会出现在其他对象中,说两种常用的

ToString() :  返回对象的原始字符串表示。
ValueOf() : 返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。

 常用对象

 String对象

  创建方式:

var str1="hello world";

 

  属性:

var str1="String对象";

var str2="";

alert("str1长度 "+str1.length);  //8

alert("str2长度 "+str2.length);  //0

 

   方法:

 格式编排

1         var x="yuan";
2         var y="x.italics():"+x.italics();
3         console.log(y);   //结果:x.italics():<i>yuan</i>
View Code

 大小写转换

var str1="AbcdEfgh"; 

var str2=str1.toLowerCase();
var str3=str1.toUpperCase();
alert(str2);
//结果为"abcdefgh"
alert(str3);
//结果为"ABCDEFGH"
View Code

 获取指定字符串

书写格式

x.charAt(index)

x.charCodeAt(index)

使用注解

x代表字符串对象
index代表字符位置
index从0开始编号
charAt返回index位置的字符
charCodeAt返回index位置的Unicode编码
----------------------
var str1="welcome to the world of JS! 苑昊";

var str2=str1.charAt(28);
var str3=str1.charCodeAt(28);
alert(str2);
//结果为"苑"
alert(str3);
//结果为33489
View Code

 查询字符串

 1 //书写格式
 2 //
 3 //x.indexOf(findstr,index)
 4 //x.lastIndexOf(findstr)
 5 //-------------------------------------
 6 var str1="welcome to the world of JS!";
 7 
 8 var str2=str1.indexOf("l");
 9 var str3=str1.lastIndexOf("l");
10 alert(str2);
11 //结果为2
12 alert(str3);
13 //结果为18
14 
15 //-------*********************************************************-------
16 
17 //书写格式
18 //
19 //x.match(regexp)
20 //
21 //x.search(regexp)
22 //
23 //使用注解
24 //
25 //x代表字符串对象
26 //
27 //regexp代表正则表达式或字符串
28 //
29 //match返回匹配字符串的数组,如果没有匹配则返回null
30 //
31 //search返回匹配字符串的首字符位置索引
32 //-------------------------------------
33 var str1="welcome to the world of JS!";
34 
35 var str2=str1.match("world");
36 var str3=str1.search("world");
37 alert(str2[0]);
38 //结果为"world"
39 alert(str3);
40 //结果为15
View Code

 截取字符串

 1 //截取子字符串
 2 //
 3 //书写格式
 4 //
 5 //x.substr(start, length)
 6 //
 7 //x.substring(start, end)
 8 //
 9 //使用注解
10 //
11 //x代表字符串对象
12 //
13 //start表示开始位置
14 //
15 //length表示截取长度
16 //
17 //end是结束位置加1
18 //
19 //第一个字符位置为0
20 
21 
22 var str1="abcdefgh";
23 var str2=str1.substr(2,4);
24 var str3=str1.substring(2,4);
25 alert(str2);
26 //结果为"cdef"
27 alert(str3);
28 //结果为"cd"
29 
30 //-------*********************************************************-------
31 //x.slice(start, end)
32 
33 
34 var str1="abcdefgh";
35 var str2=str1.slice(2,4);
36 var str3=str1.slice(4);
37 var str4=str1.slice(2,-1);
38 var str5=str1.slice(-3,-1);
39 alert(str2);
40 //结果为"cd"
41 alert(str3);
42 //结果为"efgh"
43 alert(str4);
44 //结果为"cdefg"
45 alert(str5);
46 //结果为"fg"
View Code

 替换字符串

1 //x.replace(findstr,tostr)
2 
3 var str1="abcdefgh";
4 var str2=str1.replace("cd","aaa");
5 alert(str2);
6 //结果为"abaaaefgh"
View Code

分割字符串

1 var str1="一,二,三,四,五,六,日"; 
2 
3 var strArray=str1.split(",");
4 
5 alert(strArray[1]);
6 //结果为"二"
View Code

 连接字符串

 1 //y=x.concat(addstr)
 2 //
 3 //使用注解
 4 //
 5 //x代表字符串对象
 6 //addstr为添加字符串
 7 //返回x+addstr字符串
 8     
 9 var str1="abcd"; 
10 var str2=str1.concat("efgh");
11 
12 alert(str2);
13 //结果为"abcdefgh" 
View Code

 

 Array对象

  创建一维数组方式:

 1 创建方式1:
 2 var a=[1,2,3];
 3 
 4 创建方式2:
 5 new Array();     //  这个是不指定元素个数的创建方式,这个创建的是空数组
 6 
 7 创建方式3:
 8 new Array(size);// 这个是指定元素个数的创建方式
 9     例如:
10     var cnweek=new Array(7);
11         cnweek[0]="星期日";
12         cnweek[1]="星期一";
13         ...
14         cnweek[6]="星期六";
15 
16 创建方式4:
17 var test=new Array(100,"a",true);
View Code

 

  创建二维数组方式:

 1 var cnweek=new Array(7);
 2 for (var i=0;i<=6;i++){
 3     cnweek[i]=new Array(2);
 4 }
 5 cnweek[0][0]="星期日";
 6 cnweek[0][1]="Sunday";
 7 cnweek[1][0]="星期一";
 8 cnweek[1][1]="Monday";
 9 ...
10 cnweek[6][0]="星期六";
11 cnweek[6][1]="Saturday";
View Code

 

 注意:数组内可以放不同类型的内容

arr1=[1,”hello”,[11,2],{“name”:”liming”}];

 

   属性:

 arr1=[1,"hello",[11,2],{"name":"liming"}];
 alert(arr1.length);     //4

 

  方法:  

数组连接(join)

 1 //书写格式
 2 //x.join(bystr)
 3 //使用注解
 4 //
 5 //x代表数组对象
 6 //bystr作为连接数组中元素的字符串
 7 //返回连接后的字符串
 8 //与字符串的split功能刚好相反
 9     
10 var arr1=[1, 2, 3, 4, 5, 6, 7];
11 
12 var str1=arr1.join("-");
13 
14 alert(str1);
15 //结果为"1-2-3-4-5-6-7" 
View Code

数组连接(concat)

1 var a = [1,2,3];
2 var b=a.concat(4,5) ;
3 
4 
5 alert(a.toString());
6 //返回结果为1,2,3
7 alert(b.toString());
8 //返回结果为1,2,3,4,5
View Code

 数组排序

 1 //x.reverse()
 2 //x.sort()
 3 
 4 var arr1=[32, 12, 111, 444];
 5 //var arr1=["a","d","f","c"];
 6 
 7 arr1.reverse(); //颠倒数组元素
 8 alert(arr1.toString());
 9 //结果为444,111,12,32
10 
11 arr1.sort();    //排序数组元素
12 alert(arr1.toString());
13 //结果为111,12,32,444
14 
15 //------------------------------
16 arr=[1,5,2,100];
17 
18 //arr.sort();
19 //alert(arr);
20 //如果就想按着数字比较呢?
21 
22 function intSort(a,b){
23     if (a>b){
24         return 1;//-1
25     }
26     else if(a<b){
27         return -1;//1
28     }
29     else {
30         return 0
31     }
32 }
33 
34 arr.sort(intSort);
35 
36 alert(arr);
37 
38 function IntSort(a,b){
39     return a-b;
40 }
View Code

数组切片

 1 //x.slice(start, end)
 2 //
 3 //使用注解
 4 //
 5 //x代表数组对象
 6 //start表示开始位置索引
 7 //end是结束位置下一数组元素索引编号
 8 //第一个数组元素索引为0
 9 //start、end可为负数,-1代表最后一个数组元素
10 //end省略则相当于从start位置截取以后所有数组元素
11 
12 var arr1=['a','b','c','d','e','f','g','h'];
13 var arr2=arr1.slice(2,4);
14 var arr3=arr1.slice(4);
15 var arr4=arr1.slice(2,-1);
16 
17 alert(arr2.toString());
18 //结果为"c,d" 
19 alert(arr3.toString());
20 //结果为"e,f,g,h"
21 alert(arr4.toString());
22 //结果为"c,d,e,f,g"
View Code

 删除数组元素

 1 //x. splice(start, deleteCount, value, ...)
 2 //
 3 //使用注解
 4 //
 5 //x代表数组对象
 6 //splice的主要用途是对数组指定位置进行删除和插入
 7 //start表示开始位置索引
 8 //deleteCount删除数组元素的个数
 9 //value表示在删除位置插入的数组元素
10 //value参数可以省略
11 
12 
13 var a = [1,2,3,4,5,6,7,8];
14 a.splice(1,2);
15 //a变为 [1,4,5,6,7,8]
16 alert(a.toString());
17 a.splice(1,1);
18  //a变为[1,5,6,7,8]
19 alert(a.toString());
20 a.splice(1,0,2,3);
21  //a变为[1,2,3,5,6,7,8]
22 alert(a.toString());
View Code

数组栈操作1

 1 //push pop这两个方法模拟的是一个栈操作
 2 
 3 //x.push(value, ...)  压栈
 4 //x.pop()             弹栈      
 5 //使用注解
 6 //
 7 //x代表数组对象
 8 //value可以为字符串、数字、数组等任何值
 9 //push是将value值添加到数组x的结尾
10 //pop是将数组x的最后一个元素删除
11 
12 
13 var arr1=[1,2,3];
14 arr1.push(4,5);
15 alert(arr1);
16 //结果为"1,2,3,4,5"
17 arr1.push([6,7]);
18 alert(arr1)
19 //结果为"1,2,3,4,5,6,7"
20 arr1.pop();        //注意最后一次添加的是什么
21 alert(arr1);
22 //结果为"1,2,3,4,5"    
View Code

 数组栈操作2

 1 // unshift shift 
 2 //x.unshift(value,...)
 3 //x.shift()
 4 //使用注解
 5 //
 6 //x代表数组对象
 7 //value可以为字符串、数字、数组等任何值
 8 //unshift是将value值插入到数组x的开始
 9 //shift是将数组x的第一个元素删除
10 
11 var arr1=[1,2,3];
12 arr1.unshift(4,5);
13 alert(arr1);
14 //结果为"4,5,1,2,3"
15 arr1. unshift([6,7]);
16 alert(arr1);
17 //结果为"6,7,4,5,1,2,3"
18 arr1.shift();
19 alert(arr1);
20 //结果为"4,5,1,2,3"
View Code

 

   总结:

//  js中数组的特性
         //java中数组的特性,  规定是什么类型的数组,就只能装什么类型.只有一种类型.
         //js中的数组特性1: js中的数组可以装任意类型,没有任何限制.
         //js中的数组特性2: js中的数组,长度是随着下标变化的.用到多长就有多长.
         var arr5 = ['abc',123,1.14,true,null,undefined,new String('1213'),new Function('a','b','alert(a+b)')];
        /*  alert(arr5.length);//8
         arr5[10] = "hahaha";
         alert(arr5.length); //11
         alert(arr5[9]);// undefined */

 

Data对象

  创建Data方式:

 1 //方法1:不指定参数
 2 var nowd1=new Date();
 3 alert(nowd1.toLocaleString( ));
 4 //方法2:参数为日期字符串
 5 var nowd2=new Date("2004/3/20 11:12");
 6 alert(nowd2.toLocaleString( ));
 7 var nowd3=new Date("04/03/20 11:12");
 8 alert(nowd3.toLocaleString( ));
 9 //方法3:参数为毫秒数
10 var nowd3=new Date(5000);
11 alert(nowd3.toLocaleString( ));
12 alert(nowd3.toUTCString());
13 
14 //方法4:参数为年月日小时分钟秒毫秒
15 var nowd4=new Date(2004,2,20,11,12,0,300);
16 alert(nowd4.toLocaleString( ));
17 //毫秒并不直接显示
View Code

 

  方法:

获取日期和时间

 1 获取日期和时间
 2 getDate()                 获取日
 3 getDay ()                 获取星期
 4 getMonth ()               获取月(0-11 5 getFullYear ()            获取完整年份
 6 getYear ()                获取年
 7 getHours ()               获取小时
 8 getMinutes ()             获取分钟
 9 getSeconds ()             获取秒
10 getMilliseconds ()        获取毫秒
11 getTime ()                返回累计毫秒数(从1970/1/1午夜)
View Code

 设置日期和时间

 1 //设置日期和时间
 2 //setDate(day_of_month)       设置日
 3 //setMonth (month)                 设置月
 4 //setFullYear (year)               设置年
 5 //setHours (hour)         设置小时
 6 //setMinutes (minute)     设置分钟
 7 //setSeconds (second)     设置秒
 8 //setMillliseconds (ms)       设置毫秒(0-999)
 9 //setTime (allms)     设置累计毫秒(从1970/1/1午夜)
10     
11 var x=new Date();
12 x.setFullYear (1997);    //设置年1997
13 x.setMonth(7);        //设置月7
14 x.setDate(1);        //设置日1
15 x.setHours(5);        //设置小时5
16 x.setMinutes(12);    //设置分钟12
17 x.setSeconds(54);    //设置秒54
18 x.setMilliseconds(230);        //设置毫秒230
19 document.write(x.toLocaleString( )+"<br>");
20 //返回1997年8月1日5点12分54秒
21 
22 x.setTime(870409430000); //设置累计毫秒数
23 document.write(x.toLocaleString( )+"<br>");
24 //返回1997年8月1日12点23分50秒  
View Code

日期和时间的转换

 1 日期和时间的转换:
 2 
 3 getTimezoneOffset():8个时区×15度×4分/度=480;
 4 返回本地时间与GMT的时间差,以分钟为单位
 5 toUTCString()
 6 返回国际标准时间字符串
 7 toLocalString()
 8 返回本地格式时间字符串
 9 Date.parse(x)
10 返回累计毫秒数(从1970/1/1午夜到本地时间)
11 Date.UTC(x)
12 返回累计毫秒数(从1970/1/1午夜到国际时间)
View Code

  

  例题:

 1 function getCurrentDate(){
 2         //1. 创建Date对象
 3         var date = new Date(); //没有填入任何参数那么就是当前时间
 4         //2. 获得当前年份
 5         var year = date.getFullYear();
 6         //3. 获得当前月份 js中月份是从0到11.
 7         var month = date.getMonth()+1;
 8         //4. 获得当前日
 9         var day = date.getDate();
10         //5. 获得当前小时
11         var hour = date.getHours();
12         //6. 获得当前分钟
13         var min = date.getMinutes();
14         //7. 获得当前秒
15         var sec = date.getSeconds();
16         //8. 获得当前星期
17         var week = date.getDay(); //没有getWeek
18         // 2014年06月18日 15:40:30 星期三
19         return year+"年"+changeNum(month)+"月"+day+"日 "+hour+":"+min+":"+sec+" "+parseWeek(week);
20     }
21 
22 alert(getCurrentDate());
23 
24 //解决 自动补齐成两位数字的方法
25     function changeNum(num){
26     if(num < 10){
27         return "0"+num;
28     }else{
29         return num;
30     }
31 
32 }
33 //将数字 0~6 转换成 星期日到星期六
34     function parseWeek(week){
35     var arr = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六"];
36     //             0      1      2      3 .............
37     return arr[week];
38 }
View Code

RegExp对象

//RegExp对象
    // 在表单验证时使用该对象验证用户填入的字符串是否符合规则.
    //创建正则对象方式1  参数1 正则表达式  参数2 验证模式  g global / i 忽略大小写. //参数2一般填写g就可以,也有“gi”.
    // 用户名 首字母必须是英文, 除了第一位其他只能是英文数字和_ . 长度最短不能少于6位 最长不能超过12位
    //----------------------------创建方式1
    /* var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9_]{5,11}$","g");
    //
    //验证字符串
    var str = "bc123";
    alert(reg1.test(str));// true
    
    //----------------------------创建方式2  /填写正则表达式/匹配模式;
    var reg2 = /^[a-zA-Z][a-zA-Z0-9_]{5,11}$/g;
    
    alert(reg2.test(str));// true
     */
    //-------------------------------正则对象的方法-------------------
        //test方法  ==>  测试一个字符串是否复合 正则规则. 返回值是true 和false.
    
    //-------------------------String 中与正则结合的4个方法------------------.
    // macth search split replace
    var str = "hello world";
    
    //alert(str.match(/o/g)); //查找字符串中 复合正则的 内容.
    //alert(str.search(/h/g));// 0  查找字符串中符合正则表达式的内容位置
    //alert(str.split(/o/g)); // 按照正则表达式对字符串进行切割. 返回数组;
    alert(str.replace(/o/g, "s")); // hells wsrld  对字符串按照正则进行替换.
View Code

Math对象

 //Math对象
    //该对象中的属性方法 和数学有关.
    //Math是内置对象 , 与Global的不同之处是, 在调用时 需要打出 "Math."前缀.
    //属性学习:
    //alert(Math.PI);
    //方法学习:
        //alert(Math.random()); // 获得随机数 0~1 不包括1.
        //alert(Math.round(1.5)); // 四舍五入
        //练习:获取1-100的随机整数,包括1和100
             //var num=Math.random();
            //num=num*10;
            //num=Math.round(num);
            // alert(num)
        //============max  min=========================
        /* alert(Math.max(1,2));// 2
        alert(Math.min(1,2));// 1 */
        //-------------pow--------------------------------
        alert(Math.pow(2,4));// pow 计算参数1 的参数2 次方.
        



abs(x)    返回数的绝对值。
exp(x)    返回 e 的指数。
floor(x)对数进行下舍入。
log(x)    返回数的自然对数(底为e)。
max(x,y)    返回 x 和 y 中的最高值。
min(x,y)    返回 x 和 y 中的最低值。
pow(x,y)    返回 x 的 y 次幂。
random()    返回 0 ~ 1 之间的随机数。
round(x)    把数四舍五入为最接近的整数。
sin(x)    返回数的正弦。
sqrt(x)    返回数的平方根。
tan(x)    返回角的正切。
View Code

 

Function对象(重要)

  创建function的方式:

方式一:
function 函数名 (参数){

  函数体;
   return 返回值;
}
方式二:
var 函数名 = new Function("参数1","参数n","function_body");
View Code

 

功能说明:

  • 可以使用变量、常量或表达式作为函数调用的参数
  • 函数由关键字function定义
  • 函数名的定义规则与标识符一致,大小写是敏感的
  • 返回值必须使用return

 实例:

alert(1);
function func1(){
    alert('hello yuan!');
    return 8
}
 
    ret=func1();
    alert(ret)
----------------
 
var func1=new Function("name","alert(\"hello\"+name);")
func1("yuan")
View Code

 

 注意:js的函数加载执行与python不同,它是整体加载完才会执行,所以执行函数放在函数声明上面或下面都可以:

   属性:

length属性

alert(func1.length)    //返回这个函数期望的函数参数

 

  方法:

Function 对象也有与所有对象共享的 valueOf() 方法和 toString() 方法。这两个方法返回的都是函数的源代码,在调试时尤其有用。

例如: 

function func1(){
    alert('hello');
    return 8
}

alert(func1.valueOf())
View Code

 

  函数的调用:

function func1(a,b){

    alert(a+b);
}

    func1(1,2);      //3
    func1(1,2,3);    //3
    func1(1);        //NaN
    func1();         //NaN
View Code

 

  函数的内置函数arguments:

function add(a,b){

        console.log(a+b);//3
        console.log(arguments.length);//2
        console.log(arguments);//[1,2]

    }
    add(1,2)

    ------------------arguments的用处1 ------------------
    function nxAdd(){
        var result=0;
        for (var num in arguments){    //for的另一种写法,但是不建议使用,可能会出错
            result+=arguments[num]
        }
        alert(result)

    }

    nxAdd(1,2,3,4,5)

//     ------------------arguments的用处2 ------------------

    function f(a,b,c){
        if (arguments.length!=3){
            throw new Error("给了我"+arguments.length+" 个数,但是我只需要三个数")
        }
        else {
            alert("success!")
        }
    }

    f(1,2,3,4,5)   
View Code

 

  匿名函数:

    var func = function(arg){
        return "tony";
    }

 

 注意:它和普通函数是有区别的,是按逐行执行的规则的,如果调用写在前面会报错

  自执行函数:

    (function(){
        alert("tony");
    })()

    (function(arg){
        console.log(arg);
    })('123')        //前面的函数是一个正常的函数,只不过没有名字,所以用括号包裹起来,这个时候它需要一个参数,后面给他传一个参数。

 

  作用域:

  js的作用域和py相似,if while等控制语句并没有自己作用域;而函数是有自己的作用域的;

例子1:

var city = 'beijing';

    function func(){
        var city = 'shanghai';
        function inner(){
            var city = 'shenzhen';
            console.log(city);        //shenzhen
        }
        inner();
    }
    func();
View Code

 

例子2:

var city = 'beijing';
function Bar(){
    console.log(city);
}
function func(){

    var city = 'shanghai';
    return Bar;
}
var ret = func();
ret();    //beijing
View Code

 

  闭包:

var city = 'beijing';

function func(){
    var city = "shanghai";
    function inner(){
        // var city = "langfang";
        console.log(city);
    }
    return inner;
}
var ret = func();
ret();        //shanghai
View Code

 

BOM对象

BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作。使用 BOM,开发者可以移动窗口、改变状态栏中的文本以及执行其他与页面内容不直接相关的动作。

使 JavaScript 有能力与浏览器“对话”。

window对象

  方法:

alert()                显示带有一段消息和一个确认按钮的警告框。
confirm()            显示带有一段消息以及确认按钮和取消按钮的对话框。
prompt()            显示可提示用户输入的对话框。

open()               打开一个新的浏览器窗口或查找一个已命名的窗口。
close()               关闭浏览器窗口。
setInterval()       按照指定的周期(以毫秒计)来调用函数或计算表达式。
clearInterval()     取消由 setInterval() 设置的 timeout。
setTimeout()       在指定的毫秒数后调用函数或计算表达式。
clearTimeout()     取消由 setTimeout() 方法设置的 timeout。
scrollTo()            把内容滚动到指定的坐标。
View Code

 

例子:

    var result = confirm("您确定要删除吗?");
    alert(result);
//——————————————————————————————————
    //prompt 参数1 : 提示信息.   参数2:输入框的默认值. 返回值是用户输入的内容.

    var result = prompt("请输入一个数字!","haha");
    alert(result);
//——————————————————————————————————
//open方法 打开和一个新的窗口 并 进入指定网址.参数1 : 网址.
        //调用方式1
            //open("http://www.baidu.com");
        //参数1 什么都不填 就是打开一个新窗口.  参数2.填入新窗口的名字(一般可以不填). 参数3: 新打开窗口的参数.
            open('','','width=200,resizable=no,height=100'); // 新打开一个宽为200 高为100的窗口
//——————————————————————————————————
        //close方法  将当前文档窗口关闭.
            //close();
View Code

 

其中setInterval() ,clearInterval(),setTimeout(),clearTimeout()涉及到动画,很重要,文章最后的例子中会常用到。

History对象

  属性:

  History 对象包含用户(在浏览器窗口中)访问过的 URL。

  History 对象是 window 对象的一部分,可通过 window.history 属性对其进行访问。

length  返回浏览器历史列表中的 URL 数量。

 

  方法:

back()    加载 history 列表中的前一个 URL。
forward()    加载 history 列表中的下一个 URL。
go()    加载 history 列表中的某个具体页面。

Location对象

  方法:

window.location.assign(url) : 加载URL 指定的新的 HTML 文档。就相当于一个链接,跳转到指定的url,当前页面会转为新页面内容,可以点击后退返回上一个页面。

window.location.replace(url) : 通过加载 URL 指定的文档来替换当前文档 ,这个方法是替换当前窗口页面,前后两个页面共用一个窗口,所以是没有后退返回上一页的

location.reload():刷新当前页面

DOM对象

什么是DOM

DOM 是 W3C(万维网联盟)的标准。DOM 定义了访问 HTML 和 XML 文档的标准:

"W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。"

W3C DOM 标准被分为 3 个不同的部分:

  • 核心 DOM - 针对任何结构化文档的标准模型
  • XML DOM - 针对 XML 文档的标准模型
  • HTML DOM - 针对 HTML 文档的标准模型

 

  • 什么是 XML DOM?  ---->XML DOM 定义了所有 XML 元素的对象和属性,以及访问它们的方法。
  • 什么是 HTML DOM?---->HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。

DOM节点

根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点(NODE):

  • 整个文档是一个文档节点(document对象)
  • 每个 HTML 元素是元素节点(element 对象)
  • HTML 元素内的文本是文本节点(text对象)
  • 每个 HTML 属性是属性节点(attribute对象)
  • 注释是注释节点(comment对象)

节点又包含了节点属性和导航属性

节点(自身)属性:

  • attributes - 节点(元素)的属性节点
  • nodeType – 节点类型
  • nodeValue – 节点值
  • nodeName – 节点名称
  • innerHTML - 节点(元素)的文本值

导航属性:

    • parentNode - 节点(元素)的父节点 (推荐)
    • firstChild – 节点下第一个子元素
    • lastChild – 节点下最后一个子元素
    • childNodes - 节点(元素)的子节点

 加粗的是常用的

例子:

JavaScript概述
JavaScript历史

    1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言)
    Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigator 2.0产品中开发出一套livescript的脚本语言.Sun和Netscape共同完成.后改名叫Javascript
    微软随后模仿在其IE3.0的产品中搭载了一个JavaScript的克隆版叫Jscript.
    为了统一三家,ECMA(欧洲计算机制造协会)定义了ECMA-262规范.国际标准化组织及国际电工委员会(ISO/IEC)也采纳 ECMAScript 作为标准(ISO/IEC-16262)。从此,Web 浏览器就开始努力(虽然有着不同的程度的成功和失败)将 ECMAScript 作为 JavaScript 实现的基础。EcmaScript是规范.

JavaScript简介

1、它是一种客户端语言。

2、一个完整的JavaScript实现是由以下三个部分构成的:

    核心(ECMAScript),语法规范(包括语法、类型、语句、关键字、运算符等)
    文档对象模型(DOM) Document object model (整合js,css,html)
    浏览器对象模型(BOM) Broswer object model(整合js和浏览器)

3、javascript在开发中绝大多数情况是基于对象的,也是面对对象的。
JavaScript引入方式

1.嵌入式:一般没有规定放在哪里,但是一般情况下,都放在<html>标签中和<body>标签平级并写在它后面,因为浏览器加载的时候是从上到下的,需要等标签加载完成了才能找到并操作标签。

    <script>
         alert('222222');
    </script>

 

2.引入js的文件,方法和上面基本一样,就是在script标签的属性中,加入src="js文件.js"

<script src="./js/out.js"></script>

 
基本语法

1、每行结束可以不加分号. 没有分号会以换行符作为每行的结束

2、 注释

多行注释:/* */ 

单行注释: //

3、使用{}来封装代码块
数据的基本类型

5种基本数据类型:Number 、String、Boolean、Undefined、Null

1种复合类型 object

注:

1、可以用typeof()查看类型

2、基本数据类型:存储在栈中

3、引用数据类型:定义的对象存储在堆中,栈中保存的地址
数字类型(Number)

最基本的数据类型

不区分整型数值和浮点型数值

所有数字都采用64位浮点格式存储,相当于Java和C语言中的double格式

能表示的最大值是±1.7976931348623157 x 10308

能表示的最小值是±5 x 10 -324

整数:
           在JavaScript中10进制的整数由数字的序列组成
           精确表达的范围是
-9007199254740992 (-253) 到 9007199254740992 (253)
           超出范围的整数,精确度将受影响
浮点数:
           使用小数点记录数据
           例如:3.4,5.6
           使用指数记录数据
           例如:4.3e23 = 4.3 x 1023

16进制和8进制数的表达:
           16进制数据前面加上0x,八进制前面加0
           16进制数是由0-9,A-F等16个字符组成
           8进制数由0-7等8个数字组成
字符串(String)

是由Unicode字符、数字、标点符号组成的序列

字符串常量首尾由单引号或双引号括起

JavaScript中没有字符类型

常用特殊字符在字符串中的表达

字符串中部分特殊字符必须加上右划线\

常用的转义字符 \n:换行  \':单引号   \":双引号  \\:右划线

布尔型(Boolean)

Boolean类型仅有两个值:true和false,也代表1和0,实际运算中true=1,false=0

布尔值也可以看作on/off、yes/no、1/0对应true/false

Boolean值主要用于JavaScript的控制语句,例如

    if (x==1){

    y=y+1;

    }else    {

    y=y-1;

    }

 
Undefined类型

Undefined 类型只有一个值,即 undefined。当声明的变量未初始化时,该变量的默认值是 undefined。

当函数无明确返回值时,返回的也是值 "undefined";
Null类型

另一种只有一个值的类型是 Null,它只有一个专用值 null,即它的字面量。值 undefined 实际上是从值 null 派生来的,因此 ECMAScript 把它们定义为相等的。

尽管这两个值相等,但它们的含义不同。undefined 是声明了变量但未对其初始化时赋予该变量的值,null 则用于表示尚未存在的对象(在讨论 typeof 运算符时,简单地介绍过这一点)。如果函数或方法要返回的是对象,那么找不到该对象时,返回的通常是 null。
复合类型

        var oObj = {
               name:"隔壁老王",
               age:88,
           }

        var type = typeof(oObj);
        alert(type);            //Ojbect
        alert(oObj.name);       //隔壁老王

 
数据类型转换
基本数据类型转换

JavaScript属于松散类型的程序语言

变量在声明的时候并不需要指定数据类型

变量只有在赋值的时候才会确定数据类型

表达式中包含不同类型数据则在计算过程中会强制进行类别转换

数字 + 字符串:数字转换为字符串

数字 + 布尔值:true转换为1,false转换为0

字符串 + 布尔值:布尔值转换为字符串true或false

 
强制数据类型转换

函数parseInt:   强制转换成整数,不四舍五入。   例如parseInt("6.12")=6  ; parseInt(“12a")=12 ; parseInt(“a12")=NaN  ;parseInt(“1a2")=1

NaN是not a number,属于number的一种

函数parseFloat: 强制转换成浮点数  parseFloat("6.12")=6.12

函数eval:       将字符串强制转换为表达式并返回结果 eval("1+1")=2 ; eval("1<2")=true

类型查询函数(typeof)

当你不知道数据转换到是什么类型的时候可以使用这个函数

ECMAScript 提供了 typeof 运算符来判断一个值是否在某种类型的范围内。可以用这种运算符判断一个值是否表示一种原始类型:如果它是原始类型,还可以判断它表示哪种原始类型。

函数typeof :查询数值当前类型
 (string / number / boolean / object )


例如typeof("test"+3)      "string"

例如typeof(null)          "object "        注意null属于object

例如typeof(undefined)     "undefined"

例如typeof(true+1)        "number"

例如typeof(true-false)    "number"

变量
变量的定义

在js中,定义一个变量很简单,只需要var一个变量名就可以了,它会根据你的赋的值自动判断,比如:

        var iNumber = 100;
        var sString = "hello";
        var bBoolean = true;

 

一行可以声明多个变量并且可以是不同类型

        var iOne = 10,iTwo = 20, iThre = 30;

 
变量命名规范

1.区分大小写

2.第一个字符必须是字母/下划线(_)/美元符号($)

3.其他字符可以是字母,下划线,美元符号,数字

4.最好做到见名知意
匈牙利命名法
标记法命名的变量前附加一个小写字母(或小写字母序列),说明该变量的类型。例如,i 表示整数,s 表示字符串,如下所示“

对象o Object 比如:oDiv

数组a Array 比如:aItems

字符串s String 比如:sUserName

整数i Integer 比如:iItemCount

布尔值b Boolean 比如:bIsComplete

浮点数f Float 比如:fPrice

函数fn Function 比如:fnHandler

正则表达式re RegExp 比如:reEmailCheck
常量和标识符

常量 :直接在程序中出现的数据值

标识符:

    由不以数字开头的字母、数字、下划线(_)、美元符号($)组成
    常用于表示函数、变量等的名称
    例如:_abc,$abc,abc,abc123是标识符,而1abc不是
    JavaScript语言中代表特定含义的词称为保留字,不允许程序再定义为标识符

 

 

 
运算符
算数运算符
  基本运算符

 加(+)、 减(-)、 乘(*) 、除(/) 、余数(% )  加、减、乘、除、余数和数学中的运算方法一样  例如:9/2=4.5,4*5=20,9%2=1

 -除了可以表示减号还可以表示负号  例如:x=-y

 +除了可以表示加法运算还可以用于字符串的连接  例如:"abc"+"def"="abcdef"

  递增(++) 、递减(--)

   假如x=2,那么x++表达式执行后的值为3,x--表达式执行后的值为1
  i++相当于i=i+1,i--相当于i=i-1
  递增和递减运算符可以放在变量前也可以放在变量后:--i

var i=1;
console.log(i++);      这个是先显示再加一
console.log(++i);      这个是先加一再显示
console.log(i--);      这个是先显示再减一
console.log(--i);      这个是先减一再显示

 
  一元加减法

 

   var c="10";
   console.log(typeof (c));      //string
   c=+c;    //类型转换
  console.log(typeof (c));      //number
//---------------------------------------
    var a=1;
    var b=1;
    a=-a; 
    console.log(a)
//---------------------------------------
    var iNumber = NaN;
    console.log(iNumber>3);         //false
    console.log(iNumber>3);         //false
    console.log(iNumber==3);        //false
    console.log(iNumber==NaN);      //false
    console.log(iNumber!=1);        //true

 

 
逻辑运算符

 

与 (&&) 、或(||) 、非(!)

 

1 && 1 = 1

1 && 0 = 0

0 && 0 = 0

 

1 || 1 = 1

1 || 0 = 1

0 || 0 = 0

!0=1
!1=0

注意:

1、如果某个运算数不是原始的 Boolean 型值,与和或并不一定返回 Boolean 值:

    如果某个运算数是 null,返回 null。 
    如果某个运算数是 NaN,返回 NaN。 
    如果某个运算数是 undefined,返回undefined。

2、单个的&和|是位运算

3、AND下

  如果一个运算数是对象,另一个是boolean值,返回该对象

  如果两个运算数都是对象,返回第二个对象

4、OR下

  如果一个运算数是对象,并且该对象左边的运算数值均为false,则返回该对象

  如果两个运算数都是对象,返回第一个对象

 
赋值运算符

JavaScript中=代表赋值,两个等号==表示判断是否相等

例如,x=1表示给x赋值为1

if (x==1){...}程序表示当x与1相等时

if(x==“on”){…}程序表示当x与“on”相等时

 配合其他运算符形成的简化表达式

例如i+=1相当于i=i+1,i*=1相当于i=i*1,

 
关系运算符

等于 ( == )  、不等于( != ) 、 大于( > ) 、 小于( < ) 
大于等于(>=) 、小于等于(<=)

特殊的例子:

1、
var bResult = "Blue" < "alpha";
alert(bResult);   //输出 true,字符串 "Blue" 小于 "alpha",因为字母 B 的字符代码是 66,字母 a 的字符代码是 97。
2、
var bResult = "25" < "3";
alert(bResult);   //输出 "true",字符串 "25" 和 "3"。两个运算数都是字符串,所以比较的是它们的字符代码("2" 的字符代码是 50,"3" 的字符代码是 51)。
3、
var bResult = "25" < 3;
alert(bResult);   //输出 "false",字符串 "25" 将被转换成数字 25,然后与数字 3 进行比较

 

总结:

比较运算符两侧如果一个是数字类型,一个是其他类型,会将其类型转换成数字类型.

比较运算符两侧如果都是字符串类型,比较的是最高位的asc码,如果最高位相等,继续取第二位比较.

 
控制语句
if语句

if-else基本格式

if (表达式){

语句1;

......

}else{

语句2;

.....

}

 

功能说明:

如果表达式的值为true则执行语句1,否则执行语句2

 

if语句嵌套格式

if (表达式1) {

    语句1;

}else if (表达式2){

    语句2;

}else if (表达式3){

    语句3;

} else{

    语句4;

}

 

运行流程如图所示:

switch语句

switch基本格式

 

switch (表达式) {
    case 值1:语句1;break;        //当满足case,执行语句1,然后break退出switch,执行switch的下一条语句
    case 值2:语句2;break;
    case 值3:语句3;break;
    default:语句4;              //所以条件都不满足会执行语句四
}

 

 例子:

 

var x=3
        switch(x){
            case 1:y="星期一";    break;        
            case 2:y="星期二";    break;
            case 3:y="星期三";    break;
            case 4:y="星期四";    break;
            case 5:y="星期五";    break;
            case 6:y="星期六";    break;
            case 7:y="星期日";    break;
            default: y="未定义";
        }
        console.log(y);     //结果为星期三
        switch(x){
            case 1:y="星期一";    break;        
            case 2:y="星期二";    break;
            case 3:y="星期三";
            case 4:y="星期四";
            case 5:y="星期五";    break;
            case 6:y="星期六";    break;
            case 7:y="星期日";    break;
            default: y="未定义";
        }
        console.log(y);     //结果是星期五,在switch中,跳出switch一共有两种方式,一个是break跳出来,一个是switch顺序执行完。这个例子结果是星期五的原因是,它满足等于3的条件,然后赋值为星期三,但是这个条件后面没有break来跳出switch,所以它会继续顺次执行,而且不管满不满足条件,直接执行语句,当遇到等于五并且给y赋值为了星期五之后,就跳出了循环。

 

 

 

补充:
View Code

 
for语句

for循环基本格式

for (初始化;条件;增量){

    语句1;

    ...

}

 

功能说明

实现条件循环,当条件成立时,执行语句1,否则跳出循环体

 

详细解释:当执行的for的一开始,先执行初始化的操作。然后判断条件是否满足,满足则继续执行循环体内语句,不满足则直接退出执行for循环体之后的语句。满足时,执行完循环体内语句后,执行增量的语句。增量语句执行完毕之后,再进行判断,如果满足则继续执行,执行方式和第一次时一致。

        var iSum=0;

        for(var iNum=1;iNum<=10;iNum++){

            iSum+=iNum;

        }

        console.log(iSum);

while语句

 while基本格式

while (条件){

语句1;

...

}

 

功能说明

运行功能和for类似,当条件成立循环执行语句花括号{}内的语句,否则跳出循环

 例子:

var i=1;

while (i<=7) {

    document.write("<H"+i+">hello</H "+i+"> ");

    document.write("<br>");

    i++;

}

//循环输出H1到H7的字体大小

异常处理语句

try {
    //这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行
}
catch (e) {
    // 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。
    //e是一个局部变量,用来指向Error对象或者其他抛出的对象
}
finally {
     //无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。
}

 

 

注:主动抛出异常 throw Error('xxxx')  

 
ECMA对象

从传统意义上来说,ECMAScript 并不真正具有类。事实上,除了说明不存在类,在 ECMA-262 中根本没有出现“类”这个词。ECMAScript 定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。

var o = new Object();

 


这种语法与 Java 语言的相似,不过当有不止一个参数时,ECMAScript 要求使用括号。如果没有参数,如以下代码所示,括号可以省略:

var o = new Object;

 


注意:尽管括号不是必需的,但是为了避免混乱,最好使用括号。

 

 在 ECMAScript 中,所有对象并非同等创建的。
一般来说,可以创建并使用的对象有三种:本地对象、内置对象和宿主对象。

宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序。如:web浏览器,一些桌面应用系统等。即由web浏览器或是这些桌面应用系统早就的环境即宿主环境。

 

1、本地对象
ECMA-262 把本地对象(native object)定义为“独立于宿主环境的 ECMAScript 实现提供的对象”。

再来看一下,“本地对象”包含哪些内容:

Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError


由此可以看出,简单来说,本地对象就是 ECMA-262 定义的类(引用类型)。

2、内置对象
ECMA-262 把内置对象(built-in object)定义为“由 ECMAScript 实现提供的、独立于宿主环境的所有对象,在 ECMAScript 程序开始执行时出现”。这意味着开发者不必明确实例化内置对象,它已被实例化了。

同样是“独立于宿主环境”。根据定义我们似乎很难分清“内置对象”与“本地对象”的区别。而ECMA-262 只定义了两个内置对象,即 Global 和 Math (它们也是本地对象,根据定义,每个内置对象都是本地对象)。

如此就可以理解了。内置对象是本地对象的一种。而其包含的两种对象中,Math对象我们经常用到,可这个Global对象是啥东西呢?

Global对象是ECMAScript中最特别的对象,因为实际上它根本不存在,但大家要清楚,在ECMAScript中,不存在独立的函数,所有函数都必须是某个对象的方法。类似于isNaN()、parseInt()和parseFloat()方法等,看起来都是函数,而实际上,它们都是Global对象的方法。而且Global对象的方法还不止这些。有关Global对象的具体方法和属性,感兴趣的同学可以看一下这里:JavaScript 全局对象参考手册


 3.宿主对象
由ECMAScript实现的宿主环境提供的对象,可以理解为:浏览器提供的对象。所有的BOM和DOM都是宿主对象。

4.自定义对象

这个可能让人有些发懵,简单总结一下:
总结

 

 

object对象:ECMAScript 中的所有对象都由这个对象继承而来;Object 对象中的所有属性和方法都会出现在其他对象中,说两种常用的

ToString() :  返回对象的原始字符串表示。
ValueOf()  : 返回最适合该对象的原始值。对于许多对象,该方法返回的值都与 ToString() 的返回值相同。

 常用对象
 String对象

  创建方式:

var str1="hello world";

 

  属性:

var str1="String对象";

var str2="";

alert("str1长度 "+str1.length);  //8

alert("str2长度 "+str2.length);  //0

 

   方法:

 格式编排
View Code

 大小写转换
View Code

 获取指定字符串
View Code

 查询字符串
View Code

 截取字符串
View Code

 替换字符串
View Code

分割字符串
View Code

 连接字符串
View Code

 
 Array对象

  创建一维数组方式:
View Code

 

  创建二维数组方式:
View Code

 

 注意:数组内可以放不同类型的内容

arr1=[1,”hello”,[11,2],{“name”:”liming”}];

 

   属性:

 arr1=[1,"hello",[11,2],{"name":"liming"}];
 alert(arr1.length);     //4

 

  方法:  

数组连接(join)
View Code

数组连接(concat)
View Code

 数组排序
View Code

数组切片
View Code

 删除数组元素
View Code

数组栈操作1
View Code

 数组栈操作2
View Code

 

   总结:

//  js中数组的特性
         //java中数组的特性,  规定是什么类型的数组,就只能装什么类型.只有一种类型.
         //js中的数组特性1: js中的数组可以装任意类型,没有任何限制.
         //js中的数组特性2: js中的数组,长度是随着下标变化的.用到多长就有多长.
         var arr5 = ['abc',123,1.14,true,null,undefined,new String('1213'),new Function('a','b','alert(a+b)')];
        /*  alert(arr5.length);//8
         arr5[10] = "hahaha";
         alert(arr5.length); //11
         alert(arr5[9]);// undefined */

 
Data对象

  创建Data方式:
View Code

 

  方法:

获取日期和时间
View Code

 设置日期和时间
View Code

日期和时间的转换
View Code

  

  例题:
View Code
RegExp对象
View Code
Math对象
View Code

 
Function对象(重要)

  创建function的方式:
View Code

功能说明:

    可以使用变量、常量或表达式作为函数调用的参数
    函数由关键字function定义
    函数名的定义规则与标识符一致,大小写是敏感的
    返回值必须使用return

 实例:
View Code

 注意:js的函数加载执行与python不同,它是整体加载完才会执行,所以执行函数放在函数声明上面或下面都可以:

   属性:

length属性

alert(func1.length)    //返回这个函数期望的函数参数

  方法:

Function 对象也有与所有对象共享的 valueOf() 方法和 toString() 方法。这两个方法返回的都是函数的源代码,在调试时尤其有用。

例如: 
View Code

  函数的调用:
View Code

  函数的内置函数arguments:
View Code

  匿名函数:

    var func = function(arg){
        return "tony";
    }

 注意:它和普通函数是有区别的,是按逐行执行的规则的,如果调用写在前面会报错

  自执行函数:

    (function(){
        alert("tony");
    })()

    (function(arg){
        console.log(arg);
    })('123')        //前面的函数是一个正常的函数,只不过没有名字,所以用括号包裹起来,这个时候它需要一个参数,后面给他传一个参数。

  作用域:

  js的作用域和py相似,if while等控制语句并没有自己作用域;而函数是有自己的作用域的;

例子1:
View Code

例子2:
View Code

  闭包:
View Code

BOM对象

BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作。使用 BOM,开发者可以移动窗口、改变状态栏中的文本以及执行其他与页面内容不直接相关的动作。

使 JavaScript 有能力与浏览器“对话”。
window对象

  方法:
View Code

例子:
View Code

History对象

  属性:

  History 对象包含用户(在浏览器窗口中)访问过的 URL。

  History 对象是 window 对象的一部分,可通过 window.history 属性对其进行访问。

length  返回浏览器历史列表中的 URL 数量。

  方法:

back()    加载 history 列表中的前一个 URL。
forward()    加载 history 列表中的下一个 URL。
go()    加载 history 列表中的某个具体页面。

Location对象

  方法:

window.location.assign(url) : 加载URL 指定的新的 HTML 文档。就相当于一个链接,跳转到指定的url,当前页面会转为新页面内容,可以点击后退返回上一个页面。

window.location.replace(url) : 通过加载 URL 指定的文档来替换当前文档 ,这个方法是替换当前窗口页面,前后两个页面共用一个窗口,所以是没有后退返回上一页的

location.reload():刷新当前页面
DOM对象
什么是DOM

DOM 是 W3C(万维网联盟)的标准。DOM 定义了访问 HTML 和 XML 文档的标准:

"W3C 文档对象模型(DOM)是中立于平台和语言的接口,它允许程序和脚本动态地访问和更新文档的内容、结构和样式。"

W3C DOM 标准被分为 3 个不同的部分:

    核心 DOM - 针对任何结构化文档的标准模型
    XML DOM - 针对 XML 文档的标准模型
    HTML DOM - 针对 HTML 文档的标准模型

 

    什么是 XML DOM?  ---->XML DOM 定义了所有 XML 元素的对象和属性,以及访问它们的方法。
    什么是 HTML DOM?---->HTML DOM 定义了所有 HTML 元素的对象和属性,以及访问它们的方法。

DOM节点

根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点(NODE):

    整个文档是一个文档节点(document对象)
    每个 HTML 元素是元素节点(element 对象)
    HTML 元素内的文本是文本节点(text对象)
    每个 HTML 属性是属性节点(attribute对象)
    注释是注释节点(comment对象)

节点又包含了节点属性和导航属性

节点(自身)属性:

    attributes - 节点(元素)的属性节点
    nodeType – 节点类型
    nodeValue – 节点值
    nodeName – 节点名称
    innerHTML - 节点(元素)的文本值

导航属性:

        parentNode - 节点(元素)的父节点 (推荐)
        firstChild – 节点下第一个子元素
        lastChild – 节点下最后一个子元素
        childNodes - 节点(元素)的子节点

 加粗的是常用的

例子:

<div id="div1">
    <div id="div2"></div>
    <p>hello yuan</p>
</div>

<script>
    var div=document.getElementById("div2");

    console.log(div.nextSibling.nodeName);  //思考:为什么不是P?
</script>

//其实在div后面还有一个文本节点#text,就是换行和p标签前面的那些空白的地方。而我们需要的往往是标签,所以要找Element对象
View Code

 

常用的导航属性:

parentElement              // 父节点标签元素

children                        // 所有子标签
  
firstElementChild          // 第一个子标签元素

lastElementChild           // 最后一个子标签元素

nextElementtSibling       // 下一个兄弟标签元素

previousElementSibling  // 上一个兄弟标签元素
View Code

 

要注意节点间的层级关系。

父(parent)、子(child)、同胞(sibling)

父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。

  • 在节点树中,顶端节点被称为根(root)
  • 每个节点都有父节点、除了根(它没有父节点)
  • 一个节点可拥有任意数量的子
  • 同胞是拥有相同父节点的节点

基于页面(document)的HTML元素查找:

    • 通过使用 getElementById() 方法     //通过id属性  
    • 通过使用 getElementsByTagName() 方法   //通过标签名
    • 通过使用 getElementsByClassName() 方法   //通过类名
    • 通过使用 getElementsByName() 方法   //通过name属性

    比如:document.getElementById("id1"):的意思是找到这个document文档中的id是id1的标签

局部查找:

<div id="div1">

    <div class="div2">i am div2</div>
    <div name="yuan">i am div2</div>
    <div id="div3">i am div2</div>
    <p>hello p</p>
</div>

<script>

   var div1=document.getElementById("div1");

////支持;
//   var ele= div1.getElementsByTagName("p");
//   alert(ele.length);
////支持
//   var ele2=div1.getElementsByClassName("div2");
//   alert(ele2.length);
////不支持
//   var ele3=div1.getElementById("div3");
//   alert(ele3.length);
////不支持
//   var ele4=div1.getElementsByName("yuan");
//   alert(ele4.length)

</script>
View Code

 

 

DOM Event(事件)

HTML 4.0 的新特性之一是有能力使 HTML 事件触发浏览器中的动作(action),比如当用户点击某个 HTML 元素时启动一段 JavaScript。下面是一个属性列表,这些属性可插入 HTML 标签来定义事件动作。

  事件:

onclick        当用户点击某个对象时调用的事件句柄。
ondblclick     当用户双击某个对象时调用的事件句柄。

onfocus        元素获得焦点。               //练习:输入框
onblur         元素失去焦点。               应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证.
onchange       域的内容被改变。             应用场景:通常用于表单元素,当元素内容被改变时触发.(三级联动)

onkeydown      某个键盘按键被按下。          应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.
onkeypress     某个键盘按键被按下并松开。
onkeyup        某个键盘按键被松开。
onload         一张页面或一幅图像完成加载。
onmousedown    鼠标按钮被按下。
onmousemove    鼠标被移动。
onmouseout     鼠标从某元素移开。
onmouseover    鼠标移到某元素之上。
onmouseleave   鼠标从元素离开

onselect      文本被选中。
onsubmit      确认按钮被点击。
View Code

 

  添加事件的方式:

<div onclick="alert(123)">点我呀</div>
<p id="abc">试一试!</p>

<script>
    var ele=document.getElementById("abc");


    ele.onclick=function(){
        alert("hi");
    };

</script>
View Code

 

例子:  

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div class="v1">
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <div class="v2">dddd</div>
    <p id="p1" onclick="func(this)">pppppp</p>
</div>

<script>
   var ele2=document.getElementsByClassName("v2");
   for(var i=0;i<ele2.length;i++){
       ele2[i].onclick=function () {
           alert(555)
       }
   }   
</script>
</body>
</html>
View Code

 

  this:

<div id="abc" onclick="func1(this)">事件绑定方式1</div>
<div id="id123">事件绑定方式2</div>
<script>
    function func1(self){
        console.log(self.id)
    }

    //jquery下是$(self), 这种方式this参数必须填写;

//------------------------------------------
    var ele=document.getElementById("id123").onclick=function(){
         console.log(this.id);
        //jquery下是$(this), 这种方式不需要this参数;
    }
    
</script>
View Code

 

  onload:

onload 属性开发中 只给 body元素加.
这个属性的触发 标志着 页面内容被加载完成.
应用场景: 当有些事情我们希望页面加载完立刻执行,那么可以使用该事件属性。有时候script写在前面就会出现找不到标签,这时候就会用到onload方法。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>

    <script>
//          window.onload=function(){
//               var ele=document.getElementById("ppp");
//               ele.onclick=function(){
//                alert(123)
//            };
//          };



          function fun1() {
              var ele=document.getElementById("ppp");
               ele.onclick=function(){
                alert(123)
            };
          }
//注释内容和没注释的内容分别试一下
    </script>
</head>
<body onload="fun1()">

<p id="ppp">hello p</p>

</body>
</html>
View Code

 

  onsubmit:

是当表单在提交时触发. 该属性也只能给form元素使用.应用场景: 在表单提交前验证用户输入是否正确.如果验证失败.在该方法中我们应该阻止表单的提交.

例子:

<form id="form">
            <input type="text"/>
            <input type="submit" value="点我!" />
</form>

<script type="text/javascript">
            //阻止表单提交方式1().
            //onsubmit 命名的事件函数,可以接受返回值. 其中返回false表示拦截表单提交.其他为放行.

            var ele=document.getElementById("form");
            ele.onsubmit=function(event) {
//                alert("验证失败 表单不会提交!");
//                return false;
                
            // 阻止表单提交方式2 event.preventDefault(); ==>通知浏览器不要执行与事件关联的默认动作。
             alert("验证失败 表单不会提交!");
             event.preventDefault();

    }
View Code

 

  Event对象:

Event 对象代表事件的状态,比如事件在其中发生的元素、键盘按键的状态、鼠标的位置、鼠标按钮的状态。

事件通常与函数结合使用,函数不会在事件发生前被执行!event对象在事件发生时系统已经创建好了,并且会在事件函数被调用时传给事件函数.我们获得仅仅需要接收一下即可.

  事件传播:

事件传播过程中,如果父元素有同类型事件监听,被同时激活

<div id="abc_1" style="border:1px solid red;width:300px;height:300px;">
        <div id="abc_2" style="border:1px solid red;width:200px;height:200px;">
        
        </div>
</div>
    <script type="text/javascript">
    document.getElementById("abc_1").onclick=function(){
        alert('111');
    }
    document.getElementById("abc_2").onclick=function(event){
        alert('222');
        event.stopPropagation(); //阻止事件向外层div传播.
    }
    
</script>
View Code

 

例子中如果不阻止事件传播,会触发父标签的单击事件

节点的增删改查

增:

createElement(name)创建元素
appendChild();将元素添加

 

删:

获得要删除的元素
获得它的父元素
使用removeChild()方法删除

 

:

第一种方式:

      使用上面增和删结合完成修改

第二中方式:

使用setAttribute();方法修改属性          

使用innerHTML属性修改元素的内容

:  使用之前介绍的方法.

详细内容:

<script type="text/javascript">
//在第一个div中动态增加一个a标签. 该a标签点击之后跳转到百度首页.
    function addNode(){
        //1.获得 第一个div
        var div = document.getElementById("div_1");
        //2.创建a标签  createElement==>创建一个a标签   <a></a>
        var eleA =  document.createElement("a");
        //3.为a标签添加属性 <a href="http://www.baidu.com"></a>
        eleA.setAttribute("href", "http://www.baidu.com");
        //4.为a标签添加内容 <a href="http://www.baidu.com">百度</a>
        eleA.innerHTML = "百度";    
        //5.将a标签添加到div中
        div.appendChild(eleA);
    }
    //点击后 删除div区域2
    function deleteNode(){
        //1 获得要删除的div区域
            var div = document.getElementById("div_2");
        //2.获得父亲
            var parent = div.parentNode;
        //3 由父亲操刀 
            parent.removeChild(div);
    }
    //点击后 替换div区域3 为一个美女
    function updateNode(){
        //1 获得要替换的div区域3
        var div = document.getElementById("div_3");
        //2创建img标签对象 <img />
        var img = document.createElement("img");
        //3添加属性 <img src="001.jpg" />
        img.setAttribute("src", "001.JPG");
        //4.获得父节点
        var parent = div.parentNode;
        //5.替换
        parent.replaceChild(img, div);
    }
    //点击后 将div区域4 克隆一份 添加到页面底部
    
    function copyNode(){
        //1.获取要克隆的div
        var div = document.getElementById("div_4");
        //2.克隆 参数为true 那么克隆时克隆所有子元素. false 只克隆自己
        var div_copy = div.cloneNode(true);
        //3.获得父亲
        var parent = div.parentNode;
        //4.添加
        parent.appendChild(div_copy);
    }
    
    
</script>
View Code

 

修改HTML元素

修改标签内容

innerHTML和innerText

View Code

上面的例子可以不断的测试一下,innerHTML可以取出这个标签内的内容和标签,innerText只能取出内容,

而且修改的时候innerHTML可以加标签,这样内容也会被渲染出来,innerText内容加标签的话之后被当成文本内容加入进去,不会被渲染。

 

改变css样式

<p id="p2">Hello world!</p>
document.getElementById("p2").style.color="blue";

document.getElementById("p2").style.fontSize=40px;

//在css中改变字体是font-size,而在js中没有"-"而是从第二个单词开始首字母大写
View Code

 

 

 改变 HTML 属性 

var img=document.createElement("img");
img.src="meinv.jpg";

 

严谨的DOM写法:

var img=document.createElement("img");
img.setAttribute("src","meinv.jpg");

 

 

创建新的 HTML 元素 

createElement(name)

 

删除已有的 HTML 元素 

elementNode.removeChild(node)

 

关于class的操作 

elementNode.className

elementNode.classList.add

elementNode.classList.remove

例子:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<div class="div1 div2">div1</div>

<script>
    var ele=document.getElementsByTagName("div")[0];

    console.log(ele.className);     //div1 div2
    console.log(ele.classList[0]);  //div1
    console.log(ele.classList[1]);  //div2
    ele.classList.add("hide")       //这个很重要,可以给HTML元素添加功能,后面例子中有对应内容
    console.log(ele.className);     //div1 di2 hide 
</script>
</body>
</html>
View Code

 

例子

模态对话框

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .back{
            background-color: rebeccapurple;
            height: 2000px;
        }

        .shade{                 /*遮罩层*/
            position: fixed;
            top: 0;             /*四个位置设置就相当于让这个遮罩层覆盖整个屏幕*/
            bottom: 0;
            left:0;
            right: 0;
            background-color: coral;
            opacity: 0.4;       /*透明度*/
        }

        .hide{
            display: none;      /*设置为不可见*/
        }

        .models{
            position: fixed;
            top: 50%;          /*两个设置将左上角的点放在了中间*/
            left: 50%;
            margin-left: -100px;            /*将盒子调整到中间*/
            margin-top: -100px;
            height: 200px;
            width: 200px;
            background-color: gold;

        }
    </style>
</head>
<body>
<div class="back">
    <input id="ID1" type="button" value="click" onclick="action('show')">
</div>

<div class="shade hide"></div>
<div class="models hide">
    <input id="ID2" type="button" value="cancel" onclick="action('hide')">
</div>

<script>

    function action(act){
        var ele=document.getElementsByClassName("shade")[0];
        var ele2=document.getElementsByClassName("models")[0];
        if(act=="show"){
              ele.classList.remove("hide");
              ele2.classList.remove("hide");
        }else {
              ele.classList.add("hide");
              ele2.classList.add("hide");
        }

    }
</script>
</body>
</html>
View Code

 全选反选取消

<button onclick="select('all');">全选</button>
     <button onclick="select('cancel');">取消</button>
     <button onclick="select('reverse');">反选</button>

     <table border="1" id="Table">
         <tr>
             <td><input type="checkbox"></td>
             <td>111</td>
         </tr>
         <tr>
             <td><input type="checkbox"></td>
             <td>222</td>
         </tr>
         <tr>
             <td><input type="checkbox"></td>
             <td>333</td>
         </tr>
         <tr>
             <td><input type="checkbox"></td>
             <td>444</td>
         </tr>
     </table>


<script>
    function select(choice){
        var ele=document.getElementById("Table");

        var inputs=ele.getElementsByTagName("input");
        for (var i=0;i<inputs.length;i=i+1){

                   var ele2=inputs[i];
            if (choice=="all"){
                ele2.checked=true;

            }else if(choice=="cancel"){
                ele2.checked=false;
            }
            else {

                if (ele2.checked){
                    ele2.checked=false;
                }else {
                    ele2.checked=true;
                }
            }

            }
    }
</script>
View Code

 二级联动

<select id="province">
    <option>请选择省:</option>
</select>

<select id="city">
    <option>请选择市:</option>
</select>


<script>
    data={"河北省":["廊坊","邯郸"],"北京":["朝阳区","海淀区"]};


      var p=document.getElementById("province");
      var c=document.getElementById("city");
    
    for(var i in data){
        var option_pro=document.createElement("option");

        option_pro.innerHTML=i;

        p.appendChild(option_pro);
    }
     p.onchange=function(){

            pro=(this.options[this.selectedIndex]).innerHTML;
            citys=data[pro];

         c.options.length=0;

         for (var i in citys){
             var option_city=document.createElement("option");
             option_city.innerHTML=citys[i];
             c.appendChild(option_city);
         }

        }
</script>
View Code

 网页换肤

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>网页换肤</title>
    <style>
        #red{
            background: red;
        }
        #green{
            background: green;
        }

        .blue{
            color: gold;
        }
        .purple{
            color: palevioletred;
        }
    </style>

    <script>
       window.onload = function () {
                
            // 监听 两个按钮的 点击事件 修改body的backgroundColor
            // 1.获取标签
            var oRedBtn = document.getElementById('red');
            var oGreenBtn = document.getElementById('green');
            var oBody = document.getElementById('bodys');

            // 2.监听点击
            oRedBtn.onclick = function () {
                // 3.修改body的backgroundColor
                // 错误
                // body.style.backgroundColor = "red";
                oBody.style.backgroundColor = "red";
            }

            oGreenBtn.onclick = function () {
                // 3.修改body的backgroundColor
                // 错误
                // body.style.backgroundColor = "red";
                oBody.style.backgroundColor = "green";
            }

            // 类名字的属性设置
            oRedBtn.className = "purple";
       }
        
    </script>   
    
</head>
<body id="bodys">
    
    <input type="button" value="红色的背景" id="red">
    <input type="button" value="绿色的背景" id="green">
</body>
</html>
View Code

 定时器小动画

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>10-定时器的小动画</title>
    <style>
        body{
            margin:0;
        }
        .box{
            width: 200px;
            height: 300px;
            background: red;
            
            margin-top: 200px;
            margin-left: 0;
        }
    </style>

    <script>
         window.onload = function () {
             
             //1.获取标签
            var oDiv = document.getElementById('div1');

            //  2.修改 margin-left
            // 速度
            var iSpeed = 0;
            // 方向
            var iDirection = 5;
            function fnAnimation() {

                // 累加
               iSpeed += iDirection;

                // 判断范围 300px;
                // if(oDiv.style.marginLeft >300){
                    //   注意返回的 left 带单位的 305px > 300
                // }
                if( iSpeed > 300){
                    // 往左跑
                    iDirection = -5;
                }

                if (iSpeed < 0) {
                    
                    // 往右边
                    iDirection = 5;
                }
                
                // 修改 margin-left  千万注意:单位
                oDiv.style.marginLeft = iSpeed + 'px';
                console.log('定时器在活动')
            }

            // 3.开启 反复执行的 定时器
            setInterval(fnAnimation,30);

            var sStr = "310px";

            var sResult = parseInt(sStr);

            console.log(sResult)

         }
    </script>
</head>
<body>
    <div class="box" id="div1">

    </div>
</body>
</html>
View Code

 轮播图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>图片轮播器的功能实现</title>

    <style>

        /*初始化*/
        ul,li{
            margin: 0;
            padding: 0;
        }

        /*1.设置图片的外边框*/
        .picbox{

            width: 1000px;
            height: 200px;
            border: 1px solid black;
            margin: 10px auto 0;
            background-color: lightgray;

            overflow: hidden;
            position:relative;
        }
        /*2.设置列表的属性*/
        .list{

            list-style: none;
            width: 2000px;/*暂时写1000px,修改为2000是为了轮播做准备*/
            height: 200px;

            position: absolute;
            left: 0;
            top:0;
        }
        /*3.设置li标签的属性*/

        .list li{
            width: 180px;
            height: 180px;
            margin: 10px;
            float: left;
        }

        /*4.设置按钮边框的属性*/
        .btn{
            width: 1000px;
            height: 50px;
            background: pink;
            margin: 50px auto 0;

            position: relative;

        }
        /*5.设置左右两个按钮的大小位置等*/
        .left,.right{

            width: 30px;
            height: 30px;
            background-color: gold;

            line-height: 30px;
            text-align: center;
            font-family: "Arial";
            font-size: 30px;

            /*裁剪圆角*/
            border-radius: 15px;

            /* //鼠标的样式 */
            cursor: pointer;

            /* //透明度 */
            opacity: 0.5;

            /*定位*/
            position: absolute;
            left:-40px;
            top:124px;
        }

        /*6.单独设置右边按钮的位置*/
        .right{
            left:1010px;
            top:124px;
        }

    </style>

    <script>    
    
        window.onload = function (){

            // 1.获取标签
            var oList = document.getElementById('list'),

            // 左右按钮
            oLeftBtn = document.getElementById('left'),
            oRightBtn = document.getElementById('right'),

            // 轮播图的框
            oBox = document.getElementById('pic');


          
        //   将滚动的图片 复制成两份
        // oList.innerHTML * 2 "字符安" * 2
        // oList.innerHTML = oList.innerHTML + oList.innerHTML;
        oList.innerHTML += oList.innerHTML;

          // 2.修改left
         //   累加量的白能量
         var iSpeed = 0;
        //  方向
        var iDirection = -5;
          function fnAnimation() {
              iSpeed += iDirection;

            //   判断 首尾相接的条件,成立 改的位置 
            if ( iSpeed < -1000) {
                iSpeed = 0;
            }

            // 右边 ,大于0 ; 
            if (iSpeed > 0) {
                iSpeed = -1000;
            }

            // 修改left
            oList.style.left = iSpeed + 'px';

            console.log("定时器一直在执行....")
          }
          // 3.反复执行的定时器
         var timer = setInterval(fnAnimation,30);

         // 4.监听左右按钮的点击事件 改变的方向
         oLeftBtn.onclick = function () {
            //  左边
            iDirection = -2;
         }
         oRightBtn.onclick = function () {
            // 右边
            iDirection = 2;
        }


         // 5.监听鼠标的事件 onmouse
        oBox.onmouseover = function () {
            // 关闭定时器
            clearInterval(timer);
        }
        oBox.onmouseout = function () {
            
            // 开启定时器
            timer = setInterval(fnAnimation,30);
        }



        //  记录动画停止 之前 的 速度和方向
        // var upIdirection = 0;
        //  oBox.onmouseover = function () {
        //     //  记录
        //     upIdirection = iDirection;
        //     //  鼠标放上去动画 停止
        //     iDirection = 0;
        //  }

        // oBox.onmouseout = function () {
        //       //  鼠标移开 动画 开启
        //       iDirection = upIdirection;
        // }

        }
    </script>

</head>
<body>

    <div class="btn">
        <div class="left" id="left">&lt;</div>
        <div class="right" id="right">&gt;</div>
    </div>

    <div class="picbox" id="pic">

        <ul class="list" id="list">
            <li><a href=""></a><img src="images/goods001.jpg" alt="商品图片"></li>
            <li><a href=""></a><img src="images/goods002.jpg" alt="商品图片"></li>
            <li><a href=""></a><img src="images/goods003.jpg" alt="商品图片"></li>
            <li><a href=""></a><img src="images/goods004.jpg" alt="商品图片"></li>
            <li><a href=""></a><img src="images/goods005.jpg" alt="商品图片"></li>
           
        </ul>

    </div>
    

</body>
</html>
View Code

 轮播图的素材是180px*180px的图片

 

 

 

 

 

 1 首先要看一个问题,if 语句适用范围比较广,只要是 boolean 表达式都可以用 if 判断;而 switch 只能对基本类型进行数值比较。两者的可比性就仅限在两个基本类型比较的范围内。
 2 说到基本类型的数值比较,那当然要有两个数。然后重点来了——
 3 if 语句每一句都是独立的,看下面的语句:
 4 if (a == 1) ...
 5 else if (a == 2) ...
 6 这样 a 要被读入寄存器两次,12 分别被读入寄存器一次。于是你是否发现其实 a 读两次是有点多余的,在你全部比较完之前只需要一次读入寄存器就行了,其余都是额外开销。但是 if 语句必须每次都把里面的两个数从内存拿出来读到寄存器,它不知道你其实比较的是同一个 a。
 7 于是 switch case 就出来了,把上面的改成 switch case 版本:
 8 switch (a) {
 9         case 0:
10                 break;
11         case 1:
12 }
13                 
14 总结:
15 
16 1.switch用来根据一个整型值进行多路分支,并且编译器可以对多路分支进行优化
17 2.switch-case只将表达式计算一次,然后将表达式的值与每个case的值比较,进而选
18   择执行哪一个case的语句块
19 3.if..else 的判断条件范围较广,每条语句基本上独立的,每次判断时都要条件加载
20   一次。
21 所以在多路分支时用switch比if..else if .. else
posted @ 2018-05-07 21:03  苦行僧95  阅读(223)  评论(0)    收藏  举报