1. JavaScript概述
JavaScript是一种运行在浏览器中的解释型的编程语言。每一个浏览器都有JavaScript的解析引擎,不需要编译就可以直接被浏览器解析执行了。
- 功能:主要用来增强用户和html页面的交互过程,可以来控制html元素,让页面有一些动态的效果,增强用户的体验。
 
2. ECMAScript
1997年,ECMA(欧洲计算机制造商协会),制定出客户端脚本语言的标准:ECMAScript,就是统一了所有客户端脚本语言的编码方式。
JavaScript = ECMAScript + JavaScript自己特有的东西(BOM+DOM)
2.1 基本语法
2.1.1 与html结合方式
- 内部JS:定义
<script>,标签体内容就是js代码 - 外部JS:定义
<script>,通过src属性引入外部的js文件 
Tips:
script可以定义在html页面的任何地方,但定义的文字会影响执行顺序。且可以定义多个。
2.1.2 注释
- 单行注释:
// 注释内容 - 多行注释:
/*注释内容*/ 
2.1.3 数据类型
- 原始数据类型
number:JavaScript不区分整数和浮点数,统一用number表示。可以表示整数/小数/NaN(NaN表示Not a Number,当无法计算结果时用NaN表示)。string:字符串。可以使用单双引号。boolean:布尔值。true和false。null:一个对象为空的占位符。undefined:表示值未定义。
 - 引用数据类型:对象,
JavaScript的对象是一组由键-值组成的无序集合。 
<script>
        var num = 123; // 定义一个整数123
        var float = 0.456; // 定义一个浮点数0.456
        var str = "abc"; // 定义一个字符串abc
        var flag = true; // 定义一个布尔值true
        var a = null; // 定义对象a为空
        var b = undefined; // 表示值b未定义
        var person = { // 定义了一个person对象
            name:'xiaozhang',
            age:20,
            city:'hangzhou'
        }
</script>
2.1.4 变量
变量是一小块存储数据的内存空间。Java语言是强类型语言,而JavaScript是弱类型语言。
- 强类型:在开辟变量存储空间时,定义了空间将来存储的数据的数据类型。只能存储固定类型的数据
 - 弱类型:在开辟变量存储空间时,不定义空间将来的存储数据类型,可以存放任意类型的数据。
 - 语法:
var 变量名 = 初始化值; 
Tips: 可以使用
typeof运算符获取变量的类型。null运算后得到的是object类型。
document.write(num+"-->"+typeof(num)+"<br>"); // 123-->number
document.write(str+"-->"+typeof(str)+"<br>"); // abc-->string
document.write(flag+"-->"+typeof(flag)+"<br>"); // true-->boolean
document.write(a+"-->"+typeof(a)+"<br>"); // null-->object
document.write(b+"-->"+typeof(b)+"<br>"); // undefined-->undefined
document.write("person-->"+typeof(person)+"<br>"); // person-->object
2.1.5 运算符
- 一元运算符:只有一个运算数的运算符。例:
++,-- - 算数运算符:
+ - * / % ... - 赋值运算符:
=,+=,-=... - 比较运算符:
>,<,>=,<=,==,===(全等于),全等于在比较之前先判断类型,如果类型不一样,直接返回false。 - 逻辑运算符:
&&,||,!。 - 三元运算符:
表达式?值1:值2;,判断表达式的值,如果是true则取值1,反之取值2。 
var a = 1;
document.write(++a+"<br>"); // 一元运算符
var b = 2;
document.write(a+b+"<br>"); // 二元运算符: +-*/%
document.write(b+=1+"<br>"); // 3, 赋值运算符
// document.write(a>b+"<br>"); // false,比较运算符
var str = '1';
document.write((a==str)+"<br>"); // true,string类型转number,按照字面值转换为1,1==1,故true
document.write(a===str+"<br>"); // false,全等于会先进行类型判断,类型不同直接返回false
document.write(a>false); // a>0 , true
document.write(a>0?1:0); // 三元运算符
/*
在JS中,如果运算数不是运算符所要求的类型,那么js引擎会自动的将运算数进行类型转换
* 其他类型转number:
     * string转number:按照字面值转换。如果字面值不是数字,则转为NaN(不是数字的数字)
     * boolean转number:true转为1,false转为0
逻辑运算符类型转换:
    1. number:0或NaN为假,其他都为真
    2. string:除了空字符串(""),其他都是true
    3. null&undefined:都是false
    4. 对象:所有对象都是true
*/
2.1.6 流程控制语句
if...else...switch(变量):case 值:具体内容;break;,在JS中,switch语句可以接受任意的原始数据类型whiledo...whilefor
var a = 4;
var b = 7;
if (a>b){
    document.write("a>b")
} else{
    document.write("b>a")
}
var day = 3;
switch (day) {
    case 1:
        document.write("Monday");
        break;
    case 2:
        document.write("Tuesday");
        break;
    case 3:
        document.write("Wednesday");
        break;
    case 4:
        document.write("Thursday");
        break;
    case 5:
        document.write("Friday");
        break;
    case 6:
        document.write("Saturday");
        break;
    case 7:
        document.write("Sunday");
        break;
}
var c = 1;
while (c<=5){
    document.write(c+"<br>");
    c++;
}
for (i=1;i<=5;i++){
    document.write(i+"<br>")
}
2.1.7 JS特殊语法
- 语句以
;结尾,如果一行只有一条语句则可省略;(不建议) - 变量的定义使用
var关键字,也可以不使用。- 使用:定义的变量是局部变量
 - 不用:定义的变量是全局变量(不建议)
 
 
