java是一种强类型语言,强类型怎么理解?
java语言存在编译阶段,假设有代码int i;
那么在java中有一个特点是:java程序编译阶段就已经确定了i变量的数据类型,该变量的数据类型是int类型
那么该变量直到最终内存释放,一直是int类型,不可能变成其他类型。
除非强转,否则无法改变变量类型,只能传值。还存在着精度丢失。
javascript中的变量?
怎么声明变量?
var 变量名;
怎么给变量赋值?
变量名=值;
JavaScript是一种弱类型语言,没有编译阶段,一个变量可以随意赋值;
重点:JavaScript是一种弱类型编程语言。
undefined在JS中是一个具体存在的值。
当一个变量没有被手动赋值的时候,系统默认复制undefined。

JS的函数定义方式:
第一种方式:
function 函数名(形式参数列表){
函数体;
}
第二种方式:
函数名=function(形式参数列表){
函数体;
}
function sum(a,b){
a和b都是局部变量,他们都是形参(a和b都是变量名,变量名随意)
}
定义了函数之后必须调用才会执行。
NaN是一个具体存在的值,该值表示不是数字,Not a Number

JS当中的方法有重载机制,JS中的函数能重载吗?
//什么叫方法重载:同一类中相同方法名但参数不同的方法称为方法重载。
答:JS当中的函数在调用的时候,参数的类型没有限制,并且参数的个数也没有限制,JS就是这么的随意。
在JS当中,函数的名字不能重名,当函数重名的时候,后声明的函数会将之前声明的函数覆盖。
因为JS的弱类型特点,不严格区别参数类型,所以参数个数,类型,几个都可以,
而且只要是同名的函数,后写的会把前面的覆盖掉,相当于只能存在一个,而参数又不做严格区分,相当于自带重载机制
而java是严格区分的,所以想要传不同参数必须再写一个同名方法,但多个同名方法可以共存,系统会选择对应参数的方法去执行。

//什么叫方法重写:
如果子类不想原封不动的继承父类中的方法,可以对方法进行重写。
子类继承父类中的所有方法,当需要方法重写时,需要子类中新的方法与父类中的方法名,参数类型和个数,返回值均相同。
方法体可根据需要任意编写,但注意返回值需要相同。

JS中的全局变量:
在函数体之外声明的变量属于全局变量,全局变量的生命周期是:浏览器打开时声明,浏览器关闭时销毁,尽量少用。
因为全局变量会一直存在浏览器的内存当中,耗费内存空间。
能使用局部变量就用局部变量。
JS中的局部变量:
在函数体当中声明的变量。包括一个函数的形参都属于局部变量。
局部变量的生命周期是,函数开始执行局部变量的内存空间开辟,函数执行结束之后,局部变量的内存空间释放。

虽然JS中的变量在声明时不需要指定数据类型,但是在赋值时每一个数据还是有类型的
JS中的数据类型包括原始类型和引用类型。
EcmaScript(ES) ES6之前和ES6之后的数据类型不一样
原始类型:Undefined,number,String,Boolean,Null
引用类型:Object以及Object的子类

ES6之后在以上的六种之外添加了一个新的类型:Symbol

JS中有一个运算符叫typeof,这个运算符可以在程序的运行阶段动态的获取变量的数据类型。
typeof运算符的语法格式:
    typeof 变量名
typeof运算符的运算结果是以下六个字符串之一,注意字符串小写
undefined,number,string,boolean,object,function
在js当中比较字符串使用==,没有equals

求和,要求a变量和b变量将来的数据类型必须是数字,不能是其他类型
因为以下定义的sum函数是为了完成两个数字的求和
function sum(a,b){

}

