HelloWorld
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<!--JS代碼需要編寫到script標籤中-->
<script type="text/javascript">
/*
* 控制瀏覽器彈出一個警告框
* alert("哥,你真帥啊!!");
*/
/*
* 讓計算機在頁面中輸出一個內容
* document.write()可以向body中輸出一個內容
* document.write("看我出不出來~~~");
*/
/*
* 向控制檯輸出一個內容
* console.log()的作用是向控制檯輸出一個內容
* console.log("你猜我在哪出來呢?");
*/
alert("哥,你真帥啊!!");
document.write("看我出不出來~~~");
console.log("你猜我在哪出來呢?");
</script>
</head>
<body>
</body>
</html>
JS編寫位置
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<!--
可以將js代碼編寫到外部js文件中,然後通過script標籤引入
寫到外部文件中可以在不同的頁面中同時引用,也可以利用到瀏覽器的緩存機制
推薦使用的方式
-->
<!--
script標籤一旦用於引入外部文件了,就不能在編寫代碼了,即使編寫了瀏覽器也會忽略
如果需要則可以在創建一個新的script標籤用於編寫內部代碼
-->
<script type="text/javascript" src="js/script.js"></script>
<script type="text/javascript">
alert("我是內部的JS代碼");
</script>
<!--
可以將js代碼編寫到script標籤
<script type="text/javascript">
alert("我是script標籤中的代碼!!");
</script>
-->
</head>
<body>
<!--
可以將js代碼編寫到標籤的onclick屬性中
當我們點擊按鈕時,js代碼纔會執行
雖然可以寫在標籤的屬性中,但是他們屬於結構與行爲耦合,不方便維護,不推薦使用
-->
<button onclick="alert('討厭,你點我幹嘛~~');">點我一下</button>
<!--
可以將js代碼寫在超鏈接的href屬性中,這樣當點擊超鏈接時,會執行js代碼
-->
<a href="javascript:alert('讓你點你就點!!');">你也點我一下</a>
<a href="javascript:;">你也點我一下</a>
</body>
</html>
基本語法
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
多行註釋
JS註釋
多行註釋,註釋中的內容不會被執行,但是可以在源代碼中查看
要養成良好的編寫註釋的習慣,也可以通過註釋來對代碼進行一些簡單的調試
*/
//單行註釋
//alert("hello");
//document.write("hello");
console.log("hello"); //該語句用來在控制檯輸出一個日誌
/*
* 1.JS中嚴格區分大小寫
* 2.JS中每一條語句以分號(;)結尾
* - 如果不寫分號,瀏覽器會自動添加,但是會消耗一些系統資源,
* 而且有些時候,瀏覽器會加錯分號,所以在開發中分號必須寫
* 3.JS中會忽略多個空格和換行,所以我們可以利用空格和換行對代碼進行格式化
*
*/
alert("hello");
</script>
</head>
<body>
</body>
</html>
字面量和變量
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 字面量,都是一些不可改變的值
* 比如 :1 2 3 4 5
* 字面量都是可以直接使用,但是我們一般都不會直接使用字面量
*
* 變量 變量可以用來保存字面量,而且變量的值是可以任意改變的
* 變量更加方便我們使用,所以在開發中都是通過變量去保存一個字面量,
* 而很少直接使用字面量
* 可以通過變量對字面量進行描述
*/
//聲明變量
//在js中使用var關鍵字來聲明一個變量
var a;
//爲變量賦值
a = 123;
a = 456;
a = 123124223423424;
//聲明和賦值同時進行
var b = 789;
var c = 0;
var age = 80;
console.log(age);
</script>
</head>
<body>
</body>
</html>
標識符
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 標識符
* - 在JS中所有的可以由我們自主命名的都可以稱爲是標識符
* - 例如:變量名、函數名、屬性名都屬於標識符
* - 命名一個標識符時需要遵守如下的規則:
* 1.標識符中可以含有字母、數字、_、$
* 2.標識符不能以數字開頭
* 3.標識符不能是ES中的關鍵字或保留字
* 4.標識符一般都採用駝峯命名法
* - 首字母小寫,每個單詞的開頭字母大寫,其餘字母小寫
* helloWorld xxxYyyZzz
*
* - JS底層保存標識符時實際上是採用的Unicode編碼,
* 所以理論上講,所有的utf-8中含有的內容都可以作爲標識符
*/
/*var if = 123;
console.log(if);*/
//千萬不要這麼用
var 鋤禾日當午 = 789;
console.log(鋤禾日當午);
</script>
</head>
<body>
</body>
</html>
數據類型
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript">
/*
* 數據類型指的就是字面量的類型
* 在JS中一共有六種數據類型
* String 字符串
* Number 數值
* Boolean 布爾值
* Null 空值
* Undefined 未定義
* Object 對象
*
* 其中String Number Boolean Null Undefined屬於基本數據類型
* 而Object屬於引用數據類型
*/
/*
* String字符串
* - 在JS中字符串需要使用引號引起來
* - 使用雙引號或單引號都可以,但是不要混着用
* - 引號不能嵌套,雙引號不能放雙引號,單引號不能放單引號
*/
var str = 'hello';
str = '我說:"今天天氣真不錯!"';
/*
在字符串中我們可以使用\作爲轉義字符,
當表示一些特殊符號時可以使用\進行轉義
\" 表示 "
\' 表示 '
\n 表示換行
\t 製表符
\\ 表示\
* */
str = "我說:\"今天\t天氣真不錯!\"";
str = "\\\\\\";
//輸出字面量 字符串str
//alert("str");
//輸出變量str
//alert(str);
var str2 = "hello";
str2 = "你好";
str2 = 3;
//alert("hello,你好");
//console.log("我就是不出來~~~");
</script>
</head>
<body>
</body>
</html>
Number
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 在JS中所有的數值都是Number類型,
* 包括整數和浮點數(小數)
*
* JS中可以表示的數字的最大值
* Number.MAX_VALUE
* 1.7976931348623157e+308
*
* Number.MIN_VALUE 大於0的最小值
* 5e-324
*
* 如果使用Number表示的數字超過了最大值,則會返回一個
* Infinity 表示正無窮
* -Infinity 表示負無窮
* 使用typeof檢查Infinity也會返回number
* NaN 是一個特殊的數字,表示Not A Number
* 使用typeof檢查一個NaN也會返回number
*/
//數字123
var a = 123;
//字符串123
var b = "123";
/*
可以使用一個運算符 typeof
來檢查一個變量的類型
語法:typeof 變量
檢查字符串時,會返回string
檢查數值時,會返回number
* */
//console.log(typeof b);
a = -Number.MAX_VALUE * Number.MAX_VALUE;
a = "abc" * "bcd";
a = NaN;
//console.log(typeof a);
a = Number.MIN_VALUE;
//console.log(a);
/*
* 在JS中整數的運算基本可以保證精確
*/
var c = 1865789 + 7654321;
/*
* 如果使用JS進行浮點運算,可能得到一個不精確的結果
* 所以千萬不要使用JS進行對精確度要求比較高的運算
*/
var c = 0.1 + 0.2;
console.log(c);
</script>
</head>
<body>
</body>
</html>
Boolean
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* Boolean 布爾值
* 布爾值只有兩個,主要用來做邏輯判斷
* true
* - 表示真
* false
* - 表示假
*
* 使用typeof檢查一個布爾值時,會返回boolean
*/
var bool = false;
console.log(typeof bool);
console.log(bool);
</script>
</head>
<body>
</body>
</html>
Null和Undefined
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* Null(空值)類型的值只有一個,就是null
* null這個值專門用來表示一個爲空的對象
* 使用typeof檢查一個null值時,會返回object
*
* Undefined(未定義)類型的值只有一個,就undefind
* 當聲明一個變量,但是並不給變量賦值時,它的值就是undefined
* 使用typeof檢查一個undefined時也會返回undefined
*/
var a = null;
var b = undefined;
console.log(typeof b);
</script>
</head>
<body>
</body>
</html>
強制類型轉換(轉換爲String)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 強制類型轉換
* - 指將一個數據類型強制轉換爲其他的數據類型
* - 類型轉換主要指,將其他的數據類型,轉換爲
* String Number Boolean
*
*/
/*
* 將其他的數據類型轉換爲String
* 方式一:
* - 調用被轉換數據類型的toString()方法
* - 該方法不會影響到原變量,它會將轉換的結果返回
* - 但是注意:null和undefined這兩個值沒有toString()方法,
* 如果調用他們的方法,會報錯
*
* 方式二:
* - 調用String()函數,並將被轉換的數據作爲參數傳遞給函數
* - 使用String()函數做強制類型轉換時,
* 對於Number和Boolean實際上就是調用的toString()方法
* 但是對於null和undefined,就不會調用toString()方法
* 它會將 null 直接轉換爲 "null"
* 將 undefined 直接轉換爲 "undefined"
*
*/
var a = 123;
//調用a的toString()方法
//調用xxx的yyy()方法,就是xxx.yyy()
a = a.toString();
a = true;
a = a.toString();
a = null;
//a = a.toString(); //報錯
a = undefined;
//a = a.toString(); //報錯
a = 123;
//調用String()函數,來將a轉換爲字符串
a = String(a);
a = null;
a = String(a);
a = undefined;
a = String(a);
console.log(typeof a);
console.log(a);
</script>
</head>
<body>
</body>
</html>
轉換爲Number
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 將其他的數據類型轉換爲Number
* 轉換方式一:
* 使用Number()函數
* - 字符串 --> 數字
* 1.如果是純數字的字符串,則直接將其轉換爲數字
* 2.如果字符串中有非數字的內容,則轉換爲NaN
* 3.如果字符串是一個空串或者是一個全是空格的字符串,則轉換爲0
* - 布爾 --> 數字
* true 轉成 1
* false 轉成 0
*
* - null --> 數字 0
*
* - undefined --> 數字 NaN
*
* 轉換方式二:
* - 這種方式專門用來對付字符串
* - parseInt() 把一個字符串轉換爲一個整數
* - parseFloat() 把一個字符串轉換爲一個浮點數
*/
var a = "123";
//調用Number()函數來將a轉換爲Number類型
a = Number(a);
a = false;
a = Number(a);
a = null;
a = Number(a);
a = undefined;
a = Number(a);
a = "123567a567px";
//調用parseInt()函數將a轉換爲Number
/*
* parseInt()可以將一個字符串中的有效的整數內容去出來,
* 然後轉換爲Number
*/
a = parseInt(a);
/*
* parseFloat()作用和parseInt()類似,不同的是它可以獲得有效的小數
*/
a = "123.456.789px";
a = parseFloat(a);
/*
* 如果對非String使用parseInt()或parseFloat()
* 它會先將其轉換爲String然後在操作
*/
a = true;
a = parseInt(a);
a = 198.23;
a = parseInt(a);
console.log(typeof a);
console.log(a);
</script>
</head>
<body>
</body>
</html>
其他的進制數字
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
var a = 123;
/*
* 在js中,如果需要表示16進制的數字,則需要以0x開頭
* 如果需要表示8進制的數字,則需要以0開頭
* 如果要要表示2進制的數字,則需要以0b開頭
* 但是不是所有的瀏覽器都支持
*
*/
//十六進制
a = 0x10;
a = 0xff;
a = 0xCafe;
//八進制數字
a = 070;
//二進制數字
//a = 0b10;
//向"070"這種字符串,有些瀏覽器會當成8進制解析,有些會當成10進制解析
a = "070";
//可以在parseInt()中傳遞一個第二個參數,來指定數字的進制
a =parseInt(a,10);
console.log(typeof a);
console.log(a);
</script>
</head>
<body>
</body>
</html>
轉換爲Boolean
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 將其他的數據類型轉換爲Boolean
* - 使用Boolean()函數
* - 數字 ---> 布爾
* - 除了0和NaN,其餘的都是true
*
* - 字符串 ---> 布爾
* - 除了空串,其餘的都是true
*
* - null和undefined都會轉換爲false
*
* - 對象也會轉換爲true
*
*/
var a = 123; //true
a = -123; //true
a = 0; //false
a = Infinity; //true
a = NaN; //false
//調用Boolean()函數來將a轉換爲布爾值
a = Boolean(a);
a = " ";
a = Boolean(a);
a = null; //false
a = Boolean(a);
a = undefined; //false
a = Boolean(a);
console.log(typeof a);
console.log(a);
</script>
</head>
<body>
</body>
</html>
運算符
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 運算符也叫操作符
* 通過運算符可以對一個或多個值進行運算,並獲取運算結果
* 比如:typeof就是運算符,可以來獲得一個值的類型
* 它會將該值的類型以字符串的形式返回
* number string boolean undefined object
*
* 算數運算符
* 當對非Number類型的值進行運算時,會將這些值轉換爲Number然後在運算
* 任何值和NaN做運算都得NaN
*
* +
* +可以對兩個值進行加法運算,並將結果返回
* 如果對兩個字符串進行加法運算,則會做拼串
* 會將兩個字符串拼接爲一個字符串,並返回
* 任何的值和字符串做加法運算,都會先轉換爲字符串,然後再和字符串做拼串的操作
* -
* - 可以對兩個值進行減法運算,並將結果返回
*
* *
* * 可以對兩個值進行乘法運算
* /
* / 可以對兩個值進行除法運算
* %
* % 取模運算(取餘數)
*/
var a = 123;
var result = typeof a;
//console.log(typeof result);
result = a + 1;
result = 456 + 789;
result = true + 1; //2
result = true + false; //1
result = 2 + null; //2
result = 2 + NaN; //NaN
result = 2+undefined //NaN
result = "你好" + "大帥哥";
var str = "鋤禾日當午," +
"汗滴禾下土," +
"誰知盤中餐," +
"粒粒皆辛苦";
result = 123 + "1"; //'1231'
result = true + "hello"; 'truehello'
//任何值和字符串相加都會轉換爲字符串,並做拼串操作
/*
* 我們可以利用這一特點,來將一個任意的數據類型轉換爲String
* 我們只需要爲任意的數據類型 + 一個 "" 即可將其轉換爲String
* 這是一種隱式的類型轉換,由瀏覽器自動完成,實際上它也是調用String()函數
*/
var c = 123;
c = c + ""; //'123'
c = null;
c = c + ""; //'null'
//console.log(result);
//console.log(typeof c);
//console.log("c = "+c);
result = 1 + 2 + "3"; //33
result = "1" + 2 + 3; //123
result = 100 - 5;
result = 100 - true; //99
result = 100 - "1"; //99
result = 2 * 2; //4
result = 2 * "8"; //16
result = 2 * undefined; //NaN
result = 2 * null; //0
result = 4 / 2;
result = 3 / 2;
/*
* 任何值做- * /運算時都會自動轉換爲Number
* 我們可以利用這一特點做隱式的類型轉換
* 可以通過爲一個值 -0 *1 /1來將其轉換爲Number
* 原理和Number()函數一樣,使用起來更加簡單
*/
var d = "123";
//console.log("result = "+result);
d = d - 0;
/*console.log(typeof d);
console.log(d);*/
result = 9 % 3;
result = 9 % 4;
result = 9 % 5;
console.log("result = "+result);
</script>
</head>
<body>
</body>
</html>
一元運算符
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 一元運算符,只需要一個操作數
* + 正號
* - 正號不會對數字產生任何影響
* - 負號
* - 負號可以對數字進行負號的取反
*
* - 對於非Number類型的值,
* 它會將先轉換爲Number,然後在運算
* 可以對一個其他的數據類型使用+,來將其轉換爲number
* 它的原理和Number()函數一樣
*/
var a = 123;
a = -a;
a = true;
a = "18";
a = +a;
/*console.log("a = "+a);
console.log(typeof a);*/
var result = 1 + +"2" + 3; //6
console.log("result = "+result);
var a ="a = "+ 1 + +"2" + 3;
a = +"2";
console.log(typeof a);
console.log(a);
</script>
</head>
<body>
</body>
</html>
自增和自減
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 自增 ++
* - 通過自增可以使變量在自身的基礎上增加1
* - 對於一個變量自增以後,原變量的值會立即自增1
* - 自增分成兩種:後++(a++) 和 前++(++a)
* 無論是a++ 還是 ++a,都會立即使原變量的值自增1
* 不同的是a++ 和 ++a的值不同
* a++的值等於原變量的值(自增前的值)
* ++a的值等於新值 (自增後的值)
*
* 自減 --
* - 通過自減可以使變量在自身的基礎上減1
* - 自減分成兩種:後--(a--) 和 前--(--a)
* 無論是a-- 還是 --a 都會立即使原變量的值自減1
* 不同的是a-- 和 --a的值不同
* a-- 是變量的原值 (自減前的值)
* --a 是變量的新值 (自減以後的值)
*
*
*/
var num = 10;
//num--;
//--num;
//console.log(num--);
console.log(--num);
console.log("num = "+num);
var a = 1;
//使a自增1
//a++;
//++a;
//console.log(a++);
//console.log("++a = " + ++a);
/*console.log("a++ = " + a++);
console.log("a = "+a);*/
var c = 10;
//第一次c++,是在10的基礎上自增
//console.log(c++);
//第二次c++,是在11的基礎上自增
c++;
var d = 20;
//console.log(++d);//21
//console.log(++d);//22
//20 + 22 + 22
//var result = d++ + ++d + d ;
//d = 20
d = d++;
/*
* var e = d++;
* d = e;
*/
//console.log("d = "+d);
</script>
</head>
<body>
</body>
</html>
邏輯運算符1
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* JS中爲我們提供了三種邏輯運算符
* ! 非
* - !可以用來對一個值進行非運算
* - 所謂非運算就是值對一個布爾值進行取反操作,
* true變false,false變true
* - 如果對一個值進行兩次取反,它不會變化
* - 如果對非布爾值進行元素,則會將其轉換爲布爾值,然後再取反
* 所以我們可以利用該特點,來將一個其他的數據類型轉換爲布爾值
* 可以爲一個任意數據類型取兩次反,來將其轉換爲布爾值,
* 原理和Boolean()函數一樣
*
* && 與
* - &&可以對符號兩側的值進行與運算並返回結果
* - 運算規則
* - 兩個值中只要有一個值爲false就返回false,
* 只有兩個值都爲true時,纔會返回true
* - JS中的“與”屬於短路的與,
* 如果第一個值爲false,則不會看第二個值
*
* || 或
* - ||可以對符號兩側的值進行或運算並返回結果
* - 運算規則:
* - 兩個值中只要有一個true,就返回true
* 如果兩個值都爲false,才返回false
* - JS中的“或”屬於短路的或
* 如果第一個值爲true,則不會檢查第二個值
*/
//如果兩個值都是true則返回true
var result = true && true;
//只要有一個false,就返回false
result = true && false;
result = false && true;
result = false && false;
//console.log("result = "+result);
//第一個值爲true,會檢查第二個值
//true && alert("看我出不出來!!");
//第一個值爲false,不會檢查第二個值
//false && alert("看我出不出來!!");
//兩個都是false,則返回false
result = false || false;
//只有有一個true,就返回true
result = true || false;
result = false || true ;
result = true || true ;
//console.log("result = "+result);
//第一個值爲false,則會檢查第二個值
//false || alert("123");
//第一個值爲true,則不再檢查第二個值
//true || alert("123");
var a = false;
//對a進行非運算
a = !a;
//console.log("a = "+a);
var b = 10;
b = !!b;
//console.log("b = "+b);
//console.log(typeof b);
</script>
</head>
<body>
</body>
</html>
邏輯運算符2
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* && || 非布爾值的情況
* - 對於非布爾值進行與或運算時,
* 會先將其轉換爲布爾值,然後再運算,並且返回原值
* - 與運算:
* - 如果第一個值爲true,則必然返回第二個值
* - 如果第一個值爲false,則直接返回第一個值
*
* - 或運算
* - 如果第一個值爲true,則直接返回第一個值
* - 如果第一個值爲false,則返回第二個值
*
*/
//true && true
//與運算:如果兩個值都爲true,則返回後邊的
var result = 5 && 6; //6
//與運算:如果兩個值中有false,則返回靠前的false
//false && true
result = 0 && 2; //0
result = 2 && 0; //0
//false && false
result = NaN && 0; //NaN
result = 0 && NaN; //0
//true || true
//如果第一個值爲true,則直接返回第一個值
result = 2 || 1; //2
result = 2 || NaN; //2
result = 2 || 0; //2
//如果第一個值爲false,則直接返回第二個值
result = NaN || 1; //1
result = NaN || 0; //0
result = NaN || 0 || 2 //2
result = NaN || 1 || 2 //1
result = "" || "hello"; //hello
result = -1 || "你好";
console.log("result = "+result);
</script>
</head>
<body>
</body>
</html>
賦值運算符
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* =
* 可以將符號右側的值賦值給符號左側的變量
* +=
* a += 5 等價於 a = a + 5
* -=
* a -= 5 等價於 a = a - 5
* *=
* a *= 5 等價於 a = a * 5
* /=
* a /= 5 等價於 a = a / 5
* %=
* a %= 5 等價於 a = a % 5
*
*/
var a = 10;
//a = a + 5;
//a += 5;
//a -= 5;
//a *= 5;
// a = a%3;
a %= 3;
console.log("a = "+a);
</script>
</head>
<body>
</body>
</html>
關係運算符
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 通過關係運算符可以比較兩個值之間的大小關係,
* 如果關係成立它會返回true,如果關係不成立則返回false
*
* > 大於號
* - 判斷符號左側的值是否大於右側的值
* - 如果關係成立,返回true,如果關係不成立則返回false
*
* >= 大於等於
* - 判斷符號左側的值是否大於或等於右側的值
*
* < 小於號
* <= 小於等於
*
* 非數值的情況
* - 對於非數值進行比較時,會將其轉換爲數字然後在比較
* - 如果符號兩側的值都是字符串時,不會將其轉換爲數字進行比較
* 而會分別比較字符串中字符的Unicode編碼
*/
var result = 5 > 10;//false
result = 5 > 4; //true
result = 5 > 5; //false
result = 5 >= 5; //true
result = 5 >= 4; //true
result = 5 < 4; //false
result = 4 <= 4; //true
//console.log("result = "+result);
//console.log(1 > true); //false
//console.log(1 >= true); //true
//console.log(1 > "0"); //true
//console.log(10 > null); //true
//任何值和NaN做任何比較都是false
//console.log(10 <= "hello"); //false
//console.log(true > false); //true
//console.log("1" < "5"); //true
//console.log("11" < "5"); //true
//比較兩個字符串時,比較的是字符串的字符編碼
//console.log("a" < "b");//true
//比較字符編碼時是一位一位進行比較
//如果兩位一樣,則比較下一位,所以借用它來對英文進行排序
//console.log("abc" < "bcd");//true
//比較中文時沒有意義
//console.log("戒" > "我"); //true
//如果比較的兩個字符串型的數字,可能會得到不可預期的結果
//注意:在比較兩個字符串型的數字時,一定一定一定要轉型
console.log("11123123123123123123" < +"5"); //false
</script>
</head>
<body>
</body>
</html>
編碼
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 在字符串中使用轉義字符輸入Unicode編碼
* \u四位編碼
*/
console.log("\u2620");
</script>
</head>
<body>
<!--在網頁中使用Unicode編碼
&#編碼; 這裏的編碼需要的是10進制
-->
<h1 style="font-size: 200px;">☠</h1>
<h1 style="font-size: 200px;">⚀</h1>
</body>
</html>
相等運算符
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 相等運算符用來比較兩個值是否相等,
* 如果相等會返回true,否則返回false
*
* 使用 == 來做相等運算
* - 當使用==來比較兩個值時,如果值的類型不同,
* 則會自動進行類型轉換,將其轉換爲相同的類型
* 然後在比較
* 不相等
* 不相等用來判斷兩個值是否不相等,如果不相等返回true,否則返回false
* - 使用 != 來做不相等運算
* - 不相等也會對變量進行自動的類型轉換,如果轉換後相等它也會返回false
*
*
* ===
* 全等
* - 用來判斷兩個值是否全等,它和相等類似,不同的是它不會做自動的類型轉換
* 如果兩個值的類型不同,直接返回false
* !==
* 不全等
* - 用來判斷兩個值是否不全等,和不等類似,不同的是它不會做自動的類型轉換
* 如果兩個值的類型不同,直接返回true
*/
//console.log(1 == 1); //true
var a = 10;
//console.log(a == 4); //false
//console.log("1" == 1); //true
//console.log(true == "1"); //true
//console.log(null == 0); //false
/*
* undefined 衍生自 null
* 所以這兩個值做相等判斷時,會返回true
*/
//console.log(undefined == null);
/*
* NaN不和任何值相等,包括他本身
*/
//console.log(NaN == NaN); //false
var b = NaN;
//判斷b的值是否是NaN
//console.log(b == NaN);
/*
* 可以通過isNaN()函數來判斷一個值是否是NaN
* 如果該值是NaN則返回true,否則返回false
*/
//console.log(isNaN(b));
//console.log(10 != 5); //true
//console.log(10 != 10); //false
//console.log("abcd" != "abcd"); //false
//console.log("1" != 1);//false
//console.log("123" === 123);//false
//console.log(null === undefined);//false
console.log(1 !== "1"); //true
</script>
</head>
<body>
</body>
</html>
條件運算符
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 條件運算符也叫三元運算符
* 語法:
* 條件表達式?語句1:語句2;
* - 執行的流程:
* 條件運算符在執行時,首先對條件表達式進行求值,
* 如果該值爲true,則執行語句1,並返回執行結果
* 如果該值爲false,則執行語句2,並返回執行結果
* 如果條件的表達式的求值結果是一個非布爾值,
* 會將其轉換爲布爾值然後在運算
*/
//false?alert("語句1"):alert("語句2");
var a = 300;
var b = 143;
var c = 50;
//a > b ? alert("a大"):alert("b大");
//獲取a和b中的最大值
//var max = a > b ? a : b;
//獲取a b c 中的大值
//max = max > c ? max : c;
//這種寫法不推薦使用,不方便閱讀
var max = a > b ? (a > c ? a :c) : (b > c ? b : c);
//console.log("max = "+max);
//"hello"?alert("語句1"):alert("語句2");
</script>
</head>
<body>
</body>
</html>
運算符的優先級
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* , 運算符
* 使用,可以分割多個語句,一般可以在聲明多個變量時使用,
*/
//使用,運算符同時聲明多個變量
//var a , b , c;
//可以同時聲明多個變量並賦值
//var a=1 , b=2 , c=3;
//alert(b);
/*
* 就和數學中一樣,在JS中運算符也有優先級,
* 比如:先乘除 後加減
* 在JS中有一個運算符優先級的表,
* 在表中越靠上優先級越高,優先級越高越優先計算,
* 如果優先級一樣,則從左往右計算。
* 但是這個表我們並不需要記憶,如果遇到優先級不清楚
* 可以使用()來改變優先級
*/
//var result = 1 + 2 * 3;
/*
* 如果||的優先級高,或者兩個一樣高,則應該返回3
* 如果與的優先級高,則應該返回1
*
*/
var result = 1 || 2 && 3;
console.log("result = "+result);
</script>
</head>
<body>
</body>
</html>
代碼塊
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 我們的程序是由一條一條語句構成的
* 語句是按照自上向下的順序一條一條執行的
* 在JS中可以使用{}來爲語句進行分組,
* 同一個{}中的語句我們稱爲是一組語句,
* 它們要麼都執行,要麼都不執行,
* 一個{}中的語句我們也稱爲叫一個代碼塊
* 在代碼塊的後邊就不用再編寫;了
*
* JS中的代碼塊,只具有分組的的作用,沒有其他的用途
* 代碼塊內容的內容,在外部是完全可見的
*/
{
var a = 10;
alert("hello");
console.log("你好");
document.write("語句");
}
console.log("a = "+a);
</script>
</head>
<body>
</body>
</html>
流程控制語句
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 流程控制語句
* - JS中的程序是從上到下一行一行執行的
* - 通過流程控制語句可以控制程序執行流程,
* 使程序可以根據一定的條件來選擇執行
* - 語句的分類:
* 1.條件判斷語句
* 2.條件分支語句
* 3.循環語句
*
*
* 條件判斷語句:
* - 使用條件判斷語句可以在執行某個語句之前進行判斷,
* 如果條件成立纔會執行語句,條件不成立則語句不執行。
* - if語句
* - 語法一:
* if(條件表達式){
* 語句...
* }
*
* if語句在執行時,會先對條件表達式進行求值判斷,
* 如果條件表達式的值爲true,則執行if後的語句,
* 如果條件表達式的值爲false,則不會執行if後的語句。
* if語句只能控制緊隨其後的那個語句,
* 如果希望if語句可以控制多條語句,
* 可以將這些語句統一放到代碼塊中
* if語句後的代碼塊不是必須的,但是在開發中儘量寫上代碼塊,即使if後只有一條語句
*
*/
var a = 25;
if(a > 10 && a <= 20){
alert("a大於10,並且 a小於等於20");
}
</script>
</head>
<body>
</body>
</html>
if語句
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* if語句
* 語法二:
* if(條件表達式){
* 語句...
* }else{
* 語句...
* }
*
* if...else...語句
* 當該語句執行時,會先對if後的條件表達式進行求值判斷,
* 如果該值爲true,則執行if後的語句
* 如果該值爲false,則執行else後的語句
*
* 語法三:
* if(條件表達式){
* 語句...
* }else if(條件表達式){
* 語句...
* }else if(條件表達式){
* 語句...
* }else{
* 語句...
* }
*
* if...else if...else
* 當該語句執行時,會從上到下依次對條件表達式進行求值判斷
* 如果值爲true,則執行當前語句。
* 如果值爲false,則繼續向下判斷。
* 如果所有的條件都不滿足,則執行最後一個else後的語句
* 該語句中,只會有一個代碼塊被執行,一旦代碼塊執行了,則直接結束語句
*/
var age = 50;
/*if(age >= 60){
alert("你已經退休了~~");
}else{
alert("你還沒退休~~~");
}*/
age = 200;
/*if(age > 100){
alert("活着挺沒意思的~~");
}else if(age > 80){
alert("你也老大不小的了~~");
}else if(age > 60){
alert("你也退休了~~");
}else if(age > 30){
alert("你已經中年了~~");
}else if(age > 17){
alert("你已經成年了");
}else{
alert("你還是個小孩子~~");
}*/
age = 90;
if(age > 17 && age <= 30){
alert("你已經成年了");
}else if(age > 30 && age <= 60){
alert("你已經中年了");
}else if(age > 60 && age <= 80){
alert("你已經退休了");
}else{
alert("你歲數挺大的了~~");
}
</script>
</head>
<body>
</body>
</html>
條件分支語句
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 條件分支語句也叫switch語句
* 語法:
* switch(條件表達式){
* case 表達式:
* 語句...
* break;
* case 表達式:
* 語句...
* break;
* default:
* 語句...
* break;
* }
*
* 執行流程:
* switch...case..語句
* 在執行時會依次將case後的表達式的值和switch後的條件表達式的值進行全等比較,
* 如果比較結果爲true,則從當前case處開始執行代碼。
* 當前case後的所有的代碼都會執行,我們可以在case的後邊跟着一個break關鍵字,
* 這樣可以確保只會執行當前case後的語句,而不會執行其他的case
* 如果比較結果爲false,則繼續向下比較
* 如果所有的比較結果都爲false,則只執行default後的語句
*
* switch語句和if語句的功能實際上有重複的,使用switch可以實現if的功能,
* 同樣使用if也可以實現switch的功能,所以我們使用時,可以根據自己的習慣選擇。
*/
//根據num的值,輸出對應的中文
var num = 3;
/*if(num == 1){
console.log("壹");
}else if(num == 2){
console.log("貳");
}else if(num == 3){
console.log("叄");
}*/
num = "hello";
switch(num){
case 1:
console.log("壹");
//使用break可以來退出switch語句
break;
case 2:
console.log("貳");
break;
case 3:
console.log("叄");
break;
default:
console.log("非法數字~~");
break;
}
</script>
</head>
<body>
</body>
</html>
循環語句
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 向頁面中輸出連續的數字
*/
/*var n = 1;
document.write(n++ +"<br />");*/
/*
* 循環語句:
* 通過循環語句可以反覆的執行一段代碼多次
*
* while循環
* - 語法:
* while(條件表達式){
* 語句...
* }
*
* - while語句在執行時,
* 先對條件表達式進行求值判斷,
* 如果值爲true,則執行循環體,
* 循環體執行完畢以後,繼續對錶達式進行判斷
* 如果爲true,則繼續執行循環體,以此類推
* 如果值爲false,則終止循環
*
* do...while循環
* - 語法:
* do{
* 語句...
* }while(條件表達式)
*
* - 執行流程:
* do...while語句在執行時,會先執行循環體,
* 循環體執行完畢以後,在對while後的條件表達式進行判斷,
* 如果結果爲true,則繼續執行循環體,執行完畢繼續判斷以此類推
* 如果結果爲false,則終止循環
*
* 實際上這兩個語句功能類似,不同的是while是先判斷後執行,
* 而do...while會先執行後判斷,
* do...while可以保證循環體至少執行一次,
* 而while不能
*/
var n = 1;
//向這種將條件表達式寫死爲true的循環,叫做死循環
//該循環不會停止,除非瀏覽器關閉,死循環在開發中慎用
//可以使用break,來終止循環
/*while(true){
alert(n++);
//判斷n是否是10
if(n == 10){
//退出循環
break;
}
}*/
//創建一個循環,往往需要三個步驟
//1.創初始化一個變量
var i = 11;
//2.在循環中設置一個條件表達式
/*while(i <= 10){
//3.定義一個更新表達式,每次更新初始化變量
document.write(i++ +"<br />")
}*/
/*do{
document.write(i++ +"<br />");
}while(i <= 10);*/
/*while(true){
alert(1);
}*/
</script>
</head>
<body>
</body>
</html>
for循環
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* for語句,也是一個循環語句,也稱爲for循環
* 在for循環中,爲我們提供了專門的位置用來放三個表達式:
* 1.初始化表達式
* 2.條件表達式
* 3.更新表達式
*
* for循環的語法:
* for(①初始化表達式;②條件表達式;④更新表達式){
* ③語句...
* }
*
* for循環的執行流程:
* ①執行初始化表達式,初始化變量(初始化表達式只會執行一次)
* ②執行條件表達式,判斷是否執行循環。
* 如果爲true,則執行循環③
* 如果爲false,終止循環
* ④執行更新表達式,更新表達式執行完畢繼續重複②
*/
//創建一個執行10次的while循環
//初始化表達式
/*var i = 0;
//創建一個循環,定義條件表達式
while(i < 10){
//設置更新表達式
alert(i++);
}*/
for(var i = 0 ; i < 10 ; i++ ){
alert(i);
}
/*
* for循環中的三個部分都可以省略,也可以寫在外部
* 如果在for循環中不寫任何的表達式,只寫兩個;
* 此時循環是一個死循環會一直執行下去,慎用
* for(;;){
alert("hello");
}
*/
</script>
</head>
<body>
</body>
</html>
break和continue
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* break關鍵字可以用來退出switch或循環語句
* 不能在if語句中使用break和continue
* break關鍵字,會立即終止離他最近的那個循環語句
*/
/*for(var i=0 ; i<5 ; i++){
console.log(i);
if(i == 2){
break;
}
}*/
/*for(var i=0 ; i<5 ; i++){
console.log("@外層循環"+i)
for(var j=0 ; j<5; j++){
break;
console.log("內層循環:"+j);
}
}*/
/*
* 可以爲循環語句創建一個label,來標識當前的循環
* label:循環語句
* 使用break語句時,可以在break後跟着一個label,
* 這樣break將會結束指定的循環,而不是最近的
*/
/*outer:
for(var i=0 ; i<5 ; i++){
console.log("@外層循環"+i)
for(var j=0 ; j<5; j++){
break outer;
console.log("內層循環:"+j);
}
}*/
/*
* continue關鍵字可以用來跳過當次循環
* 同樣continue也是默認只會對離他最近的循環循環起作用
*/
/*for(var i=0 ; i<5 ; i++){
if(i==2){
continue;
}
console.log(i);
}*/
outer:
for(var i=0 ; i<5 ; i++){
for(var j=0 ; j<5 ; j++){
continue;
console.log("-->"+j);
}
console.log("@--->"+i);
}
</script>
</head>
<body>
</body>
</html>
對象
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* JS中數據類型
* - String 字符串
* - Number 數值
* - Boolean 布爾值
* - Null 空值
* - Undefined 未定義
* - 以上這五種類型屬於基本數據類型,以後我們看到的值
* 只要不是上邊的5種,全都是對象
* - Object 對象
*
*
* 基本數據類型都是單一的值"hello" 123 true,
* 值和值之間沒有任何的聯繫。
*
* 在JS中來表示一個人的信息(name gender age):
* var name = "孫悟空";
* var gender = "男";
* var age = 18;
* 如果使用基本數據類型的數據,我們所創建的變量都是獨立,不能成爲一個整體。
*
* 對象屬於一種複合的數據類型,在對象中可以保存多個不同數據類型的屬性。
*
* 對象的分類:
* 1.內建對象
* - 由ES標準中定義的對象,在任何的ES的實現中都可以使用
* - 比如:Math String Number Boolean Function Object....
*
* 2.宿主對象
* - 由JS的運行環境提供的對象,目前來講主要指由瀏覽器提供的對象
* - 比如 BOM DOM
*
* 3.自定義對象
* - 由開發人員自己創建的對象
*
*/
//創建對象
/*
* 使用new關鍵字調用的函數,是構造函數constructor
* 構造函數是專門用來創建對象的函數
* 使用typeof檢查一個對象時,會返回object
*/
var obj = new Object();
/*
* 在對象中保存的值稱爲屬性
* 向對象添加屬性
* 語法:對象.屬性名 = 屬性值;
*/
//向obj中添加一個name屬性
obj.name = "孫悟空";
//向obj中添加一個gender屬性
obj.gender = "男";
//向obj中添加一個age屬性
obj.age = 18;
/*
* 讀取對象中的屬性
* 語法:對象.屬性名
*
* 如果讀取對象中沒有的屬性,不會報錯而是會返回undefined
*/
//console.log(obj.gender);
//console.log(obj.hello);
/*
* 修改對象的屬性值
* 語法:對象.屬性名 = 新值
*/
obj.name = "tom";
/*
* 刪除對象的屬性
* 語法:delete 對象.屬性名
*/
delete obj.name;
console.log(obj.age);
</script>
</head>
<body>
</body>
</html>
屬性名和屬性值
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
var obj = new Object();
/*
* 向對象中添加屬性
* 屬性名:
* - 對象的屬性名不強制要求遵守標識符的規範
* 什麼亂七八糟的名字都可以使用
* - 但是我們使用是還是儘量按照標識符的規範去做
*
*/
obj.name = "孫悟空";
//obj.var = "hello";
/*
* 如果要使用特殊的屬性名,不能採用.的方式來操作
* 需要使用另一種方式:
* 語法:對象["屬性名"] = 屬性值
* 讀取時也需要採用這種方式
*
* 使用[]這種形式去操作屬性,更加的靈活,
* 在[]中可以直接傳遞一個變量,這樣變量值是多少就會讀取那個屬性
*
*/
obj["123"] = 789;
obj["nihao"] = "你好";
var n = "nihao";
//console.log(obj[n]);
/*
* 屬性值
* JS對象的屬性值,可以是任意的數據類型
* 甚至也可以是一個對象
*/
obj.test = true;
obj.test = null;
obj.test = undefined;
//創建一個對象
var obj2 = new Object();
obj2.name = "豬八戒";
//將obj2設置爲obj的屬性
obj.test = obj2;
//console.log(obj.test.name);
/*
* in 運算符
* - 通過該運算符可以檢查一個對象中是否含有指定的屬性
* 如果有則返回true,沒有則返回false
* - 語法:
* "屬性名" in 對象
*/
//console.log(obj.test2);
//檢查obj中是否含有test2屬性
//console.log("test2" in obj);
//console.log("test" in obj);
console.log("name" in obj);
</script>
</head>
<body>
</body>
</html>
基本和引用數據類型
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 基本數據類型
* String Number Boolean Null Undefined
*
* 引用數據類型
* Object
*
* JS中的變量都是保存到棧內存中的,
* 基本數據類型的值直接在棧內存中存儲,
* 值與值之間是獨立存在,修改一個變量不會影響其他的變量
*
* 對象是保存到堆內存中的,每創建一個新的對象,就會在堆內存中開闢出一個新的空間,
* 而變量保存的是對象的內存地址(對象的引用),如果兩個變量保存的是同一個對象引用,
* 當一個通過一個變量修改屬性時,另一個也會受到影響
*/
var a = 123;
var b = a;
a++;
/*console.log("a = "+a);
console.log("b = "+b);*/
var obj = new Object();
obj.name = "孫悟空";
var obj2 = obj;
//修改obj的name屬性
obj.name = "豬八戒";
/*console.log(obj.name);
console.log(obj2.name);*/
//設置obj2爲null
obj2 = null;
/*console.log(obj);
console.log(obj2);*/
var c = 10;
var d = 10;
//console.log(c == d);
var obj3 = new Object();
var obj4 = new Object();
obj3.name = "沙和尚";
obj4.name = "沙和尚";
/*console.log(obj3);
console.log(obj4);*/
/*
* 當比較兩個基本數據類型的值時,就是比較值。
* 而比較兩個引用數據類型時,它是比較的對象的內存地址,
* 如果兩個對象是一摸一樣的,但是地址不同,它也會返回false
*/
console.log(obj3 == obj4);
</script>
</head>
<body>
</body>
</html>
對象字面量
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
//創建一個對象
//var obj = new Object();
/*
* 使用對象字面量來創建一個對象
*/
var obj = {};
//console.log(typeof obj);
obj.name = "孫悟空";
//console.log(obj.name);
/*
* 使用對象字面量,可以在創建對象時,直接指定對象中的屬性
* 語法:{屬性名:屬性值,屬性名:屬性值....}
* 對象字面量的屬性名可以加引號也可以不加,建議不加,
* 如果要使用一些特殊的名字,則必須加引號
*
* 屬性名和屬性值是一組一組的名值對結構,
* 名和值之間使用:連接,多個名值對之間使用,隔開
* 如果一個屬性之後沒有其他的屬性了,就不要寫,
*/
var obj2 = {
name:"豬八戒",
age:13,
gender:"男",
test:{name:"沙僧"}
};
console.log(obj2.test);
</script>
</head>
<body>
</body>
</html>
函數
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 函數 function
* - 函數也是一個對象
* - 函數中可以封裝一些功能(代碼),在需要時可以執行這些功能(代碼)
* - 函數中可以保存一些代碼在需要的時候調用
* - 使用typeof檢查一個函數對象時,會返回function
*/
//我們在實際開發中很少使用構造函數來創建一個函數對象
//創建一個函數對象
//可以將要封裝的代碼以字符串的形式傳遞給構造函數
//var fun = new Function("console.log('Hello 這是我的第一個函數');");
//封裝到函數中的代碼不會立即執行
//函數中的代碼會在函數調用的時候執行
//調用函數 語法:函數對象()
//當調用函數時,函數中封裝的代碼會按照順序執行
//fun();
/*
* 使用 函數聲明 來創建一個函數
* 語法:
* function 函數名([形參1,形參2...形參N]){
* 語句...
* }
*/
function fun2(){
console.log("這是我的第二個函數~~~");
alert("哈哈哈哈哈");
document.write("~~~~(>_<)~~~~");
}
//console.log(fun2);
//調用fun2
//fun2();
/*
* 使用 函數表達式 來創建一個函數
* var 函數名 = function([形參1,形參2...形參N]){
* 語句....
* }
*/
var fun3 = function(){
console.log("我是匿名函數中封裝的代碼");
};
fun3();
</script>
</head>
<body>
</body>
</html>
函數參數
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 定義一個用來求兩個數和的函數
* 可以在函數的()中來指定一個或多個形參(形式參數)
* 多個形參之間使用,隔開,聲明形參就相當於在函數內部聲明瞭對應的變量
* 但是並不賦值
*/
function sum(a,b){
console.log("a = "+a);
console.log("b = "+b);
console.log(a+b);
}
/*
* 在調用函數時,可以在()中指定實參(實際參數)
* 實參將會賦值給函數中對應的形參
*/
/*sum(1,2);
sum(123,456);*/
/*
* 調用函數時解析器不會檢查實參的類型,
* 所以要注意,是否有可能會接收到非法的參數,如果有可能則需要對參數進行類型的檢查
* 函數的實參可以是任意的數據類型
*/
//sum(123,"hello");
//sum(true , false);
/*
* 調用函數時,解析器也不會檢查實參的數量
* 多餘實參不會被賦值
* 如果實參的數量少於形參的數量,則沒有對應實參的形參將是undefined
*
*/
//sum(123,456,"hello",true,null);
sum(123);
</script>
</head>
<body>
</body>
</html>
返回值
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript">
/*
* 創建一個函數,用來計算三個數的和
*
* 可以使用 return 來設置函數的返回值
* 語法:
* return 值
*
* return後的值將會會作爲函數的執行結果返回,
* 可以定義一個變量,來接收該結果
*
* 在函數中return後的語句都不會執行
*
* 如果return語句後不跟任何值就相當於返回一個undefined,
* 如果函數中不寫return,則也會返回undefined
*
* return後可以跟任意類型的值
*
*/
function sum(a , b , c){
//alert(a + b +c);
var d = a + b + c;
return d;
//return undefined;
}
//調用函數
//變量result的值就是函數的執行結果
//函數返回什麼result的值就是什麼
var result = sum(4,7,8);
//var result = alert("hello");
console.log("result = "+result);
</script>
</head>
<body>
</body>
</html>
return
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
function fun(){
alert("函數要執行了~~~~");
for(var i=0 ; i<5 ; i++){
if(i == 2){
//使用break可以退出當前的循環
//break;
//continue用於跳過當次循環
//continue;
//使用return可以結束整個函數
//return;
}
console.log(i);
}
alert("函數執行完了~~~~");
}
//fun();
/*
* 返回值可以是任意的數據類型
* 也可以是一個對象,也可以是一個函數
*/
function fun2(){
//返回一個對象
return {name:"沙和尚"};
}
var a = fun2();
//console.log("a = "+a);
function fun3(){
//在函數內部再聲明一個函數
function fun4(){
alert("我是fun4");
}
//將fun4函數對象作爲返回值返回
return fun4;
}
a = fun3();
//console.log(a);
//a();
fun3()();
</script>
</head>
<body>
</body>
</html>
立即執行函數
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
//函數對象()
/*
* 立即執行函數
* 函數定義完,立即被調用,這種函數叫做立即執行函數
* 立即執行函數往往只會執行一次
*/
/*(function(){
alert("我是一個匿名函數~~~");
})();*/
(function(a,b){
console.log("a = "+a);
console.log("b = "+b);
})(123,456);
</script>
</head>
<body>
</body>
</html>
對象
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 創建一個對象
*/
var obj = new Object();
//向對象中添加屬性
obj.name = "孫悟空";
obj.age = 18;
//對象的屬性值可以是任何的數據類型,也可以是個函數
obj.sayName = function(){
console.log(obj.name);
};
function fun(){
console.log(obj.name);
};
//console.log(obj.sayName);
//調方法
obj.sayName();
//調函數
//fun();
/*
* 函數也可以稱爲對象的屬性,
* 如果一個函數作爲一個對象的屬性保存,
* 那麼我們稱這個函數時這個對象的方法
* 調用這個函數就說調用對象的方法(method)
*
* 但是它只是名稱上的區別沒有其他的區別
*
*/
var obj2 = {
name:"豬八戒",
age:18,
sayName:function(){
console.log(obj2.name);
}
};
obj2.sayName();
</script>
</head>
<body>
</body>
</html>
枚舉對象中的屬性
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
var obj = {
name:"孫悟空",
age:18,
gender:"男",
address:"花果山"
};
//枚舉對象中的屬性
//使用for ... in 語句
/*
* 語法:
* for(var 變量 in 對象){
*
* }
*
* for...in語句 對象中有幾個屬性,循環體就會執行幾次
* 每次執行時,會將對象中的一個屬性的名字賦值給變量
*/
for(var n in obj){
console.log("屬性名:"+n);
console.log("屬性值:"+obj[n]);
}
</script>
</head>
<body>
</body>
</html>
作用域(scope)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 作用域
* - 作用域指一個變量的作用的範圍
* - 在JS中一共有兩種作用域:
* 1.全局作用域
* - 直接編寫在script標籤中的JS代碼,都在全局作用域
* - 全局作用域在頁面打開時創建,在頁面關閉時銷燬
* - 在全局作用域中有一個全局對象window,
* 它代表的是一個瀏覽器的窗口,它由瀏覽器創建我們可以直接使用
* - 在全局作用域中:
* 創建的變量都會作爲window對象的屬性保存
* 創建的函數都會作爲window對象的方法保存
* - 全局作用域中的變量都是全局變量,
* 在頁面的任意的部分都可以訪問的到
*
* 2.函數作用域
*
*/
var a = 10;
var b = 20;
//var c = "hello";
//console.log(window.c);
function fun(){
console.log("我是fun函數");
}
//window.fun();
//window.alert("hello");
</script>
</head>
<body>
</body>
</html>
變量的聲明提前
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 變量的聲明提前
* - 使用var關鍵字聲明的變量,會在所有的代碼執行之前被聲明(但是不會賦值),
* 但是如果聲明變量時不適用var關鍵字,則變量不會被聲明提前
*
* 函數的聲明提前
* - 使用函數聲明形式創建的函數 function 函數(){}
* 它會在所有的代碼執行之前就被創建,所以我們可以在函數聲明前來調用函數
* 使用函數表達式創建的函數,不會被聲明提前,所以不能在聲明前調用
*/
/*console.log("a = "+a);
var a = 123;*/
//fun();
//函數聲明,會被提前創建
function fun(){
console.log("我是一個fun函數");
}
//函數表達式,不會被提前創建
var fun2 = function(){
console.log("我是fun2函數");
};
fun2();
</script>
</head>
<body>
</body>
</html>
函數的作用域
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 函數作用域
* - 調用函數時創建函數作用域,函數執行完畢以後,函數作用域銷燬
* - 每調用一次函數就會創建一個新的函數作用域,他們之間是互相獨立的
* - 在函數作用域中可以訪問到全局作用域的變量
* 在全局作用域中無法訪問到函數作用域的變量
* - 當在函數作用域操作一個變量時,它會先在自身作用域中尋找,如果有就直接使用
* 如果沒有則向上一級作用域中尋找,直到找到全局作用域,
* 如果全局作用域中依然沒有找到,則會報錯ReferenceError
* - 在函數中要訪問全局變量可以使用window對象
*/
//創建一個變量
var a = 10;
function fun(){
var a = "我是fun函數中的變量a";
var b = 20;
//console.log("a = "+a);
function fun2(){
console.log("a = "+window.a);
}
fun2();
}
//fun();
//console.log("b = "+b);
/*
* 在函數作用域也有聲明提前的特性,
* 使用var關鍵字聲明的變量,會在函數中所有的代碼執行之前被聲明
* 函數聲明也會在函數中所有的代碼執行之前執行
*/
function fun3(){
fun4();
//console.log(a);
var a = 35;
function fun4(){
alert("I'm fun4");
}
}
//fun3();
var c = 33;
/*
* 在函數中,不適用var聲明的變量都會成爲全局變量
*/
function fun5(){
//console.log("c = "+c);
//c = 10;
//d沒有使用var關鍵字,則會設置爲全局變量
d = 100;
}
fun5();
//在全局輸出c
//console.log("d = "+d);
var e = 23;
/*
* 定義形參就相當於在函數作用域中聲明瞭變量
*/
function fun6(e){
alert(e);
}
fun6();
</script>
</head>
<body>
</body>
</html>
this_1
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 解析器在調用函數每次都會向函數內部傳遞進一個隱含的參數,
* 這個隱含的參數就是this, this指向的是一個對象,
* 這個對象我們稱爲函數執行的 上下文對象,
* 根據函數的調用方式的不同,this會指向不同的對象
* 1.以函數的形式調用時,this永遠都是window
* 2.以方法的形式調用時,this就是調用方法的那個對象
*/
function fun(){
//console.log("a = "+a+", b = "+b);
console.log(this.name);
}
//fun();
//創建一個對象
var obj = {
name:"孫悟空",
sayName:fun
};
var obj2 = {
name:"沙和尚",
sayName:fun
};
//console.log(obj.sayName == fun);
var name = "全局的name屬性";
//obj.sayName();
//以函數形式調用,this是window
//fun();
//以方法的形式調用,this是調用方法的對象
//obj.sayName();
obj2.sayName();
</script>
</head>
<body>
</body>
</html>
this_2
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
//創建一個name變量
var name = "全局";
//創建一個fun()函數
function fun(){
console.log(this.name);
}
//創建兩個對象
var obj = {
name:"孫悟空",
sayName:fun
};
var obj2 = {
name:"沙和尚",
sayName:fun
};
//我們希望調用obj.sayName()時可以輸出obj的名字
//obj.sayName();
obj.sayName();
</script>
</head>
<body>
</body>
</html>
對象(工廠方法創建對象)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 創建一個對象
*/
var obj = {
name:"孫悟空",
age:18,
gender:"男",
sayName:function(){
alert(this.name);
}
};
/*
* 使用工廠方法創建對象
* 通過該方法可以大批量的創建對象
*/
function createPerson(name , age ,gender){
//創建一個新的對象
var obj = new Object();
//向對象中添加屬性
obj.name = name;
obj.age = age;
obj.gender = gender;
obj.sayName = function(){
alert(this.name);
};
//將新的對象返回
return obj;
}
/*
* 用來創建狗的對象
*/
function createDog(name , age){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.sayHello = function(){
alert("汪汪~~");
};
return obj;
}
var obj2 = createPerson("豬八戒",28,"男");
var obj3 = createPerson("白骨精",16,"女");
var obj4 = createPerson("蜘蛛精",18,"女");
/*
* 使用工廠方法創建的對象,使用的構造函數都是Object
* 所以創建的對象都是Object這個類型,
* 就導致我們無法區分出多種不同類型的對象
*/
//創建一個狗的對象
var dog = createDog("旺財",3);
console.log(dog);
console.log(obj4);
</script>
</head>
<body>
</body>
</html>
構造函數(new的過程)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 創建一個構造函數,專門用來創建Person對象的
* 構造函數就是一個普通的函數,創建方式和普通函數沒有區別,
* 不同的是構造函數習慣上首字母大寫
*
* 構造函數和普通函數的區別就是調用方式的不同
* 普通函數是直接調用,而構造函數需要使用new關鍵字來調用
*
* 構造函數的執行流程:
* 1.立刻創建一個新的對象
* 2.將新建的對象設置爲函數中this,在構造函數中可以使用this來引用新建的對象
* 3.逐行執行函數中的代碼
* 4.將新建的對象作爲返回值返回
*
* 使用同一個構造函數創建的對象,我們稱爲一類對象,也將一個構造函數稱爲一個類。
* 我們將通過一個構造函數創建的對象,稱爲是該類的實例
*
* this的情況:
* 1.當以函數的形式調用時,this是window
* 2.當以方法的形式調用時,誰調用方法this就是誰
* 3.當以構造函數的形式調用時,this就是新創建的那個對象
*
*/
function Person(name , age , gender){
this.name = name;
this.age = age;
this.gender = gender;
this.sayName = function(){
alert(this.name);
};
}
function Dog(){
}
var per = new Person("孫悟空",18,"男");
var per2 = new Person("玉兔精",16,"女");
var per3 = new Person("奔波霸",38,"男");
var dog = new Dog();
/*console.log(per);
console.log(dog);*/
/*
* 使用instanceof可以檢查一個對象是否是一個類的實例
* 語法:
* 對象 instanceof 構造函數
* 如果是,則返回true,否則返回false
*/
//console.log(per instanceof Person);
//console.log(dog instanceof Person);
/*
* 所有的對象都是Object的後代,
* 所以任何對象和Object左instanceof檢查時都會返回true
*/
//console.log(dog instanceof Object);
</script>
</head>
<body>
</body>
</html>
原型1
原型的這一節知識,我在另外的筆記裏有詳細的介紹
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 原型 prototype
*
* 我們所創建的每一個函數,解析器都會向函數中添加一個屬性prototype
* 這個屬性對應着一個對象,這個對象就是我們所謂的原型對象
* 如果函數作爲普通函數調用prototype沒有任何作用
* 當函數以構造函數的形式調用時,它所創建的對象中都會有一個隱含的屬性,
* 指向該構造函數的原型對象,我們可以通過__proto__來訪問該屬性
*
* 原型對象就相當於一個公共的區域,所有同一個類的實例都可以訪問到這個原型對象,
* 我們可以將對象中共有的內容,統一設置到原型對象中。
*
* 當我們訪問對象的一個屬性或方法時,它會先在對象自身中尋找,如果有則直接使用,
* 如果沒有則會去原型對象中尋找,如果找到則直接使用
*
* 以後我們創建構造函數時,可以將這些對象共有的屬性和方法,統一添加到構造函數的原型對象中,
* 這樣不用分別爲每一個對象添加,也不會影響到全局作用域,就可以使每個對象都具有這些屬性和方法了
*/
function MyClass(){
}
//向MyClass的原型中添加屬性a
MyClass.prototype.a = 123;
//向MyClass的原型中添加一個方法
MyClass.prototype.sayHello = function(){
alert("hello");
};
var mc = new MyClass();
var mc2 = new MyClass();
//console.log(MyClass.prototype);
//console.log(mc2.__proto__ == MyClass.prototype);
//向mc中添加a屬性
mc.a = "我是mc中的a";
//console.log(mc2.a);
mc.sayHello();
</script>
</head>
<body>
</body>
</html>
原型2
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 創建一個構造函數
*/
function MyClass(){
}
//向MyClass的原型中添加一個name屬性
MyClass.prototype.name = "我是原型中的名字";
var mc = new MyClass();
mc.age = 18;
//console.log(mc.name);
//使用in檢查對象中是否含有某個屬性時,如果對象中沒有但是原型中有,也會返回true
//console.log("name" in mc);
//可以使用對象的hasOwnProperty()來檢查對象自身中是否含有該屬性
//使用該方法只有當對象自身中含有屬性時,纔會返回true
//console.log(mc.hasOwnProperty("age"));
//console.log(mc.hasOwnProperty("hasOwnProperty"));
/*
* 原型對象也是對象,所以它也有原型,
* 當我們使用一個對象的屬性或方法時,會現在自身中尋找,
* 自身中如果有,則直接使用,
* 如果沒有則去原型對象中尋找,如果原型對象中有,則使用,
* 如果沒有則去原型的原型中尋找,直到找到Object對象的原型,
* Object對象的原型沒有原型,如果在Object原型中依然沒有找到,則返回undefined
*/
//console.log(mc.__proto__.hasOwnProperty("hasOwnProperty"));
//console.log(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));
//console.log(mc.__proto__.__proto__.__proto__);
//console.log(mc.hello);
//console.log(mc.__proto__.__proto__.__proto__)
</script>
</head>
<body>
</body>
</html>
toString
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
function Person(name , age , gender){
this.name = name;
this.age = age;
this.gender = gender;
}
//修改Person原型的toString
Person.prototype.toString = function(){
return "Person[name="+this.name+",age="+this.age+",gender="+this.gender+"]";
};
//創建一個Person實例
var per = new Person("孫悟空",18,"男");
var per2 = new Person("豬八戒",28,"男");
//當我們直接在頁面中打印一個對象時,事件上是輸出的對象的toString()方法的返回值
//如果我們希望在輸出對象時不輸出[object Object],可以爲對象添加一個toString()方法
//Person[name=孫悟空,age=18,gender=男]
/*per.toString = function(){
return "Person[name="+this.name+",age="+this.age+",gender="+this.gender+"]";
};*/
var result = per.toString();
//console.log("result = " + result);
//console.log(per.__proto__.__proto__.hasOwnProperty("toString"));
console.log(per2);
console.log(per);
</script>
</head>
<body>
</body>
</html>
垃圾回收
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 垃圾回收(GC)
* - 就像人生活的時間長了會產生垃圾一樣,程序運行過程中也會產生垃圾
* 這些垃圾積攢過多以後,會導致程序運行的速度過慢,
* 所以我們需要一個垃圾回收的機制,來處理程序運行過程中產生垃圾
* - 當一個對象沒有任何的變量或屬性對它進行引用,此時我們將永遠無法操作該對象,
* 此時這種對象就是一個垃圾,這種對象過多會佔用大量的內存空間,導致程序運行變慢,
* 所以這種垃圾必須進行清理。
* - 在JS中擁有自動的垃圾回收機制,會自動將這些垃圾對象從內存中銷燬,
* 我們不需要也不能進行垃圾回收的操作
* - 我們需要做的只是要將不再使用的對象設置null即可
*
*/
var obj = new Object();
//對對象進行各種操作。。。。
obj = null;
</script>
</head>
<body>
</body>
</html>
數組1
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 內建對象
* 宿主對象
* 自定義對象
*
* 數組(Array)
* - 數組也是一個對象
* - 它和我們普通對象功能類似,也是用來存儲一些值的
* - 不同的是普通對象是使用字符串作爲屬性名的,
* 而數組時使用數字來作爲索引操作元素
* - 索引:
* 從0開始的整數就是索引
* - 數組的存儲性能比普通對象要好,在開發中我們經常使用數組來存儲一些數據
*/
//創建數組對象
var arr = new Array();
//使用typeof檢查一個數組時,會返回object
//console.log(typeof arr);
/*
* 向數組中添加元素
* 語法:數組[索引] = 值
*/
arr[0] = 10;
arr[1] = 33;
arr[2] = 22;
arr[3] = 44;
/*arr[10] = 31;
arr[100] = 90;*/
/*
* 讀取數組中的元素
* 語法:數組[索引]
* 如果讀取不存在的索引,他不會報錯而是返回undefined
*/
//console.log(arr[3]);
/*
* 獲取數組的長度
* 可以使用length屬性來獲取數組的長度(元素的個數)
* 語法:數組.length
*
* 對於連續的數組,使用length可以獲取到數組的長度(元素的個數)
* 對於非連續的數組,使用length會獲取到數組的最大的索引+1
* 儘量不要創建非連續的數組
*/
/*console.log(arr.length);
console.log(arr);*/
/*
* 修改length
* 如果修改的length大於原長度,則多出部分會空出來
* 如果修改的length小於原長度,則多出的元素會被刪除
*/
//arr.length = 10;
/*arr.length = 2;
console.log(arr.length);
console.log(arr);*/
arr[4] = 50;
arr[5] = 60;
//向數組的最後一個位置添加元素
//語法:數組[數組.length] = 值;
arr[arr.length] = 70;
arr[arr.length] = 80;
arr[arr.length] = 90;
console.log(arr);
</script>
</head>
<body>
</body>
</html>
數組2
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
//創建一個數組
//var arr = new Array();
//使用字面量來創建數組
//語法:[]
//var arr = [];
//console.log(typeof arr);
//使用字面量創建數組時,可以在創建時就指定數組中的元素
var arr = [1,2,3,4,5,10];
//console.log(arr[3]);
//使用構造函數創建數組時,也可以同時添加元素,將要添加的元素作文構造函數的參數傳遞
//元素之間使用,隔開
var arr2 = new Array(10,20,30);
//console.log(arr2);
//創建一個數組數組中只有一個元素10
arr = [10];
//創建一個長度爲10的數組
arr2 = new Array(10);
//console.log(arr2.length);
//數組中的元素可以是任意的數據類型
arr = ["hello",1,true,null,undefined];
//也可以是對象
var obj = {name:"孫悟空"};
arr[arr.length] = obj;
arr = [{name:"孫悟空"},{name:"沙和尚"},{name:"豬八戒"}];
//也可以是一個函數
arr = [function(){alert(1)},function(){alert(2)}];
//console.log(arr);
//arr[0]();
//數組中也可以放數組,如下這種數組我們稱爲二維數組
arr = [[1,2,3],[3,4,5],[5,6,7]];
console.log(arr[1]);
</script>
</head>
<body>
</body>
</html>
數組的方法1
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
//創建一個數組
var arr = ["孫悟空","豬八戒","沙和尚"];
/*
* push()
* - 該方法可以向數組的末尾添加一個或多個元素,並返回數組的新的長度
* - 可以將要添加的元素作爲方法的參數傳遞,
* 這樣這些元素將會自動添加到數組的末尾
* - 該方法會將數組新的長度作爲返回值返回
*/
var result = arr.push("唐僧","蜘蛛精","白骨精","玉兔精");
//console.log(arr);
//console.log("result = "+result);
/*
* pop()
* - 該方法可以刪除數組的最後一個元素,並將被刪除的元素作爲返回值返回
*/
result = arr.pop();
/*console.log(arr);
console.log("result = "+result);*/
/*
* unshift()
* - 向數組開頭添加一個或多個元素,並返回新的數組長度
* - 向前邊插入元素以後,其他的元素索引會依次調整
*/
//console.log(arr);
arr.unshift("牛魔王","二郎神");
console.log(arr);
/*
* shift()
* - 可以刪除數組的第一個元素,並將被刪除的元素作爲返回值返回
*/
result = arr.shift();
result = arr.shift();
console.log(arr);
console.log("result = "+result);
</script>
</head>
<body>
</body>
</html>
數組的遍歷
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
//創建一個數組
var arr = ["孫悟空","豬八戒","沙和尚","唐僧","白骨精"];
//所謂的遍歷數組,就是將數組中所有的元素都取出來
/*console.log(arr[0]);
console.log(arr[1]);
console.log(arr[2]);
console.log(arr[3]);*/
for(var i=0 ; i<arr.length ; i++){
console.log(arr[i]);
}
</script>
</head>
<body>
</body>
</html>
forEach
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 一般我們都是使用for循環去遍歷數組,
* JS中還爲我們提供了一個方法,用來遍歷數組
* forEach()
* - 這個方法只支持IE8以上的瀏覽器
* IE8及以下的瀏覽器均不支持該方法,所以如果需要兼容IE8,則不要使用forEach
* 還是使用for循環來遍歷
*/
//創建一個數組
var arr = ["孫悟空","豬八戒","沙和尚","唐僧","白骨精"];
/*
* forEach()方法需要一個函數作爲參數
* - 像這種函數,由我們創建但是不由我們調用的,我們稱爲回調函數
* - 數組中有幾個元素函數就會執行幾次,每次執行時,瀏覽器會將遍歷到的元素
* 以實參的形式傳遞進來,我們可以來定義形參,來讀取這些內容
* - 瀏覽器會在回調函數中傳遞三個參數:
* 第一個參數,就是當前正在遍歷的元素
* 第二個參數,就是當前正在遍歷的元素的索引
* 第三個參數,就是正在遍歷的數組
*
*/
arr.forEach(function(value , index , obj){
console.log(value);
});
</script>
</head>
<body>
</body>
</html>
數組的方法2
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
var arr = ["孫悟空","豬八戒","沙和尚","唐僧","白骨精"];
/*
* slice()
* - 可以用來從數組提取指定元素
* - 該方法不會改變元素數組,而是將截取到的元素封裝到一個新數組中返回
* - 參數:
* 1.截取開始的位置的索引,包含開始索引
* 2.截取結束的位置的索引,不包含結束索引
* - 第二個參數可以省略不寫,此時會截取從開始索引往後的所有元素
* - 索引可以傳遞一個負值,如果傳遞一個負值,則從後往前計算
* -1 倒數第一個
* -2 倒數第二個
*/
var result = arr.slice(1,4);
result = arr.slice(3);
result = arr.slice(1,-2);
//console.log(result);
/*
* splice()
* - 可以用於刪除數組中的指定元素
* - 使用splice()會影響到原數組,會將指定元素從原數組中刪除
* 並將被刪除的元素作爲返回值返回
* - 參數:
* 第一個,表示開始位置的索引
* 第二個,表示刪除的數量
* 第三個及以後。。
* 可以傳遞一些新的元素,這些元素將會自動插入到開始位置索引前邊
*
*/
arr = ["孫悟空","豬八戒","沙和尚","唐僧","白骨精"];
var result = arr.splice(3,0,"牛魔王","鐵扇公主","紅孩兒");
console.log(arr);
//console.log(result);
//["孫悟空", "豬八戒", "沙和尚", "牛魔王", "鐵扇公主", "紅孩兒", "唐僧", "白骨精"]
</script>
</head>
<body>
</body>
</html>
練習——去除數組中重複的數字
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
//創建一個數組
var arr = [1,2,3,2,2,1,3,4,2,5];
//去除數組中重複的數字
//獲取數組中的每一個元素
for(var i=0 ; i<arr.length ; i++){
//console.log(arr[i]);
/*獲取當前元素後的所有元素*/
for(var j=i+1 ; j<arr.length ; j++){
//console.log("---->"+arr[j]);
//判斷兩個元素的值是否相等
if(arr[i] == arr[j]){
//如果相等則證明出現了重複的元素,則刪除j對應的元素
arr.splice(j,1);
//當刪除了當前j所在的元素以後,後邊的元素會自動補位
//此時將不會在比較這個元素吧,我需要在比較一次j所在位置的元素
//使j自減
j--;
}
}
}
console.log(arr);
</script>
</head>
<body>
</body>
</html>
數組的方法3
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<script type="text/javascript">
var arr = ["孫悟空","豬八戒","沙和尚"];
var arr2 = ["白骨精","玉兔精","蜘蛛精"];
var arr3 = ["二郎神","太上老君","玉皇大帝"];
/*
* concat()可以連接兩個或多個數組,並將新的數組返回
* - 該方法不會對原數組產生影響
*/
var result = arr.concat(arr2,arr3,"牛魔王","鐵扇公主");
/*
* join()
* - 該方法可以將數組轉換爲一個字符串
* - 該方法不會對原數組產生影響,而是將轉換後的字符串作爲結果返回
* - 在join()中可以指定一個字符串作爲參數,這個字符串將會成爲數組中元素的連接符
* 如果不指定連接符,則默認使用,作爲連接符
*/
arr = ["孫悟空","豬八戒","沙和尚","唐僧"];
result = arr.join("@-@"); //"孫悟空@-@豬八戒@-@沙和尚@-@唐僧"
/*
* reverse()
* - 該方法用來反轉數組(前邊的去後邊,後邊的去前邊)
* - 該方法會直接修改原數組
*/
arr.reverse();
//console.log(arr);
arr = ["b","d","e","a","c"];
/*
* sort()
* - 可以用來對數組中的元素進行排序
* - 也會影響原數組,默認會按照Unicode編碼進行排序
*/
arr.sort();
//arr.reverse();
/*
* 即使對於純數字的數組,使用sort()排序時,也會按照Unicode編碼來排序,
* 所以對數字進排序時,可能會得到錯誤的結果。
*
* 我們可以自己來指定排序的規則
* 我們可以在sort()添加一個回調函數,來指定排序規則,
* 回調函數中需要定義兩個形參,
* 瀏覽器將會分別使用數組中的元素作爲實參去調用回調函數
* 使用哪個元素調用不確定,但是肯定的是在數組中a一定在b前邊
* - 瀏覽器會根據回調函數的返回值來決定元素的順序,
* 如果返回一個大於0的值,則元素會交換位置
* 如果返回一個小於0的值,則元素位置不變
* 如果返回一個0,則認爲兩個元素相等,也不交換位置
*
* - 如果需要升序排列,則返回 a-b
* 如果需要降序排列,則返回b-a
*/
arr = [5,4,2,1,3,6,8,7];
arr.sort(function(a,b){
//前邊的大
/*if(a > b){
return -1;
}else if(a < b){
return 1;
}else{
return 0;
}*/
//升序排列
//return a - b;
//降序排列
return b - a;
});
console.log(arr);
</script>
</head>
<body>
</body>
</html>
函數的方法(call和apply)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
function fun(a,b) {
console.log("a = "+a);
console.log("b = "+b);
//alert(this);
}
var obj = {
name: "obj",
sayName:function(){
alert(this.name);
}
};
/*
* call()和apply()
* - 這兩個方法都是函數對象的方法,需要通過函數對象來調用
* - 當對函數調用call()和apply()都會調用函數執行
* - 在調用call()和apply()可以將一個對象指定爲第一個參數
* 此時這個對象將會成爲函數執行時的this
* - call()方法可以將實參在對象之後依次傳遞
* - apply()方法需要將實參封裝到一個數組中統一傳遞
*
* - this的情況:
* 1.以函數形式調用時,this永遠都是window
* 2.以方法的形式調用時,this是調用方法的對象
* 3.以構造函數的形式調用時,this是新創建的那個對象
* 4.使用call和apply調用時,this是指定的那個對象
*/
//fun.call(obj,2,3);
fun.apply(obj,[2,3]);
var obj2 = {
name: "obj2"
};
/*fun.apply();
fun.call();
fun();*/
//fun.call(obj);
//fun.apply(obj);
//fun();
//obj.sayName.apply(obj2);
</script>
</head>
<body>
</body>
</html>
arguments
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 在調用函數時,瀏覽器每次都會傳遞進兩個隱含的參數:
* 1.函數的上下文對象 this
* 2.封裝實參的對象 arguments
* - arguments是一個類數組對象,它也可以通過索引來操作數據,也可以獲取長度
* - 在調用函數時,我們所傳遞的實參都會在arguments中保存
* - arguments.length可以用來獲取實參的長度
* - 我們即使不定義形參,也可以通過arguments來使用實參,
* 只不過比較麻煩
* arguments[0] 表示第一個實參
* arguments[1] 表示第二個實參 。。。
* - 它裏邊有一個屬性叫做callee,
* 這個屬性對應一個函數對象,就是當前正在指向的函數的對象
*
*/
function fun(a,b){
console.log(arguments instanceof Array); //false
console.log(Array.isArray(arguments)); //false
console.log(arguments[1]); //true
console.log(arguments.length); //2
console.log(arguments.callee == fun); //true
}
fun("hello",true);
</script>
</head>
<body>
</body>
</html>
Date
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* Date對象
* - 在JS中使用Date對象來表示一個時間
*/
//創建一個Date對象
//如果直接使用構造函數創建一個Date對象,則會封裝爲當前代碼執行的時間
var d = new Date();
//創建一個指定的時間對象
//需要在構造函數中傳遞一個表示時間的字符串作爲參數
//日期的格式 月份/日/年 時:分:秒
var d2 = new Date("2/18/2011 11:10:30");
/*
* getDate()
* - 獲取當前日期對象是幾日(18日)
*/
var date = d2.getDate();
/*
* getDay()
* - 獲取當前日期對象時周幾
* - 會返回一個0-6的值
* 0 表示週日
* 1表示週一
* 。。。
*/
var day = d2.getDay();
/*
* getMonth()
* d2 = new Date("12/18/2011 11:10:30");
* - 獲取當前時間對象的月份
* - 會返回一個0-11的值
* 0 表示1月
* 1 表示2月
* 11 表示12月
*/
var month = d2.getMonth();
/*
* getFullYear()
* - 獲取當前日期對象的年份
*/
var year = d2.getFullYear();
//console.log(d2);
//console.log("date = "+date);
//console.log("day = "+day);
//console.log("month = "+month);
//console.log(year);
/*
* getTime()
* - 獲取當前日期對象的時間戳
* - 時間戳,指的是從格林威治標準時間的1970年1月1日,0時0分0秒
* 到當前日期所花費的毫秒數(1秒 = 1000毫秒)
* - 計算機底層在保存時間時使用都是時間戳
*/
var time = d2.getTime();
//console.log(time/1000/60/60/24/365);
/*var d3 = new Date("1/1/1970 0:0:0");
time = d3.getTime();
console.log(time);*/
//利用時間戳來測試代碼的執行的性能
//獲取當前的時間戳
var start = Date.now();
for(var i=0 ; i<100 ; i++){
console.log(i);
}
var end = Date.now();
console.log("執行了:"+(end - start)+"毫秒");
</script>
</head>
<body>
</body>
</html>
Math
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* Math
* - Math和其他的對象不同,它不是一個構造函數,
* 它屬於一個工具類不用創建對象,它裏邊封裝了數學運算相關的屬性和方法
* - 比如
* Math.PI 表示的圓周率
*/
//console.log(Math.PI);
/*
* abs()可以用來計算一個數的絕對值
*/
//console.log(Math.abs(-1));
/*
* Math.ceil()
* - 可以對一個數進行向上取整,小數位只有有值就自動進1
* Math.floor()
* - 可以對一個數進行向下取整,小數部分會被舍掉
* Math.round()
* - 可以對一個數進行四捨五入取整
*/
//console.log(Math.ceil(1.1));
//console.log(Math.floor(1.99));
//console.log(Math.round(1.4));
/*
* Math.random()
* - 可以用來生成一個0-1之間的隨機數
* - 生成一個0-10的隨機數
* - 生成一個0-x之間的隨機數
* Math.round(Math.random()*x)
*
* - 生成一個1-10
* - 生成一個x-y之間的隨機數
* Math.round(Math.random()*(y-x)+x)
*/
/*for(var i=0 ; i<100 ; i++){
//console.log(Math.round(Math.random()*10));
//console.log(Math.round(Math.random()*20));
//console.log(Math.round(Math.random()*9)+1);
//console.log(Math.round(Math.random()*8)+2);
//生成1-6之間的隨機數
console.log(Math.round(Math.random()*5+1));
}*/
/*
* max() 可以獲取多個數中的最大值
* min() 可以獲取多個數中的最小值
*/
var max = Math.max(10,45,30,100);
var min = Math.min(10,45,30,100);
//console.log(min);
/*
* Math.pow(x,y)
* 返回x的y次冪
*/
//console.log(Math.pow(12,3));
/*
* Math.sqrt()
* 用於對一個數進行開方運算
*/
console.log(Math.sqrt(2));
</script>
</head>
<body>
</body>
</html>
包裝類
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 基本數據類型
* String Number Boolean Null Undefined
* 引用數據類型
* Object
*
* 在JS中爲我們提供了三個包裝類,通過這三個包裝類可以將基本數據類型的數據轉換爲對象
* String()
* - 可以將基本數據類型字符串轉換爲String對象
* Number()
* - 可以將基本數據類型的數字轉換爲Number對象
* Boolean()
* - 可以將基本數據類型的布爾值轉換爲Boolean對象
* 但是注意:我們在實際應用中不會使用基本數據類型的對象,
* 如果使用基本數據類型的對象,在做一些比較時可能會帶來一些不可預期的結果
*/
//創建一個Number類型的對象
//num = 3;
var num = new Number(3);
var num2 = new Number(3);
var str = new String("hello");
var str2 = new String("hello");
var bool = new Boolean(true);
var bool2 = true;
//向num中添加一個屬性
num.hello = "abcdefg";
//console.log(str === str2); false
var b = new Boolean(false);
/*if(b){
alert("我運行了~~~");
}*/
/*
* 方法和屬性之能添加給對象,不能添加給基本數據類型
* 當我們對一些基本數據類型的值去調用屬性和方法時,
* 瀏覽器會臨時使用包裝類將其轉換爲對象,然後在調用對象的屬性和方法
* 調用完以後,在將其轉換爲基本數據類型
*/
var s = 123;
s = s.toString();
s.hello = "你好";
console.log(s.hello);
//console.log(typeof s);
</script>
</head>
<body>
</body>
</html>
字符串的相關方法
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
//創建一個字符串
var str = "Hello Atguigu";
/*
* 在底層字符串是以字符數組的形式保存的
* ["H","e","l"]
*/
/*
* length屬性
* - 可以用來獲取字符串的長度
*/
//console.log(str.length);
//console.log(str[5]);
/*
* charAt()
* - 可以返回字符串中指定位置的字符
* - 根據索引獲取指定的字符
*/
str = "中Hello Atguigu";
var result = str.charAt(6);
/*
* charCodeAt()
* - 獲取指定位置字符的字符編碼(Unicode編碼)
*/
result = str.charCodeAt(0);
/*
* String.formCharCode()
* - 可以根據字符編碼去獲取字符
*/
result = String.fromCharCode(0x2692);
/*
* concat()
* - 可以用來連接兩個或多個字符串
* - 作用和+一樣
*/
result = str.concat("你好","再見");
/*
* indexof()
* - 該方法可以檢索一個字符串中是否含有指定內容
* - 如果字符串中含有該內容,則會返回其第一次出現的索引
* 如果沒有找到指定的內容,則返回-1
* - 可以指定一個第二個參數,指定開始查找的位置
*
* lastIndexOf();
* - 該方法的用法和indexOf()一樣,
* 不同的是indexOf是從前往後找,
* 而lastIndexOf是從後往前找
* - 也可以指定開始查找的位置
*/
str = "hello hatguigu";
result = str.indexOf("h",1);
result = str.lastIndexOf("h",5);
/*
* slice()
* - 可以從字符串中截取指定的內容
* - 不會影響原字符串,而是將截取到內容返回
* - 參數:
* 第一個,開始位置的索引(包括開始位置)
* 第二個,結束位置的索引(不包括結束位置)
* - 如果省略第二個參數,則會截取到後邊所有的
* - 也可以傳遞一個負數作爲參數,負數的話將會從後邊計算
*/
str = "abcdefghijk";
result = str.slice(1,4);
result = str.slice(1,-1);
/*
* substring()
* - 可以用來截取一個字符串,可以slice()類似
* - 參數:
* - 第一個:開始截取位置的索引(包括開始位置)
* - 第二個:結束位置的索引(不包括結束位置)
* - 不同的是這個方法不能接受負值作爲參數,
* 如果傳遞了一個負值,則默認使用0
* - 而且他還自動調整參數的位置,如果第二個參數小於第一個,則自動交換
*/
result = str.substring(0,1);
/*
* substr()
* - 用來截取字符串
* - 參數:
* 1.截取開始位置的索引
* 2.截取的長度
*/
str = "abcdefg";
result = str.substr(3,2);
/*
* split()
* - 可以將一個字符串拆分爲一個數組
* - 參數:
* -需要一個字符串作爲參數,將會根據該字符串去拆分數組
*/
str = "abcbcdefghij";
result = str.split("d");
/*
* 如果傳遞一個空串作爲參數,則會將每個字符都拆分爲數組中的一個元素
*/
result = str.split("");
//console.log(Array.isArray(result));
//console.log(result[0]);
console.log(result);
str = "abcdefg";
/*
* toUpperCase()
* - 將一個字符串轉換爲大寫並返回
*/
result = str.toUpperCase();
str = "ABCDEFG";
/*
* toLowerCase()
* -將一個字符串轉換爲小寫並返回
*/
result = str.toLowerCase();
//console.log(result);
</script>
</head>
<body>
</body>
</html>
正則表達式1
這一節正則表達式,我有更加詳細的筆記,具體請查看
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 正則表達式
* - [email protected]
* - [email protected] adminatguigu.com
* - 郵件的規則:
* 1.前邊可以是xxxx亂七八糟
* 2.跟着一個@
* 3.後邊可以是xxxx亂七八糟
* 4..com獲取其他的亂七八糟
*
* - 正則表達式用於定義一些字符串的規則,
* 計算機可以根據正則表達式,來檢查一個字符串是否符合規則,
* 獲取將字符串中符合規則的內容提取出來
*/
//創建正則表達式的對象
/*
* 語法:
* var 變量 = new RegExp("正則表達式","匹配模式");
* 使用typeof檢查正則對象,會返回object
* var reg = new RegExp("a"); 這個正則表達式可以來檢查一個字符串中是否含有a
* 在構造函數中可以傳遞一個匹配模式作爲第二個參數,
* 可以是
* i 忽略大小寫
* g 全局匹配模式
*/
var reg = new RegExp("ab","i");
var str = "a";
/*
* 正則表達式的方法:
* test()
* - 使用這個方法可以用來檢查一個字符串是否符合正則表達式的規則,
* 如果符合則返回true,否則返回false
*/
var result = reg.test(str);
//console.log(result);
console.log(reg.test("Ac"));
</script>
</head>
<body>
</body>
</html>
正則表達式2
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
/*
* 使用字面量來創建正則表達式
* 語法:var 變量 = /正則表達式/匹配模式
* 使用字面量的方式創建更加簡單
* 使用構造函數創建更加靈活
*
*/
//var reg = new RegExp("a","i");
var reg = /a/i;
//console.log(typeof reg);
//console.log(reg.test("abc"));
//創建一個正則表達式,檢查一個字符串中是否有a或b
/*
* 使用 | 表示或者的意思
*/
reg = /a|b|c/;
/*
* 創建一個正則表達式檢查一個字符串中是否有字母
*/
//reg = /a|b|c|d|e|f|g/;
/*
* []裏的內容也是或的關係
* [ab] == a|b
* [a-z] 任意小寫字母
* [A-Z] 任意大寫字母
* [A-z] 任意字母
* [0-9] 任意數字
*/
reg = /[A-z]/;
//檢查一個字符串中是否含有 abc 或 adc 或 aec
reg = /a[bde]c/;
/*
* [^ ] 除了
*/
reg = /[^ab]/;
reg = /[^0-9]/;
console.log(reg.test("12a3456"));
</script>
</head>
<body>
</body>
</html>
字符串和正則相關的方法
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
<script type="text/javascript">
var str = "1a2b3c4d5e6f7";
/*
* split()
* - 可以將一個字符串拆分爲一個數組
* - 方法中可以傳遞一個正則表達式作爲參數,這樣方法將會根據正則表達式去拆分字符串
* - 這個方法即使不指定全局匹配,也會全都插分
*/
/*
* 根據任意字母來將字符串拆分
*/
var result = str.split(/[A-z]/);
//console.log(result);
/*
* search()
* - 可以搜索字符串中是否含有指定內容
* - 如果搜索到指定內容,則會返回第一次出現的索引,如果沒有搜索到返回-1
* - 它可以接受一個正則表達式作爲參數,然後會根據正則表達式去檢索字符串
* - serach()只會查找第一個,即使設置全局匹配也沒用
*/
str = "hello abc hello aec afc";
/*
* 搜索字符串中是否含有abc 或 aec 或 afc
*/
result = str.search(/a[bef]c/);
//console.log(result);
/*
* match()
* - 可以根據正則表達式,從一個字符串中將符合條件的內容提取出來
* - 默認情況下我們的match只會找到第一個符合要求的內容,找到以後就停止檢索
* 我們可以設置正則表達式爲全局匹配模式,這樣就會匹配到所有的內容
* 可以爲一個正則表達式設置多個匹配模式,且順序無所謂
* - match()會將匹配到的內容封裝到一個數組中返回,即使只查詢到一個結果
*
*
*/
str = "1a2a3a4a5e6f7A8B9C";
result = str.match(/[a-z]/ig);
//console.log(result[2]);
/*
* replace()
* - 可以將字符串中指定內容替換爲新的內容
* - 參數:
* 1.被替換的內容,可以接受一個正則表達式作爲參數
* 2.新的內容
* - 默認只會替換第一個
*/
//result = str.replace(/[a-z]/gi , "@_@");
result = str.replace(/[a-z]/gi , "");
//console.log(result);
</script>
</head>
<body>
</body>
</html>