let關(guān)鍵字
<!DOCTYPE html>
<html lang="en">
<head>
? <meta charset="UTF-8">
? <title>01_let關(guān)鍵字</title>
</head>
<body>
<button>測試1</button>
<br>
<button>測試2</button>
<br>
<button>測試3</button>
<br>
<!--
***let
1. 作用:
? * 與var類似, 用于聲明一個變量
2. 特點:
? * 在塊作用域內(nèi)有效
? * 不能重復(fù)聲明
? * 不會預(yù)處理, 不存在變量提升
3. 應(yīng)用:
? * 循環(huán)遍歷加監(jiān)聽
? * 使用let取代var是趨勢
-->
<script type="text/javascript">
//面試題
//?? console.log(username);//沒有預(yù)解析 會報錯
let username = "kobe";//不能重復(fù)聲明
// let username = "wade";//不能重復(fù)聲明
? console.log(username);//沒有預(yù)解析 會報錯
let btns = document.getElementsByName("button");
for(let i=0; i<btns.length; i++){
? var btn = btns[i];
? //var 無法獲取正確的索引
? btn.onclick = function () {
? ? alert(i);
? }
}
// (function (i) {
//?? btn.onclick = function () {
//? ?? alert(i)
//?? }
// })(i)
</script>
</body>
</html>
const關(guān)鍵字
<!DOCTYPE html>
<html lang="en">
<head>
? <meta charset="UTF-8">
? <title>02_const關(guān)鍵字</title>
</head>
<body>
<!--
1. 作用:
? * 定義一個常量
2. 特點:
? * 不能修改
? * 其它特點同let
3. 應(yīng)用:
? * 保存不用改變的數(shù)據(jù)
-->
<!--var是聲明變量 const是聲明常量-->
<!-- var 可以修改 const 不能修改-->
<script type="text/javascript">
var KEY = 'NBA';//var可修改
KEY = 'CBA'
const KEY = "NBA";//CBA
console.log(KEY);//CBA
const KEY = 'NBA';//const不可修改
//KEY ='CBA'; 當(dāng) var換成const時,不能寫怔锌,會報錯
console.log(KEY);
</script>
</body>
</html>
變量的解構(gòu)賦值
<!DOCTYPE html>
<html lang="en">
<head>
? <meta charset="UTF-8">
? <title>03_變量的解構(gòu)賦值</title>
</head>
<body>
<!--
1. 理解:
? * 從對象或數(shù)組中提取數(shù)據(jù), 并賦值給變量(多個)
2. 對象的解構(gòu)賦值
? let {n, a} = {n:'tom', a:12}
3. 數(shù)組的解構(gòu)賦值
? let [a,b] = [1, 'hello'];
4. 用途
? * 給多個形參賦值
-->
<script type="text/javascript">
let obj = {username:"kobe",age:"40"};
// let username = obj.username;
// let age = obj.age;
// let xxx = obj.xxx;//undefined
//username
? let{age} = obj;
console.log(age);
let arr? = [1,3,5,"abc",true];
// let[a,b,c,d,e] = arr;
// console.log(a,b,c,d,e);//1 3
let[,,a,b] = arr;
console.log(a,b);//5 "abc"
// function foo(obj) {
//?? console.log(obj.username, obj.age);
// }
function foo({username,age}) {//{username.age}=obj
? console.log(username,age);
}
foo(obj);
</script>
</body>
</html>
模板字符串
<!DOCTYPE html>
<html lang="en">
<head>
? <meta charset="UTF-8">
? <title>04_模板字符串</title>
</head>
<body>
<!--
1. 模板字符串 : 簡化字符串的拼接
? * 模板字符串必須用 `` 包含
? * 變化的部分使用${xxx}定義
-->
<script type="text/javascript">
let obj = {username :"kobe",age:"40"};
// let str = "我的名字是:"+ obj.username + "我的年齡是"+ obj.age;
str = '我的名字是: ${obj.username},我的年齡: ${obj.age}';
// console.log(str)//我的名字是:kobe我的年齡是40
? console.log(str)
</script>
</body>
</html>
對象簡寫
<!DOCTYPE html>
<html lang="en">
<head>
? <meta charset="UTF-8">
? <title>05_簡化的對象寫法</title>
</head>
<body>
<!--
簡化的對象寫法
* 省略同名的屬性值
* 省略方法的function
* 例如:
? let x = 1;
? let y = 2;
? let point = {
? ? x,
? ? y,
? ? setX (x) {this.x = x}
? };
-->
<script type="text/javascript">
let username = "kobe";
let age = 40;
let obj = {
? username,
? age,
? getName(){
? ? return this,username;
}
}
console.log(obj);
console.log(obj.getName());
</script>
</body>
</html>
箭頭函數(shù)
<!DOCTYPE html>
<html lang="en">
<head>
? <meta charset="UTF-8">
? <title>06_箭頭函數(shù)</title>
</head>
<body>
? ? <button id="btn1">測試箭頭函數(shù)this_1</button>
? ? <button id="btn2">測試箭頭函數(shù)this_2</button>
<!--
* 作用: 定義匿名函數(shù)
* 基本語法:
? * 沒有參數(shù): () => console.log('xxxx')
? * 一個參數(shù): i => i+2
? * 大于一個參數(shù): (i,j) => i+j
? * 函數(shù)體不用大括號: 默認(rèn)返回結(jié)果
? * 函數(shù)體如果有多個語句, 需要用{}包圍寥粹,若有需要返回的內(nèi)容,需要手動返回
* 使用場景: 多用來定義回調(diào)函數(shù)
* 箭頭函數(shù)的特點:
? ? 1埃元、簡潔
? ? 2涝涤、箭頭函數(shù)沒有自己的this,箭頭函數(shù)的this不是調(diào)用的時候決定的岛杀,而是在定義的時候所處的對象就是它的this
? ? 3阔拳、擴展理解: 箭頭函數(shù)的this看外層的是否有函數(shù),
? ? ? ? 如果有类嗤,外層函數(shù)的this就是內(nèi)部箭頭函數(shù)的this糊肠,
? ? ? ? 如果沒有,則this是window遗锣。
-->
<script type="text/javascript">
// let fun = function () {
//? ?? console.log('我是函數(shù)');
// }
// let fun = () => console.log("我是箭頭函數(shù)");
fun()
let fun1 = () => console.log("我是箭頭函數(shù)");//沒有參數(shù)要用括號占位
fun1();
let fun2 = a => console.log(a);//只有一個形參括號可以省略
fun2("aaa");
let fun3 = (x,y) => console.log(x,y);//多個形參括號不可以省略
fun3("23,45");
let fun4 = (x,y) => x + y;
console.log(fun4(34,26));//60
let fun5 = (x,y) =>{
? ? console.log(x,y);
? ? return x + y;
};
? ? console.log(fun5(35,49));//84
let btn1 = document.getElementById("btn1");
let btn2 = document.getElementById("btn2");
btn1.onclick = function () {
? ? alert(this);//[object HTMLButtonElement]
? ? console.log(this);
};
btn2.onclick = function () {
? ? alert(this);//[object windows]
? ? console.log(this);
};
// let obj = {
//? ?? name:"箭頭函數(shù) ",
//? ?? getName:function(){
//? ? ? ?? btn2.onclick = () =>{
//? ? ? ? ? ?? alert(this);//[object,Object]
//? ? ? ? ? ?? con】sole.log(this);//{name : "箭頭函數(shù)",getName:f
//? ?? }
//? ?? }普通函數(shù)
// }
let obj = {
? ? name:"箭頭函數(shù) ",
? ? getName:() =>{
? ? ? ? btn2.onclick = () =>{
? ? ? ? ? ? alert(this);//[object,windows]
? ? ? ? ? ? console.log(this);//windows
? ? ? ? }
? ? }
}
// fun4()
</script>
</body>
</html>
三點運算符
<!DOCTYPE html>
<html lang="en">
<head>
? <meta charset="UTF-8">
? <title>07_3點運算符</title>
</head>
<body>
<!--
* 用途
1. rest(可變)參數(shù)
? ? * 用來取代arguments 但比 arguments 靈活,只能是最后部分形參參數(shù)
? ? function fun(...values) {
? ? ? ? console.log(arguments);
? ? ? ? arguments.forEach(function (item, index) {
? ? ? ? ? ? console.log(item, index);
? ? ? ? });
? ? ? ? console.log(values);
? ? ? ? values.forEach(function (item, index) {
? ? ? ? ? ? console.log(item, index);
? ? ? ? })
? ? }
? ? fun(1,2,3);
2. 擴展運算符
? let arr1 = [1,3,5];
? let arr2 = [2,...arr1,6];
? arr2.push(...arr1);
-->
<script type="text/javascript">
function foo(a,...value) {
? console.log(arguments);
? // arguments.callee();//遞歸
? //
?? console.log(value);
? //?? arguments.forEach(function (item,index) {
? //?? console.log(item,index);
? // })
? value.forEach(function (item,index) {
? ? console.log(item,index);
? })
}
foo(2,65,33,34);
let arr = [1,6];
let arr1 = [2,3,4,5];
arr = [1,...arr1,6];
console.log(arr);//[1,2,3,4,5,6]
console.log(...arr);
</script>
</body>
</html>
形參默認(rèn)值
<!DOCTYPE html>
<html lang="en">
<head>
? <meta charset="UTF-8">
? <title>08_形參默認(rèn)值</title>
</head>
<body>
<!--
? ? * 形參的默認(rèn)值----當(dāng)不傳入?yún)?shù)的時候默認(rèn)使用形參里的默認(rèn)值
? ? function Point(x = 1,y = 2) {
this.x = x;
this.y = y;
? ? }
-->
<script type="text/javascript">
function Point(x=0,y=0) {
? this.x = x;
? this.y = y;
}
let point = new Point(23,35);
console.log(point);
let point1 = new Point();
console.log(point1);
</script>
</body>
</html>
Promise對象
<!DOCTYPE html>
<html lang="en">
<head>
? <meta charset="UTF-8">
? <title>11_Promise對象</title>
</head>
<body>
<!--
1. 理解:
? * Promise對象: 代表了未來某個將要發(fā)生的事件(通常是一個異步操作)
? * 有了promise對象, 可以將異步操作以同步的流程表達(dá)出來, 避免了層層嵌套的回調(diào)函數(shù)(俗稱'回調(diào)地獄')
? * ES6的Promise是一個構(gòu)造函數(shù), 用來生成promise實例
2. 使用promise基本步驟(2步):
? * 創(chuàng)建promise對象
? ? let promise = new Promise((resolve, reject) => {
? ? ? ? //初始化promise狀態(tài)為 pending
? ? ? //執(zhí)行異步操作
? ? ? if(異步操作成功) {
? ? ? ? resolve(value);//修改promise的狀態(tài)為fullfilled
? ? ? } else {
? ? ? ? reject(errMsg);//修改promise的狀態(tài)為rejected
? ? ? }
? ? })
? * 調(diào)用promise的then()
? ? promise.then(function(
? ? ? result => console.log(result),
? ? ? errorMsg => alert(errorMsg)
? ? ))
3. promise對象的3個狀態(tài)
? * pending: 初始化狀態(tài)
? * fullfilled: 成功狀態(tài)
? * rejected: 失敗狀態(tài)
4. 應(yīng)用:
? * 使用promise實現(xiàn)超時處理
? * 使用promise封裝處理ajax請求
? ? let request = new XMLHttpRequest();
? ? request.onreadystatechange = function () {
? ? }
? ? request.responseType = 'json';
? ? request.open("GET", url);
? ? request.send();
-->
<script type="text/javascript">
// // 創(chuàng)建Promise對象
//?? let promise = new Promise((resolve,reject) => {
//
//? ?? //初始化Promise狀態(tài) pending(初始化)
//? ?? console.log("111");
//
//? ?? //執(zhí)行異步操作货裹,通常是發(fā)送AJAX請求,開啟定時器
//? ?? setTimeout(() => {
//? ? ?? console.log('333');
//? ? ?? //根據(jù)異步任務(wù)的返回結(jié)果黄伊,去修改Promise的狀態(tài)
//? ? ?? //異步任務(wù)執(zhí)行成功
//? ? ?? resolve('哈哈');//修改Promise的狀態(tài)為fullfilled(成功狀態(tài))
//
//? ? ?? //異步任務(wù)執(zhí)行失敗
//? ? ?? reject('555');//修改Promise的狀態(tài)為rejected: 失敗狀態(tài)
//? ?? }, 2000);
//?? })
//
//? ? console.log('222');
//?? promise.then((data) => {//成功的回調(diào)
//? ?? console.log('成功了@峤础!!');
//?? },(error) => {//失敗的回調(diào)
//? ?? console.log('失敗了;棺睢D狗А!');
// })
// 定義獲取新聞的功能函數(shù)
function getNews(url){
let promise = new Promise((resolve, reject) => {
// 狀態(tài):初始化
// 執(zhí)行異步任務(wù)
// 創(chuàng)建xmlHttp實例對象
let xmlHttp = new XMLHttpRequest();
console.log(xmlHttp.readyState);
//綁定readyState監(jiān)聽
xmlHttp.onreadystatechange = function(){
if(xmlHttp.readyState === 4){
if(xmlHttp.status == 200){//請求成功
// console.log(xmlHttp.responseText);
//修改狀態(tài)
resolve(xmlHttp.responseText);//修改promise的狀態(tài)為成功的狀態(tài)
}else{//請求失敗
reject('暫時沒有新聞內(nèi)容');
}
}
};
// open設(shè)置請求的方式以及url
xmlHttp.open('GET', url);
// 發(fā)送
xmlHttp.send();
})
return promise;
}
getNews('http://localhost:3000/new?id=2')
? ? ? ? ? ? .tnen((data) =>{
? console.log(data);
},(error) => {
? console.log(error);
});
// getNews('http://localhost:30001/news?id=2')
// .then((data) => {
// console.log(data);
// // console.log(typeof data);
// // 準(zhǔn)備獲取評論內(nèi)容的url
// let commentsUrl = JSON.parse(data).commentsUrl;
// let url = 'http://localhost:3000' + commentsUrl;
// // 發(fā)送請求獲取評論內(nèi)容
// return getNews(url);
// }, (error) => {
// console.log(error);
// })
// .then((data) => {
// console.2log(data);
// }, () => {
// });
</script>
</body>
</html>