别人去调用以上函数,可以这样写
function sum(a,b){
if(typeof a == “number” && typeof b == “number”
return a + b;
}

Undefined类型只有一个值,这个值就是undefined
当一个变量没有手动赋值,系统默认赋值undefined
或者也可以给一个变量手动赋值undefined

Number类型包括哪些值?
-1,1,2,3.14,100,….NaN Infinitiy
整数,浮点数,正数负数,不是数字,无穷大都属于Number类型。
什么情况下结果是NaN呢?
当运算结果本应是一个数字,但最后算完不是一个数字的时候
Infinity(当除数为0的时候,结果为无穷大)

1.关于isNaN函数?
用法isNaN(数据),结果是true表示这不是一个数字,false表示这是一个数字
2.parseInt()函数 可以将字符串自动转换成数字,并且取整数位
3.parseFloat()函数 可以将字符串自动转换成数字,
4.Math.ceil()函数(Math是数学类,数学类当中有一个函数ceil(),作用是向上取整

Boolean类型
两个值,true和false
在Boolean类型中有一个函数叫Boolean(),该函数的作用是将非布尔类型转成布尔类型。
1 true
0 false
“” false
“abc” true
null false
NaN false
undefined false
Infinity true

Null类型只有一个值,null

String类型
在JS当中字符串可以使用单引号,也可以使用双引号
var s1 = ‘abcdef’;
var s2 = “abcdef”;
在JS当中,怎么创建字符串对象呢?
两种方式
第一种:var s= “abc”;
第二种(使用JS内置的支持类String,可以直接用,String的父类是Object

小string(属于原始类型String)
var s= "abc";

调用内置函数的一般称为大String(属于Object类型)
var y = new String("abc");

无论小string还是大String,他们的属性和函数都是通用的。

常用函数:
    length 获取字符串长度
    indexof 获取指定字符串在在当前字符串中第一次出现处的索引
    lastindexof 获取指定字符串在当前字符串中最后一次出现处的索引
    replace 替换
    substr 截取子字符串
    substring 截取子字符串
    toLowerCase 转换小写
    toUpperCase 转换大写
    split 拆分字符串

获取字符串长度
    alert(x.length);

    alert("http://www.baidu.com".indexof("http"));//0
    alert("http://www.baidu.com".indexof("https"));//-1

判断一个字符串中是否包含某个子字符串?
    alert("http://www.baidu.com".indexof("https") >=0 ? "包含" : "不包含" );//不包含

replace
"name=value%name=value%name=value".replace("%","&");//只替换了一个
想全部替换需要正则表达式

考点:经常问,substr和substring的区别?
//substr(startIndex,length)
alert("abcdefxyz".substr(2.4));//cdef
//substring(startIndex,endIndex)注意:不包含endIndex
alert("abcdefxyz".substring(2,4);//cd

Object类型:
    Object类型是所有类型的超类,自定义的任何类型,默认继承Object
    Object类包括哪些属性?
    复习:Java的Object类中的方法
    clone方法,toString方法,equals方法,toString方法,hashcode方法,getClass方法,notify唤醒线程方法,notifyAll方法,wait等待线程方法,finalize方法(gc回收器)。

    JS的Object类属性
        prototype属性(最常用的):作用是给类动态的扩展属性和函数。
        constructor属性
    Object类包括哪些函数?
        toString方法
        toLocalString方法
        valueOf方法
    在JS当中定义的类默认继承Object,会继承Object类当中所有的属性以及函数。
    换句话说,自己定义的类当中也有prototype属性。

    在JS当中怎么定义类?怎么new对象?
        定义类的方法:
        第一种方法:
            function 类名(形参){
            
            }
        第二种方法:
            类名 function(形参){
            
            }
        创建对象的语法:
            new 构造方法名(实参);//构造方法名和类名一致。

举个例子:有函数
        function sayHello(){
        
        }
        
        sayHello();

        //这种方式就表示把sayHello当做一个类来创建对象
        var obj = new sayHello();//obj是一个引用,保存内存地址指向堆中的对象。

JS当中类的定义,同时又是一个构造函数的定义
在JS中类的定义和构造函数的定义是放在一起来定义的。

可以通过prototype这个属性来给类动态扩展属性以及函数
function Production(pno,pname,price){
this.pno=pno;
this.pname=pname;
this.price=price;
this.getPrice = function(){
return this.price;
}
}

var XiGua = new Product(111,"西瓜",4.0)

Product.prototype.getPname = function(){
    return this.pname;
}
上述代码作用为假设有一个product类,通过他的prototype属性可以直接新建一个函数getPname传给product类来扩展。

调用后期扩展的getPname函数
    var pname=XiGua.getPname();

番外:null undefined NaN有什么区别?
null NaN undefined数据类型不一致。
null(Object) NaN(Number) undefined(Undefined)

//null和undefined可以等同。
null == NaN //false
null == undefined // true
undefined ==NaN //false

    在JS当中有两个比较特殊的运算符
    ==(等同运算符,只判断值是否相等)
    ===(全等运算符,既判断是否相等,又判断数据类型是否相等)
把上方三个例子拿下来换成三个等号,三个结果都是false

JS中的常用事件
blur失去焦点
change下拉列表选中项改变,或文本框内容改变
click鼠标单击
dblclick鼠标双击
focus获得焦点
keydown键盘按下
keyup键盘弹起
load页面加载完毕
mousedown鼠标按下
mouseover鼠标经过
mousemove鼠标移动
mouseout鼠标离开
mouseup鼠标弹起
reset表单重置
select文本被选定
submit表单提交

任何一个事件都会对应一个事件句柄,事件句柄是在事件前添加on
onXXX这个事件句柄出现在一个标签的属性位置上。(事件句柄以属性的形式存在。)

注册事件的第一种方式,直接在标签中使用事件句柄
对于当前程序来说,sayHello函数被称为回调函数(callback函数)
回调函数的特点:自己把这个函数代码写出来了,但是这个函数不是自己负责调用,由其他程序负责调用这个函数
function sayHello(){
alert(“hello js!”)
}

<input type="button" value="hello" onclick="sayHello()"/>

java中也有回调函数,假定有一个主函数调用run方法,站在主函数的角度看run方法叫正向调用
站在run方法编写者角度来看这个方法,把run方法叫做回调函数。

第二种注册事件的方式,是使用纯JS代码完成事件的注册。

<input type="button" value="hello3" id=mybtn1 />
第一步:先获取这个按钮对象
<script type=text/javascript>
    function doSome(){
        alert("do some!");
    }
(document全部小写,内置对象,可以直接用,document就代表整个html页面)
    var btnObj = document.getElementById("mybtn");
第二步:给按钮对象的onclick属性赋值。
    btnObj.onclick = doSome;//注意,千万别加小括号,btnObj.onclick = doSome();这是错误的写法。
    
    var mybtn1 = document.getElementById("mybtn1");
    mybtn1.onclick=function(){//这个函数没有名字,叫做匿名函数,这个匿名函数也是一个回调函数。
        alert("test....");//这个函数在页面打开的时候只是注册上,不会被调用,在click事件发生之后才会被调用。
    }

一行代码能不能全写出来?能
    document.getElementById("mybtn2").onclick = function(){
        alert("test22222.....");
    }
</script>

关于JS代码的执行顺序
有时会遇到需要先获取对象才能绑定事件的情况,这样的话代码就必须按顺序编写,但是这样比较麻烦
可以考虑使用onload句柄,等待页面全部元素加载完毕之后才会发生load事件。
例子



当页面加载完毕时才会发生load事件

捕捉键盘输入
举例,输入账户名密码,捕捉enter键直接登录
window.onload = function(){
var usernameElt = document.getElementById(“username”).onclick = function(){
//回车键的键值是13
//ESC的键值是27
usernameElt.onkeydown = function(event//局部变量,随便写){
//获取键值
//对于“键盘事件对象”来说,都有keyCode属性用来获取键值
if(event.keyCode === 13){
alert(“正在进行验证”);
}
}

            }
    
    <input type="text" id="username"/>

JS的void运算符
void运算符的语法:void(表达式)
运算原理:执行表达式,但不返回任何结果。
javascript:void(0)
其中javascript:作用是告诉浏览器后面是一段JS代码。
以下程序的javascript是不能省略的。
<a href=”javascript:void(0)” onclick=”window.alert(‘test code’)>
既保留住超链接的样式,同时用户点击该超链接的时候执行一段JS代码,但页面还不能跳转。

JS的控制语句
if switch while do..while.. for break continue

JS特有的:for..in语句
    with语句
java中的数组:int[] arr={1,2,3,4,5,6};
js中的数组:var arr={false,true,1,2,"abc",3.14};JS数组中的元素类型随意,个数随意
遍历数组
    for(var i = 0;arr.length;i++){
        
    }
for.. in语句
for(var i in arr){
    alert(arr[i]);
}
这个i是下标
for..in语句可以遍历对象的属性

在JavaScript中,可以使用.和[]来访问对象的属性。
二者的区别:.表示一般作为静态对象使用时来存取属性,而[]表示在动态存取属性是非常有用
例:var object = {name:'zhangsan',age:29};
var name1 = object.name;var name2 = object['name'];

假设这有个user函数,里面有用户名和密码两个属性。
for (var shuXingMing in u){

}
此时shuXingMing是属性名,类型为字符串

with(u){
    username+","+password;
}
改变作用域,可以在指定的代码区域,直接通过节点名称调用对象
就是可以不用写u.username;u.password;了,写一起比较省事
但是不常用,因为你把不在这当中的属性写进去他也会一起。

DOM部分
JavaScript包括三大块:
ECMAScript:JS的核心语法(ES规范/ECMA-262标准)
DOM:Document Object Model(文档对象模型:对网页当中的节点进行增删改的过程。)HTML文档被当成一颗DOM树来看待。
BOM:Browser Object Model(浏览器对象模型)
DOM和BOM的区别和联系?
BOM的顶级对象是:window
DOM的顶级对象是:document
实际上BOM是包括DOM的
获取文本框的value
<script type=”text/javascript“>
window.onload = function(){
document.getElementById(“setBtn”).onclick = function(){
document.getElementById(“username2”).value = document.getElementById(“username1”).value;
}
}

    <int type="text" id="username1" />
    <int type="button" value="将第一个文本框中的value赋值到第二个文本框上" id="setBtn" />
    <br>
    <int type="text" id="username2" />
    按一下按键就把第一个文本框中输入的值复制到第二个框中

innerHTML和innerText操作div和span
<script type=”text/javascript”>
window.onload = function(){
var btn = document.getElementById(“btn”);
btn.onclick = function(){
//设置div的内容
//第一步:获取div对象
var divElt = document.getElementById(“div1”);
//第二步:使用innerHTML属性来设置元素内部的内容
//divElt.innerHTML = “asdasfssggsgdg”;
//divElt.innerHTML = “用户名不能为空!“; innerHTML可以解释执行后面的HTML代码
divElt.innerText = “用户名不能为空!“; innerText只会把内容以文本的形式输出
}
}

    <input type="button" value="设置div中的内容" id="btn"/>

    <div id="div1"></div>
    这俩都不是方法,是属性!

关于正则表达式
什么是正则表达式,有什么用?
正则表达式:Regular Expression
正则表达式主要用在字符串格式匹配方面
正则表达式实际上是一门独立的学科,在各种语言中都有支持
常见的正则表达式符号?
.匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束

    * 重复零次或更多次
    + 重复一次或更多次
    ? 重复零次或一次
    {n} 重复n次
    {n,} 重复n次或更多次
    {n,m} 重复n到n次

    \W 匹配任意不是字母,数字,下划线,汉字的字符
    \S 匹配任意不是空白符的字符
    \D 匹配任意非数字的字符
    \B 匹配不是单词开头或结束的位置
    [^x] 匹配除了x以外的任意字符
    [^aeiou] 匹配除了aeiou这几个字母以外的任意字符

    正则表达式当中的小括号()优先度较高
    [1-9]表示1到9的任意一个数字(次数是一次)
    [A-Za-z0-9]表示A-Za-z0-9中的任意一个字符
    [A-Za-z0-9-]表示A-Z,a-z,0-9,-,以上所有字符中的任意一个字符

简单的正则表达式要会写
    QQ号的正则表达式:^[1-9][0-9]{4,}$

他人编写的正则表达式要能看懂
    email正则:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

怎么创建正则表达式对象,怎么调用正则表达式对象的方法?
    第一种创建方式:
        var regExp = /正则表达式/flags;
    第二种创建方式:使用内置支持类RegExp
        var regExp = new RegExP("正则表达式","flags");这里也可以写字符串,就只检索字符串
    关于flags:
        g:全局匹配
        i:忽略大小写
        m:多行搜索(ES规范制定之后才支持m),如果使用正则表达式则不能使用m

    正则表达式对象的test()方法?
        true / false = 正则表达式对象.test(用户填写的字符串);
        true : 字符串格式匹配成功
        false :字符串格式匹配失败
    <script type="text/javascript">
        window.onload = function(){
            //给按钮绑定click
            document.getElementById("btn").onclick=function(){
                var email = document.getElementById("email").value;
                var emailRegExp = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/
                var ok = emailRegExp.test(email);
                if(ok){
                    document.getElementById("emailError").innerText = "邮箱地址合法!";
                }else{
                    document.getElementById("emailError").innerText = "邮箱地址不合法!";
                }
            }
            //给文本框绑定focus
            document.getElementById("email").onfocus = function(){
                document.getElementById("emailError").innerText = "";
            }
        }
    </script>

    <input type="text" id="email"/>
    <span id="emailError" style="color:red;font-size:12px;"></span>
    <br>
    <input type="button" value="验证邮箱" id="btn"/>

去除字符串的前后空白trim
字符串类型的变量默认继承String类的一个函数trim(),作用是可以去除字符串的前后空白,但低版本的IE不支持trim函数
那此时怎么办呢?
可以自己对String类扩展一个全新的trim()函数
String.prototype.trim = function(){
//在当前的方法中的this代表的就是当前字符串
this.replace
return this.replace(/^\s+),””).replace(/\s+&,””);
}

    注意!div独占行,span可以跟在行后边!!

从这里开始接写的几个HTML看

js中直接创建数组,可以随便塞,塞多少都行,自动扩容且数据类型无限制
如果采用另一种方式,new Array()
参数什么也不写数组长度是0,写一个数代表给定长度,写更多代表直接塞元素,此时长度为参数的个数

总结:有哪些方式可以通过浏览器向服务器发送请求?
1.表单form的提交
2.超链接
3.document.location
4.window.location
5.window,open(“url”)
6.直接在浏览器地址栏上输入url

以上所有 请求方式均可以携带数据给服务器,只有通过表单提交的数据才是动态的