javaScipt
javaScript是一門世界上最流行的腳本語言。
1、快速入門
1.1 引入javaSciprt
- 內部標簽
- 外部引用
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 外部引用
注意<script>必須成對出現,不能自閉合
-->
<script src="js/qj.js"></script>
<!-- <script>-->
<!-- alert("hello world");/* 彈窗*/-->
<!-- </script>-->
</head>
<body>
</body>
</html>
1.2基本語法入門
-
語法和java基本一致,甚至沒有java嚴格,但是和java一樣嚴格區分大小寫
-
console.log()在瀏覽器的控制台打印變量
1.3數據類型
變量都是用var
- ===絕對等於(類型一樣,值一樣,結果謂true)
- nan===nan,這個與所有的數值都不相等,包括自己。只能通過is(NAN)來判斷這個數是不是NAN
浮點數問題:
console.log((1/3===(1-2/3)))
盡量避免使用浮點數進行運算,存在精度問題,可以通過下面這個運算,來得到兩個值是不是幾乎相等
-
Math.log((1/3===(1-2/3))<0.0000000001
null和undefined
- null 空
- indeflined未定義
數組:
- java的數組必須是同類型的對象,而在js中,var已經包括了所有的類型,所有不用必須同類型對象。
- 如果在顯示數組的時候,java中顯示數組下標越界的錯誤時,在js上則現實的是indefined
對象:
- 對象是大括號,數組是中括號
- 每個屬性之間適用逗號隔開,最后一個不需要添加
1.4嚴格檢查模式strict
-
如果下面這個strict語法報錯,則因為idea沒有選到es6版本
-
"use strict"寫到最前面一行
-
let局部變量
2、數據類型
2.1字符串
1、正常的字符串我們使用單引號,或者雙引號包裹
2、注意轉義字符
3、多行字符串編寫````
4、模板字符串
let mag = `你好:,${name}`
5、字符串長度
str.length
6、字符串的可變性,不可變
7、大小寫轉換
//注意這里是方法,不是屬性
student.toUpperCase
student.toLowerCase
8、student.indexOf()
9、subbstring():從第一個字符串截取到最后一個,包含前面,不包含后面
2.2數組
Array可以包含任意數據類型
1、長度 .length
注意:加入給Array賦值,數組大小就會發生變化,如果賦值過小,元素就會丟失
2、indexOf通過獲得下表索引
字符串的1和數字1是不同的
3、slice()截取數組的Array的一部分,返回一個新的數組,類似於String中的substring
4、push():壓入到尾部
pop():彈出尾部的一個元素
5、unshif();頭部
shift();
6、排序sort()
7、元素反轉reverse
8、concat():返回一個新數組,不改變原來數組
9、連接符join
打印拼接數組使用特定的字符串鏈接
10、多維數組
2.3對象
- 若干個鍵值對
var person{
name: "dawdaw",
age:12,
score:11
}
- js中的對象,{...}表示一個對象,鍵值對描述屬性,多個屬性之間使用,隔開,最后一個屬性不加逗號。
- javascript中的所有的鍵都是字符鍵,值是任意對象
1、對象賦值
2、使用一個不存在的對象屬性不會報錯,會返回undefind
3、動態的刪減屬性:通過delete刪除對象的屬性
4、動態的添加,直接給新的屬性添加至即可
5、判斷屬性值是否在這個對象中xxxinxxx
6、判斷一個屬性是否是這個對象自身擁有的hasOwnPropetty()
2.4、流程控制
if判斷
let age= 3;
if(age>3){
alert("haha")
}else if(a<5){
alert("kuwaawdwa")
}else {
alert("kuwa")
}
while循環,避免程序死循環
while (age<100){
age++;
console.log(age)
}
do{
age = age+1;
console.log(age)
}while
for循環
for (let i = 0; i < 100; i++) {
console.log(i);
}
foreach
var age = [1,2,3,4,3,2,3,2,3,4,3];
age.forEach(function (value){
console.log(value)
})
2.5、Map和Set
Map:
let map = new Map([['ton',100],['dwad',20],['fese',90]]);
let name = map.get('ton');//通過key獲得value
map.set("a",22)
console.log(map);
map.delest(“tom”)
Set:無需不重復的集合
set.add(2);
set.delete(1);
console.log(set.has(3));//是否包含某個元素
2.6、iterator
遍歷數組、Map和Set
'use strict'
var arr=[3,4,5];
for(var x of arr){
console.log(x);
}
var arry = new Map([["DAW",12],["FAF",10],["FAWF",33]]);
for (let i of arry) {
console.log(i);
}
var arr1 = new Set([5,6,7]);
for (let x of arr1){
console.log(x)
}
3、函數
3.1、定義函數
絕對值函數
function abs(x){
if (x>=0){
return x;
}else{
return -x;
}
}
一旦執行到return代表函數結束,返回結果
如果沒有執行return,函數執行完也會返回結果,結果就是undefined
方式二
var abs = function (X) {
}
function (X) {...}這是一個匿名函數,但是可以把結果賦值給abs,通過abs就可以調用函數
參數問題:javascript可以傳任意個參數,也可以不傳遞參數。
arguments是一個js免費贈送的關鍵字;
代表:傳進來的所有參數,是一個數組
function abs(x){
console.log("x>=" + x);
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
// if (arguments.length>1){
// arguments[1]
// }
if (x>=0){
return x;
}else {
return -x;
}
}
rest新特性:獲取除了已經定義的參數之外的所有參數
4.2、變量的作用域
- 在javascript中,var定義的變量實際是有作用域的。
假設在函數體重聲明,則在函數體外不可以使用。(非要實現的話,后期可以研究一下 閉包)
function qj(){
var x = 1;
x = x + 1;
}
x = x + 2;//ReferenceError: Can't find variable: x
- 如果兩個函數使用了相同的變量名,只要在函數內部,就不沖突。
- 內部函數可以訪問外部函數的成員。而外部函數不能訪問內部函數的成員。
- 假設內部函數變量截外部函數重名,函數值查找變量會從自身函數開始向外查找,選擇最近的一個賦值
提升變量的作用域:js的執行引擎,自動提升了y的聲明,但是不會提升t的賦值。
- 比如:x = ’x‘ + y
- y = ’y‘ 結果是:xundefined y是存在的,但是沒有值
- 這個是在js建立之初就存在的特性,養成規范:所有的變量定義都放在函數的頭部,不要亂放,編譯代碼維護。
全局函數:
var x = 1;
function qj() {
console.log(x);
}
qj();
console.log(x);
全局對象 window
var x = 'xxx';
alert.x;
alert(window.x);//默認所有的全局變量,都會自動綁定在window對象
alert這個函數本身也是一個window變量:window.alert
js實際上只有一個全局作用域,任何變量(函數也可以視為變量),假設沒有在函數作用范圍內找到,就會向外查找,如果在全局作用域都沒有找到,會寶座RefrenceRrror
規范:
-
由於我們所有的全局變量都會綁定在window上,如果不同的js文件使用了相同的全局變量,就會沖突
-
//唯一的全局變量 var Xiao = {}; Xiao.name = "等等"; Xiao.add = function (a,b){ return a+b; }
把自己的代碼全部放入自己定義的唯一空間名字中,降低全局名沖突問題。
jQuery:等價於$();
局部作用域let:
function aaa(){
for (Var i = 0; i < 100; i++) {
console.log(i)
}
console.log(i+1);//問題:出了這個作用域還可以使用
}
ES6 let關鍵字。解決局部作用域沖突
function aaa(){
for (let i = 0; i < 100; i++) {
console.log(i)
}
console.log(i+1);//問題:出了這個作用域還可以使用
}
建議使用let
常量const:
在ES6之前,怎么定義常量:只有用全部大寫字母命名的變量就是常量:建議不要修改這樣的值。
var F1 = '3.14'
console.log(F1);
F1 = '11'
console.log(F1);//可以改變
在ES6引用了常量關鍵字const
const PI = '3.14';//只讀變量
console.log(PI);
PI = '233'//這行是錯誤的
console.log(PI);