2.1.8 小练习:99乘法表
document.write("<table>")
for (i=1;i<=9;i++){
    document.write("<tr>")
    for (j=1;j<=i;j++){
        document.write("<td>")
        document.write(j+"*"+i+"="+j*i)
        document.write("</td>")
    }
    document.write("</tr>")
}
document.write("</table>")
3. 基本对象
3.1 Function:函数对象
    <script>
        /*
            1.创建函数对象:
                1. function 方法名称(形参列表){
                    方法体
                }
                2. var 方法名 = function(形参列表){
                    方法体
                }
            2. 属性:
                length:返回形参的个数
            3. 特点:
                1. 方法定义时形参的类型不用写
                2. 方法是一个对象,如果定义名称相同的方法,会覆盖
                3. 在JS中,方法的调用只与方法名称有关
                4. 在方法声明中有一个隐藏的内置关键字:argument,用于接收所有形参,封装成了一个数组
            4. 调用:
                方法名称(参数列表);
         */
        function fun(a,b) {
            document.write(a+b);
        }
        // fun(3,4); // 7
        var fun2 = function (a,b) {
            document.write(a+b);
        }
        document.write(fun2.length); // 2
        fun2(3) // NaN,原因b是undefined
        /*
            定义一个求和函数
         */
        function add() {
            var sum = 0;
            for (i=0;i<arguments.length;i++){
                sum+=arguments[i];
            }
            return sum;
        }
        document.write(add(1,2,3,4,5)); // 15
    </script>
3.2 Array:数组对象
3.2.1 创建
var arr = new Array(元素列表);var arr = new Array(默认长度);var arr = [元素列表];
3.2.2 方法
join(参数):将数组中的元素按照指定的分隔符拼接为字符串push():向数组的末尾添加一个或更多元素,并返回新的长度。
3.2.3 属性
length:数组长度
3.2.4 特点
- 在JS中,数组可以存储不同的类型元素
 - JS中,数组长度是可变的。
 
3.2.5 示例
var arr1 = new Array(1,2,3);
var arr2 = new Array(5);
var arr3 = [1,"abc",true]; // 数组可以存储不同的类型元素
document.write(arr1.join("-->")); // 1-->2-->3
arr1.push(4,5);
document.write(arr1); // 1,2,3,4,5
document.write(arr2.length); // 5
3.3 Date:日期对象
- 创建:
var date = new Date(); - 方法:
toLocaleString():返回当前date对象对应的时间本地字符串格式。getTime():获取毫秒值。返回当前日期对象描述的时间到1970年1月1日零点的毫秒值差。
 
3.4 Math:数学对象
- 创建:Math对象不用创建,可以直接使用。例:
Math.方法名(); - 方法:
random():返回0~1之间的随机数。含0不含1ceil(x):对数进行上舍入(向上取整)floor(x):对数进行下舍入(向下取整)round(x):把数四舍五入为最接近的整数
 - 属性:
PI 
document.write(Math.PI+"<br>"); // 3.141592653589793
document.write(Math.random()+"<br>"); // 0.16764969291724752
document.write(Math.ceil(3.14)+"<br>"); // 4
document.write(Math.floor(3.14)+"<br>"); // 3
document.write(Math.round(3.14)+"<br>"); // 3
// 取一个0~100之间的随机整数
var number = Math.floor(Math.random()*100+1);
document.write(number);
3.5 RegExp:正则表达式对象
- 创建:
var reg = new RegExp("正则表达式");var reg = /正则表达式/;
 - 方法:test(参数):验证指定的字符串是否符合正则定义的规范
 
var reg1 = new RegExp("\\d");
var reg2 = /[a-z]/;
document.write(reg1.test("a")); // false
document.write(reg1.test(2)); // true
document.write(reg2.test("b")); // true
3.6 Global
3.6.1 特点
全局对象,这个Global中封装的方法不需要对象就可以直接调用。例:方法名();
3.6.2 方法
encodeURI():url编码encodeURI():url编码encodeURIComponent():url编码,能编码的字符更多decodeURIComponent():url解码parseInt():将字符串转为数字。逐一判断每一个字符是否是数字,直到不是数字为止,将前边数字部分转为number类型。isNaN():判断一个值是否是NaN。NaN参与的==比较全部为false。eval():将可执行的JavaScript字符串转换为JS脚本来执行。
var str = "零度科技"; // UTF8编码转换中文,一个中文代表3个字节,即'零= %E9%9B%B6'
var encode = encodeURI(str);
document.write(encode); // %E9%9B%B6%E5%BA%A6%E7%A7%91%E6%8A%80
document.write(decodeURI(encode)); // 零度科技
var number = "123木头人321";
document.write(parseInt(number)); // 123
var a = NaN;
document.write(isNaN(number)); // false
document.write(isNaN(a)); // true
var b = "alert(123)";
eval(b); // 将会执行alert(123)这段js代码,在浏览器弹出123