JavaScript學習筆記
一、引入js
1.1、内部标簽
<script>
//....
</script>
1.2、外部引入
<script scr="abc.js"></script>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- script内寫js -->
<script>
alert("hello dd");
</script>
<!--外部導入-->
<script src="js/dd.js"></script>
</head>
<body>
<!--這裡也可以寫-->
</body>
</html>
二、基本文法入門
// 1.定義變量 變量類型 變量名 = 變量值;
const num = 123; // 常量
let dd = "ddd"; // 變量
alert(num);
// 2.條件控制
if(2>1){
alert("turn");
}
2.1、資料類型
number
JS不區分小數和整數,Number
123
123.1
1.123e3
-99
NaN // not a number
Infinity //表示無限大
字元串
'abc' "abc"
布爾值
turn, false
邏輯運算
&&
||
!
比較運算符(重要!)
=
== 等于(類型可以不一樣,值一樣,也會判斷為turn)
=== 絕對等于(類型一樣,值一樣,才會判斷為turn)
這是JS的缺陷,堅持不要使用==比較
須知:
- NaN===NaN,這個與所有的數值都不相等,包括自己
- 隻能通過isNaN(NaN)來判斷這個數是否為NaN
浮點數問題:
console.log((1/3))===(1-2/3)
盡量避免使用浮點數進行運算,存在精度問題!
Math.abs(1/3-(1-2/3))<0.00000001
null和undefined
- null 空
- undefin 未定義
數組
Java的數組必須是相同類型的對象~,JS中不需要這樣!
var arr = [1,5,6,8,'hello',null,true];
new Array(1,12,34,15)
去數組下标:如果越界了,就會
undefined
對象
對象是大括号,數組是中括号~~
每個屬性之間使用逗号隔開,最後一個不需要添加
var person{
name:"dd",
age:3,
tags:['js']
}
2.2嚴格檢查模式
<!--
前提: IEDA需要設定支援ES6文法
'use strict'; 嚴格檢查模式,預防JavaScript的随意性導緻産生的一 些問題
必須寫在JavaScript的第一行!
局部變量建議都使用let去定義~
-->
<script>
'use strict'
let i=1;
</script>
三、資料類型
1、 正常字元串我們使用單引号,或者雙引号包裹
2、注意轉義字元\
\'
\n
\t
\u4e2d \u#### Unicode字元
\x41 Asc11字元
3.多行字元編寫
//tab上面 esc鍵下面
var msg =
`he11o
world
你好ya
你好`
4.模闆字元串
let name = "dd";
let age = 3;
let msg=`你好,
${name}`
5.字元串長度
str.length
6.字元串的可變性-不可變
7.大小寫轉換
//注意,這裡是方法,不是屬性了
student. touppercase()
student. toLowe rCase ()
8.student.indexOf("t")
9.substring
[)
student. substring(1) // 從第一個字元串截取到最後-一個字元串
student . substring(1,3) //[1,3)
3.1、數組
Array可以包含任意的資料類型
var arr = [1,2,3,4,5,6]
arr[0] = 5
1.長度
arr.length
注意:加入給arr.length指派,數組大小就會發生變化~,如果指派過小,元素就會丢失
2.indexOf, 通過元素獲得下标索引
arr.indexof(2)
1
字元串的“1"和數字1是不同的
3.slice () 截取Array的一 部分,傳回一個新數組,類似于String中的substring
4.push(), pop() 尾部
push:
壓入到尾部
pop:
彈出尾部的一個元素
5.unshift() , shift()頭部
unshift:
壓入到尾部
shift:
彈出尾部的一個元素
6.排序sort()
(3) ["b", "c", "a"]
arr.sort()
(3) ["a", "b", "c"]
7.元素反轉reverse()
(3) ["a", "b", "c"]
arr.reverse()
(3) ["c", "b", "a"]
8.concat ()
arr.concat([1,2,3])
(6) ["c", "b", "a", 1, 2, 3]
arr
(3) ["c", "b", "a"]
注意: concat () 并沒有修改數組,隻是會傳回-一個新的數組
9.連接配接符 join
列印拼接數組,使用特定的字元串連接配接
(3) ["c", "b", "a"]
arr.join('-')
"c-b-a"
10.多元數組
arr = [[1,2],[3,4],["5","6'"]];
arr[1] [1]
4
3.2、對象
var 對象名 = {
屬性名:屬性值,
屬性名:屬性值
}
//定義了一個person對象,它有三個屬性
var person = {
name:"dd",
age: 18,
score: 0
}
Js中對象,.... 表示-一個對象,鍵值對描述屬性 xxXx: xXXx, 多個屬性之間使用逗号隔開,最後一個屬性不加逗号!
JavaScript中的所有的鍵都是字元串,值是任意對象!
1.對象指派
person
{name: "dd", age: 18, score: 0}
person.name="woshidd"
"woshidd"
2.使用一個不存在的對象屬性,不會報錯!undefined
person.dd
undefined
3.動态的删減屬性,通過delete删除對象的屬性
delete person.age
true
person
{name: "woshidd", score: 0}
4.動态的添加,直接給新的屬性添加值即可
person.haha = "haha"
"haha"
person
{name: "woshidd", score: 0, haha: "haha"}
5.判斷屬性值是否在這個對象中! XXX in xXx!
"name" in person
true
//繼承
"toString" in person
true
6.判斷一個屬性是否是這個對象自身擁有的hasOwnProperty()
person.hasOwnProperty("toString")
false
person.hasOwnProperty("name")
true
3.3、流程控制
if判斷
while循環,避免程式死循環
for循環
forEach循環
ES5.1特性
for …in-------下标
3.4、Map和Set
ES6的新特性~
Map
Set:無序不重複的集合
3.5、iterator
es6新特性
周遊數組
周遊Map
周遊set
四、函數
4.1、定義函數
定義方式一
絕對值函數
一旦執行到return代表函數結束,傳回結果!
如果沒有執行return,函數執行完也會傳回結果,結果就是undefined
定義方式二
function(x){…}這是一個匿名函數。但是可以吧結果指派給abs,通過abs就可以調用函數!
方式一和方式二等價!
調用函數
abs(10)//10
abs(-10) //10
12
參數問題:javaScript可以傳任意個參數,也可以不傳遞參數~
參數進來是否存在問題?
假設不存在參數,如何規避?
arguments
arguments是一個JS免費贈送的關鍵字;
代表,傳遞進來的所有參數,是一個數組!
問題:arguments包含所有的參數,我們有時候想使用多餘的參數來進行附加操作。需要排除已有參數~
rest
以前:
ES6引入的新特性,擷取除了已經定義的參數之外的所有參數~…
rest參數隻能寫在最後面,必須用…辨別。
4.2、變量的作用域
在javascript中,var定義變量實際是有作用于的。
假設在函數體重聲明,則在函數體外不可以使用~(閉包)
如果兩個函數使用了相同的變量名,隻要在函數内部就不沖突
内部函數可以通路外部函數的成員,反之則不行
假設,内部函數變量和外部函數變量,重名!
假設在JavaScript中,函數查找變量從自身函數開始~, 由“内”向“外”查找,假設外部存在這個同名的函數變量,則内部函數會屏蔽外部函數的變量。
提升變量的作用域
結果:x undefined
說明:js執行引擎,自動提升了y的聲明,但是不會提升變量y的指派;
這個是在javascript建立之初就存在的特性。 養成規範:所有 的變量定義都放在函數的頭部,不要亂放,便于代碼維護;
全局變量
全局對象window
alert() 這個函數本身也是一個window的變量;
javascript實際上隻有一個全局作用域,任何變量(函數也可以視為變量),假設沒有在函數作用範圍内找到,就會向外查找,如果在全局作用域都沒有找到,就會報錯 Refrence
規範
由于我們的所有變量都會綁定到window上,。如果不同的js檔案,使用了相同的全局變量,就會産生沖突—>如何減少這樣的沖突?
把自己的代碼全部放入自己定義的唯一空間名字中,降低全局命名沖突問題~
jQuery中就是使用的該方法:jQuery.name,簡便寫法:$()
局部作用域
ES6的let關鍵字,解決了局部作用域沖突的問題!
都用let去定義局部作用域的變量;
常量
在ES6之前,怎麼定義常量:隻有用全部大寫字母命名的變量就是常量;建議不要修改這樣的值。
在ES6引入了常量關鍵字 const
4.3、方法
定義方法
方法就是把函數放在對象的裡面,對象隻有兩個東西:屬性和方法
this.代表什麼?拆開上main的代碼看看
this是無法指向的,是預設指向調用它的那個對象的;
apply
在js中可以控制this指向
五、内部對象
标準對象
5.1、Date
基本使用
轉換
5.2、JSON
JSON是什麼
在javascript中,一切皆為對象,任何js支援的類型都可以用JSON表示
格式
- 對象都用{}
- 數組都用[]
- 所有的鍵值對 都是用key:value
JSON字元串和js對象轉化
JSON和JS對象的差別
5.3、AJAX
- 原生的js寫法 xhr異步請求
- jQuery封裝好的方法$(#name).ajax("")
- axios請求
六、面向對象程式設計
原型對象
javascript、java、c#------面向對象;但是javascript有些差別!
- 類:模闆
- 對象:具體執行個體
原型:
class集繼承
class關鍵字,是在ES6引入的
1、定義一個類、屬性、方法
2、繼承
<script>
//ES6之後========================
//定義一個學生的類
class Student{
constructor(name){
this.name = name;
}
hello(){
alert('hello');
}
}
class XiaoStudent extends Student{
constructor(name,grade){
super(name);
this.grade = grade;
}
myGrade(){
alert('dd');
}
}
var xiaoming = new Student("xiaoming");
var xiaohong = new XiaoStudent("xiaohong",1);
</script>
12345678910111213141516171819202122232425
本質:檢視對象原型
七、操作BOM對象(重點)
window
window代表浏覽器視窗
Navigator(不建議使用)
Navigator封裝了浏覽器的資訊
大多數時候,我們不會使用navigator對象,因為會被認為修改!
不建議使用這些屬性來判斷和編寫代碼
screen
代表螢幕尺寸
location(重要)
location代表目前頁面的URL資訊
document(内容DOM)
document代表目前的頁面,HTML DOM文檔樹
擷取具體的文檔樹節點
擷取cookie
劫持cookie原理
伺服器端可以設定cookie為httpOnly
history(不建議使用 )
history代表浏覽器的曆史記錄
八、操作DOM對象(重點)
DOM:文檔對象模型
核心
浏覽器網頁就是一個Dom樹形結構!
- 更新:更新Dom節點
- 周遊Dom節點:得到Dom節點
- 删除:删除一個Dom節點
- 添加:添加一個新的節點
要操作一個Dom節點,就必須要先獲得這個Dom節點
獲得Dom節點
這是原生代碼,之後我們盡量都使用jQuery();
更新節點
操作文本
操作css
删除節點
删除節點的步驟:先擷取父節點,再通過父節點删除自己
注意:删除多個節點的時候,children是在時刻變化的,删除節點的時候一定要注意。
插入節點
我們獲得了某個Dom節點,假設這個dom節點是空的,我們通過innerHTML就可以增加一個元素了,但是這個Dom節點已經存在元素了,我們就不能這麼幹了!會産生覆寫
追加
建立一個新的标簽
<script>
var js = document.getElementById('js');//已經存在的節點
var list = document.getElementById('list');
//通過JS建立一個新的節點
var newP = document.creatElement('p');//建立一個p标簽
newP.id = 'newP';
newP.innerText = 'Hello,Kuangshen';
//建立一個标簽節點
var myScript = document.creatElement('script');
myScript.setAttribute('type','text/javascript');
//可以建立一個style标簽
var myStyle = document.creatElement('style');//建立了一個空style标簽
myStyle.setAttribute('type','text/css');
myStyle.innerHTML = 'body{background-color:chartreuse;}';//設定标簽内容
document.getElementByTagName('head')[0].appendChild(myStyle);
</script>
123456789101112131415161718
insertBefore
var ee = document.getElementById('ee');
var js = document.getElementById('js');
var list = document.getElementById('list');
//要包含的節點.insertBefore(newNode,targetNode)
list.insertBefore(js,ee);
12345
九、操作表單
表單是什麼?form-----DOM樹
- 文本框----text
- 下拉框----select
- 單選框----radio
- 多選框----checkbox
- 隐藏域----hidden
- 密碼框----password
- …
表單的目的送出資訊
獲得要送出的資訊
<body>
<form action = "post">
<p>
<span>使用者名:</span><input type="text" id = "username" />
</p>
<!--多選框的值就是定義好的value-->
<p>
<span>性别:</span>
<input type = "radio" name = "sex" value = "man" id = "boy"/>男
<input type = "radio" name = "sex" value = "woman" id = "girl"/>女
</p>
</form>
<script>
var input_text = document.getElementById("username");
var boy_radio = document.getElementById("boy");
var girl_radio = document.getElementById("girl");
//得到輸入框的值
input_text.value
//修改輸入框的值
input_text.value = "value";
//對于單選框,多選框等等固定的值,boy_radio.value隻能取到目前的值
boy_radio.checked;//檢視傳回的結果,是否為true,如果為true,則被選中。
girl_radio.checked = true;//指派
</script>
</body>
123456789101112131415161718192021222324252627
送出表單。md5加密密碼,表單優化
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<title>Title</title>
<!--MD5加密工具類-->
<script src = "https://cdn.bootcss.com/blueimp-md5/2.10.0/js/md5.min.js">
</script>
</head>
<body>
<!--表達綁定送出事件
οnsubmit= 綁定一個送出檢測的函數,true,false
将這個結果傳回給表單,使用onsubmit接收
-->
<form action = "https://www.baidu.com" method = "post" onsubmit = "return aaa()">
<p>
<span>使用者名:</span><input type="text" id = "username" name = "username"/>
</p>
<p>
<span>密碼:</span><input type="password" id = "password" />
</p>
<input type = "hidden" id = "md5-password" name = "password">
<!--綁定事件 onclick 被點選-->
<button type = "submit">送出</button>
</form>
<script>
function aaa(){
alert(1);
var username = document.getElementById("username");
var pwd = document.getElementById("password");
var md5pwd = document.getElementById("md5-password");
//pwd.value = md5(pwd,value);
md5pwd.value = mad5(pwd.value);
//可以校驗判斷表單内容,true就是通過送出,false就是阻止送出
return false;
}
</script>
</body>
</html>
123456789101112131415161718192021222324252627282930313233343536373839404142434445
十、jQuery
javaScript和jQuery的關系?
jQuery庫,裡面存在大量的JavaScript函數
公式:$(selector).action()
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<title>Title</title>
<script src="lib/jquery-3.4.1.js"></script>
</head>
<body>
<a href="" id = "test-jquery">點我</a>
<script>
//選擇器就是css選擇器
$('#test-jquery').click(function(){
alert('hello,jQuery!');
});
</script>
</body>
</html>
1234567891011121314151617
選擇器
//原生js,選擇器少,麻煩不好記
//标簽
document.getElementByTagName();
//id
document.getElementById();
//class
document.getElementByClassName();
//jQuery css中的選擇器它全部都能用!
$('p').click();//标簽選擇器
$('#id1').click();//id選擇器
$('.class1').click;//class選擇器
123456789101112
文檔工具站:http://jquery.cuishifeng.cn/
事件
滑鼠事件、鍵盤事件,其他事件
mousedown()(jQuery)----按下
mouseenter()(jQuery)
mouseleave()(jQuery)
mousemove()(jQuery)----移動
mouseout()(jQuery)
mouseover()(jQuery)
mouseup()(jQuery)
1234567
<!DOCTYPE html>
<html lang = "en">
<head>
<meta charset = "UTF-8">
<title>Title</title>
<script src="lib/jquery-3.4.1.js"></script>
<style>
#divMove{
width:500px;
height:500px;
border:1px solid red;
}
</style>
</head>
<body>
<!--要求:擷取滑鼠目前的一個坐标-->
mouse:<span id = "mouseMove"></span>
<div id = "divMove">
在這裡移動滑鼠試試
</div>
<script>
//當網頁元素加載完畢之後,響應事件
//$(document).ready(function(){})
$(function(){
$('#divMove').mousemove(function(e){
$('#mouseMove').text('x:'+e.pageX+"y:"+e.pageY)
})
});
</script>
</body>
</html>
12345678910111213141516171819202122232425262728293031
操作DOM
節點文本操作
$('#test-ul li[name=python]').text();//獲得值
$('#test-ul li[name=python]').text('設定值');//設定值
$('#test-ul').html();//獲得值
$('#test-ul').html('<strong>123</strong>');//設定值
1234
CSS的操作
$('#test-ul li[name=python]').css({"color","red"});
1
元素的顯示和隐藏,:本質display:none
$('#test-ul li[name=python]').show();
$('#test-ul li[name=python]').hide();
12
娛樂測試
$(window).width()
$(window).height()
$('#test-ul li[name=python]').toggle();
123
未來ajax();
$('#form').ajax()
$.ajax({url:"test.html",context:document.body,success:function(){
$(this).addClass("done");
}})
12345