JavaScript 
text::Html5  
text::CSS3  
ajax请求 
Ajax(Asynchronous JavaScript and XML),直译为“异步的JavaScript与XML技术 ”,与传统的Web应用相比,Ajax通过浏览器与服务器进行少量的数据交换就可以实现网页的异步更新,在不重新加载整个网页的情况下,即可对网页进行更新。
ECMAScript 6 入门 - 《阮一峰 ECMAScript 6 (ES6) 标准入门教程 第三版》 - 书栈网 · BookStack 
 
 
一、JS基础 1 简介 
面向对象的解释性语言,主要目的是验证发往服务器的数据,增加 Web 互动,弱类型语言。
语句从上到下执行,一行一个语句,语句后带分号,表达式不带分号。
 
JS组成 
解释 
 
 
ECMAScript(基础语法) 
JavaScript的核心语法。描述了该语言的语法和基本对象 
 
DOM(文档对象模型) 
描述了处理网页内容的方法和接口 
 
BOM(浏览器对象模型) 
描述了与浏览器进行交互的方法和接口 
 
 
 
2 基本用法 
JS需要和HTML一起使用才有效果,我们可以通动直接或间接的方式将Js代码嵌入在HTML页面中。
我们可以将JavaScript代码放在html文件中任何位置,但是我们一般放在网页的head或者body部分。由于页面的加载方式是从上往下依次加载的,而这个对我们放置的js代码运行是有影响的。
放在<head>部分,最常用的方式是在页面中head部分放置<script>元素,浏览器解析head部分就会执行这个代码,然后才解析页面的其余部分。
 
放在<body>部分,JavaScript代码在网页读取到该语句的时候就会执行。
 
放在<body>标签后(推荐)。此时页面已经加载完成。再加载JavaScript代码时就比较稳定,不会出现由于标签未执行而导致空异常等报错。 
 
调试:直接在界面加断点。
 
<button  type ="button"  onclick ="alert('Hello World')" > 按一下</button > <script  type ="text/javascript" >  ... </script > <script  src ="js/*.js"  type ="text/javascript"  charset ="UTF-8" > </script > 
 
 
二、基本语法 1 输出 alert ();console .log ();onclick="code" ; 
 
2 注释  
3 变量 
let和var的区别:
let只能在代码块内使用 
var可以重复声明,let不行 
var会变量提升,let不会 
 
 
var  str = "" ;console .log (uname);var  uname = "zhang" ;var  uname;console .log (uname);uname = "zhang" ; up = "123" ; function  func{     var  x;      if { var  x; }  } function  func{    let  x;      if { let  x; } } const  PI  = 3.14159 ;const  p = this .node .position ;p.x  += 1 ; 
 
var  PI  = "3.1415926" ;if (true ){     console .log (PI );     let  PI ; } var  PI  = "3.1415926" ;if (true ){     let  PI ;     console .log (PI ); } 
 
4 数据类型 
值类型:
Number:所有数字是浮点存储,但若是整型,浮点会自动转化成整型(例如3.0转化为3) 
String 
Boolean 
undefined:function中未传参参为undefined,无返回值返回undefined 
null:typeof测试object字符串返回值,undefined与null等值,bool测试为true 
 
引用类型:
object:像字典集合 
array 
function 
 
 
typeof  var_name;isNaN (num);parseInt ('str' );parseFloat ('str' );int/float.toString (); int/float.toFixed (num); Number ();Boolean ();String ();variable.value (); label_name[.label_name ].value (); 
 
let  s1 = Symbol ();let  s2 = Symbol ('another symbol' );let  s3 = Symbol ('another symbol' );console .log (s2 === s3);const  PROP_NAME  = Symbol ();const  PROP_AGE  = Symbol ();let  obj = {    [PROP_NAME ]:"一斤鸭梨" ; } obj[PROP_AGE ] = 12 ; console .log (obj[PROP_NAME ]);console .log (obj[PROP_AGE ]);console .log (Object .keys (obj));console .log (Object .getOwnPropertySymbols (obj));console .log (Reflect .ownKeys (obj));const  TYPE_AUDIO  = 'AUDIO' ;const  TYPE_AUDIO  = Symbol ();
 
5 运算符 
同C语言。
不同:
\==:判断相等,比较值 ===:判断全等,比较值和类型
 
6 选择语句 
if 同 C语言。
switch 同C语言。
 
7 循环语句 
while同C语言。
do…while同C语言。
for同C语言。
 
8 捕获异常 try  {         let  result = someFunction ();     console .log (result); }  catch  (error) {         console .error ("An error occurred:" , error); }  finally  {         console .log ("The try-catch block has finished executing." ); } 
 
 
三、数组 1 定义 var  arr = [value_1,value_2,value_3];var  arr = new  Array (value_1,value_2,value_3);   var  arr = new  Array (size);arr.length ; arr[num]; arr[key]; 
 
2 数组遍历 
数组在使用的时候建议大家规矩来用。在存放数据时,从下标0开始顺序的存放数组元素。如果下标:
为非负整数(包括整数字符串)︰自动从0开始,不存在添加undefined。 
为负数、小数、非数字符串:这些内容不计算在长度内,当成”属性”处理,相当于自定义属性。 
 
数组非常灵活,使用数组元素:
index:非负整数(包括整数字符串)使用arr.index,arr[ index ]
 
index:负数、小数、非数字字符串使用arr[key]
 
 
 
for (var  i=0 ;i<arr.length ;i++) {} for (var  index in  arr) {}function  func (element,index ) {}arr.foreach (func( element,index) ) {}      
 
3 排序函数 
函数 
排序依据 
排序规则 
”键值对“是否改变 
 
 
sort() 
元素值 
升序 
是 
 
rsort() 
元素值 
降序 
是 
 
asort() 
元素值 
升序 
否 
 
arort() 
元素值 
降序 
否 
 
ksort() 
索引值 
升序 
否 
 
krsort() 
索引值 
降序 
否 
 
natsort() 
元素值 
升序 
否 
 
natcasesort() 
元素值 
升序 
否 
 
shuffle() 
元素值 
随机乱序 
是 
 
 
 
4 解构赋值 
ES6新特性,优点如下:
解构赋值是对赋值运算符的扩展。 
他是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值。 
在代码书写上简洁且易读,语义更加清晰明了;也方便了复杂对象中数据字段获取。 
 
 
let  [a,b,c] = [1 ,2 ,3 ];let  [a,[[b],c]] = [1 ,[[2 ],3 ]];let  [a,,b] = [1 ,2 ,3 ]let  [a, ...b] = [1 ,2 ,3 ];let  [a = 3 , b = a] = []; let  [a = 3 , b ] = [4 ,6 ] let  [a = 2 ] = [undefined ];let  [a,b] = [1 ];let  [a,b,c,d,e] = 'Hello' ;
 
let  { foo, bar } = { foo :'aaa' , bar 'bbb' };let  { foo : bar } = { foo : 'ddd' };let  obj = {p : ['hello' , {y : 'world' }]};let  {p : [x, {y}]} = obj;let  obj = {p : ['hello' , {y : 'world' }]};let  {p : [x, { }]} = obj;let  obj = {p : [{y : 'world' }]};let  {p : [{y},x]} = obj;let  {a,b, ...rest} = {a :10 , b :20 , c :30 , d :40 };let  {a = 10 , b = 5 } = {a : 3 };let  {a : aa = 10 , b : bb = 5 } = {a : 3 };
 
 
四、函数 1 定义 
使用函数声明语句声明函数具有函数名提升的效果。
JS没有函数重载,新定义的同名函数会覆盖原函数。
参数:函数运行的时候,有时需要提供外部数据,不同的外部数据会得到不同的结果,这种外部数据就叫参数,定义时的参数称为形参,调用时的参数称为实参。
实参可以省略,那么对应形参为undefined。 
若函数形参同名(一般不会这么干)︰在使用时以最后一个值为准。 
可以给参数默认值:当参数为特殊值时,可以赋予默认值。 
参数为值传递,传递副本;引用传递时传递地址,操作的是同一个对象。 
 
变量:函数外全局变量,函数内局部变量。
同名:同名不影响。 
函数内不加 var 修饰符则为全局变量。 
 
 
function  name  ( [value] ) {};var  name = function ( [value]  ){};var  name = new  Function ( value );var  add = new  Function ('x' ,'y' ,'return (x + y)' );function  add  (x,y) {return  (x + y);}(function (n1,n2 ){  console .log (n1,n2); })(10 ,100 ); (function (n1,n2 ){  console .log (n1,n2); }(10 ,100 )); 
 
  is_action_pressed (k ) {    return  !!this ._pressd_map [k]; } 
 
2 计时函数 setInterval ("fun()" ,delay);setTimeout ("fun()" ,delay);clearInterval (index);clearTimeout (index);
 
3 箭头函数 
ES6标准新增的函数。
箭头函数的this:
普通函数的this指向它的调用者,如果没有调用者则默认指向window。 
箭头函数体中的this对象,是定义函数时的对象,而不是使用函数时的对象。 
箭头函数中的this,首先从它的父级作用域中找,如果父级作用域还是箭头函数,再往上找,如此直至找到this的指向。 
 
 
x => x + x; var  f  = x => x * x;let  f  = (a,b ) => {    let  result = a + b;     return  result; } f (1 ,2 );let  f  = (id,name ) => ({id :id ,name :name});f (1 ,'Lili' );
 
var  str = "windows" ;const  obj_1 = {	str :"obj_1" , 	nativeFn : function ( ){ 		console .log ("当前作用于this:" ,this .str ); 		return  function ( ){ 			console .log ("原生函数this:" ,this .str ); 		} 	}, 	arrowFn : function ( ){ 		console .log ("当前作用于this:" ,this .str ); 		return  () =>  { 			console .log ("箭头函数this:" ,this .str ); 		} 	} }; const  obj_2 = {	str :"obj_2"  } var  nativeFn = obj_1.nativeFn ();var  arrowFn = obj_1.arrowFn ();nativeFn ();arrowFn ();console .log ("下面改变调用者" );nativeFn.call (obj_2); arrowFn.call (obj_2); 
 
 
五、对象 
自定义对象前的对象为内置对象。
 
1 with <form name="myform" ></form> with (document .myform ){ 	var  username = username.value ; } 
 
2 String 
字符串对象
 
属性
 
方法
str.charAt (idx); str.indexOf (chr,start); lastIndexOf (chr,start);replace (regexp/substr,replacement);split (separator,limit);str.substr (m,n); str.substring (m, n); str.toLowerCase (); str.toUpperCase (); nl2br (string);strip_tags (string,[allow]);
 
3 Math 
数学对象
 
Math .random ();Math .ceil (value);Math .floor (value);Math .round (value);Math .max (value_1,value_2);Math .min (value_1,value_2);Math .abs (value);Math .pow (value,n);Math .sqrt (value);Math .PI ;Math .sin (value);Math .asin (value);
 
4 Date 
日期对象
转换成本地时间字符串说明:
getMonth():得到值:0~11 (1月~12月) 
setMonth():设置值:0~11 
toLocaleString():可根据本地时间把 Date 对象转换为字符串,并返回结果。 
 
toLocaleString() 
 
var  mydate=new  Date ();getFullYear ();getMonth ();getDate ();getHours ();getMinutes ();getseconds ();setYear ();setMonth ();setDate ();setHours ();setMinutes ();setSeconds ();toLoacaleString ();
 
5 Array 
数组对象
sortby 
 
arr.push (value); arr.unshift (value); arr.pop (); arr.shift (); delete  arr[index];arr.sort (sortby); function (a,b ){return  a-b};arr.reverse (); arr.join ([value]); arr.indexOf (value); arr.slice (start,end); arr.splice (start,num,[add_1 , add_2 , ...]); arr.concat (new_arr); 
 
6 Arguments 
只在函数内定义,保存了函数的实参。
 
7 document 
通过javascript来操作DOM元素
 
获取DOM属性
document .getElementById (id);document .getElementsById (id);document .getElementsByName (name);document .getElementsByTagName (tag);document .getElementsByClassName (class );document .querySelector (选择器);document .querySelectorAll (选择器);dom.innerHTML ; dom.innerText ; 
 
操作DOM属性
dom.html_attr ='值' ; dom.class_Name ='类名' ; dom.getAttribute ('attr' ); dom.setAttribute ('attr' ,'值' ) dom.removeAttribute ('attr' ); dom.hasAttribute ('attr' ); 
 
操作CSS属性
getComputedStyle (dom).property ;getComputedStyle (dom)['property' ];dom.style .property ='new style' ; dom.style .cssText ="style" ; 
 
DOM遍历
dom.parentNode ; dom.childNodes ; dom.children ; dom.firstChild ; dom.firstElementChild ; dom.lastChild ; dom.lastElementChild ; dom.previousSibling ; dom.nextSibling ; dom.previousElementSibling ; dom.nextElementSibling ; 
 
动态DOM
createElement ('html_label' );createTextNode ('text_content' );parent.appendChild (B); parent.appendChild (B,ref);  appendChild ()dom.removeChild (B); dom.cloneNode (bool); dom.replaceChild (new ,old); 
 
8 自定义对象 
this:
函数中使用:调用windows对象,相当于定义在全局对象上的属性。 
对象中使用:调用本对象的属性。 
 
 
var  obj = {}; var  obj = { key : value, key : value, ... }var  obj = new  Object (); var  obj = Object .create (null ); var  obj = Object .create (other_obj); obj.key  = value; obj[key]; const  PROP_NAME  = Symbol ();const  PROP_AGE  = Symbol ();let  obj = {	PROP_NAME :"一斤鸭梨" , 	PROP_AGE :12 , 	[PROP_NAME ]:"两斤鸭梨" , 	[PROP_AGE ]:13  } console .log (obj.PROP_NAME );console .log (obj.PROP_AGE );console .log (obj[PROP_NAME ]);console .log (obj[PROP_AGE ]);
 
9 序列化与反序列化 JSON .stringify (obj);JSON .parse (jsonStr);
 
10 Map 
字典
Map和Object的区别:
一个Object的键只能是字符串或者Symbols,但一个Map 的键可以是任意值。 
Map中的键值是有序的(FIFO 原则),而添加到对象中的键则不是。 
Map的键值对个数可以从size属性获取,而Object的键值对个数只能手动计算。 
 
 
let  map = new  Map ();map.set ("str" ,"The type of key is string" ); map.set (obj,"The type of key is obj" ); 
 
11 Set 
集合
Set对象存储的值总是唯一的,所以需要判断两个值是否恒等。有几个特殊值需要特殊对待:
+0与-0在存储判断唯一性的时候是恒等的,所以不能重复 
undefined与undefined是恒等的,所以不能重复 
NaN与NaN是不恒等的,但是在Set中只能存一个,不能重复 
 
 
let  set = new  Set ();set.add (1 ); let  set = new  Set (["value1" ,"value2" ]);let  array = [...set];let  set = new  Set ('Hello' );let  set = new  Set ([1 ,2 ,3 ,3 ,4 ,4 ]);let  array = [...set];let  union = new  Set ([...set1, ...set2]);let  intersect = new  Set ([...set1].filter (x  =>  set2.has (x)));let  difference = new  Set ([...set1].filter (x  =>  !set2.has (x)));
 
 
六、BOM 
浏览器对象模型。
 
1 window 属性
window .innerHeight window .innerWidth 
 
方法
window .open (url)window .close () window .scrollBy ( x , y )window .scrollTo ( x , y )
 
案例
window .scrollTo (0 ,document .body .scrollHeight )
 
2 screen 
浏览器窗口。
 
属性
screen.availWidth  screen.availHeight  
 
3 location 
地址栏对象。
 
属性
 
4 history 
浏览器历史对象。
 
方法
history.forward () history.back () history.go (n) history.go (-1 );  
 
5 navigator 
获得浏览器的信息。
 
<script>     txt = "<p>浏览器代号: "  + navigator.appCodeName  + "</p>" ;     txt+= "<p>浏览器名称: "  + navigator.appName  + "</p>" ;     txt+= "<p>浏览器版本: "  + navigator.appVersion  + "</p>" ;     txt+= "<p>启用Cookies: "  + navigator.cookieEnabled  + "</p>" ;     txt+= "<p>硬件平台: "  + navigator.platform  + "</p>" ;     txt+= "<p>用户代理: "  + navigator.userAgent  + "</p>" ;     txt+= "<p>用户代理语言: "  + navigator.language  + "</p>" ;     console .log (txt); </script> 
 
 
七、事件 1 鼠标点击事件 
事件名 
描述 
 
 
onclick 
单机鼠标左键时触发 
 
ondbclick 
双击鼠标左键时触发 
 
onmousedown 
鼠标任意键按下时触发 
 
onmouseup 
松开鼠标任意按键时触发 
 
onmouseover 
鼠标指针移动到元素上时触发 
 
onmouseout 
鼠标指针移出元素边界时触发 
 
onmousemove 
鼠标指针在元素上移动时持续触发 
 
 
 
2 html事件 
事件名 
描述 
 
 
onload 
页面完全加载后再 window 对象上触发,图片加载完成后在其上触发 
 
onunload 
页面完全加载后再 window 对象上触发,图片卸载完成后在其上触发 
 
onerror 
脚本出错时再 window 对象上触发,图像无法载入时在其上触发 
 
onselect 
选择了文本框的某些字符或下拉列表框的某项后触发 
 
onchange 
文本框或下拉框内容改变时触发 
 
onsubmit 
表单提交时在 form 上触发 
 
onblur 
任何元素或窗口失去焦点时触发 
 
onfocus 
任何元素或窗口获得焦点时触发 
 
onscroll 
浏览器的滚动条滚动时触发 
 
 
 
<form  onsubmit ="return check();" > </form > 
 
 
八、异步操作 1 ajax请求 
Ajax(Asynchronous JavaScript and XML)是一种用于创建动态网页的技术。它通过在后台与服务器进行少量数据交换,实现页面无需刷新就能更新部分内容的效果。Ajax请求是通过JavaScript代码发起的异步HTTP请求,可以在不刷新整个页面的情况下,向服务器请求数据并更新页面的部分内容。Ajax请求通常使用XMLHttpRequest对象来实现。Ajax请求可以用于实现各种功能,如实时搜索、动态加载内容、表单验证等。
my::延迟回显 
 
事件名 
事件效果 
 
 
click 
鼠标点击时触发 
 
mouseover 
鼠标移入元素时触发 
 
mouseout 
鼠标移出元素时触发 
 
mousedown 
鼠标按下时触发 
 
mouseup 
鼠标松开时触发 
 
mousemove 
鼠标在元素内移动时触发 
 
keydown 
键盘按下时触发 
 
keyup 
键盘松开时触发 
 
submit 
表单提交时触发 
 
change 
表单元素的值发生改变时触发(要按回车) 
 
input 
元素内容发生改变时执行(不需要按回车) 
 
load 
页面或图片加载完成时触发 
 
error 
页面或图片加载失败时触发 
 
 
 
var  read_letters = document .querySelectorAll ("#read_letter" );var  rebound_want_read_letter = function ( ){          var  read_letters = document .querySelectorAll ("#read_letter" );          var  I_want_read_letter = function  ( )     {                  var  xhr = new  XMLHttpRequest ();                  xhr.open ("POST" , "inc/read.php" , true );         xhr.setRequestHeader ("Content-type" , "application/x-www-form-urlencoded" );         xhr.send ("CID=" +value);                  xhr.onreadystatechange  = function ( )          {             JSON .parse (xhr.responseText );          };                  xhr.onerror  = function ( ) {};     }          if (read_letters != null )     {         read_letters.forEach (function (read_letter )         {             read_letter.addEventListener ("click" , I_want_read_letter);         });     } } rebound_want_read_letter ();
 
2 Promise基础 
抽象表达:
1) Promise是一门新的技术(ES6规范) 2) Promise是Js中进行异步编程的新解决方案(旧方案是单纯使用回调函数)
具体表达:
从语法上来说:Promise是一个构造函数 
从功能上来说:Promise对象用来封装一个异步操作并可以获取其成功/ 失败的结果值 
 
指定回调函数的方式更加灵活:
旧的:必须在启动异步任务前指定。 
promise:启动异步任务=>返回promie,对象=>给promise对象绑定回调函 数(甚至可以在异步任务结束后指定/多个) 
 
回调地狱是指回调函数嵌套调用,外部回调函数异步执行的结果是嵌套的回调执行的条件。回调地狱会导致不便于阅读,不便于异常处理等问题。因为promise支持链式调用,所以可以解决回调地狱问题。
【PromiseState】
在promise对象中,存在三种状态(PromiseState):pending(待定),resolved / fulfilled(成功),rejected(失败)
promise只有下列两种转换:
pending变为resolved 
pending变为rejected 
 
一个promise对象只能改变一次,无论变为成功还是失败,都会有一个结果数据 成功的结果数据一般称为value,失败的结果数据一般称为reason。
【PromiseResult】
在promise对象中通过PromiseResult保存着对象成功或失败的结果,通过resolve(para)和reject(para)函数传递参数来改变它的值。
 
const  p = new  Promise ((resolve, reject ) => {    setTimeout (() =>  {     	     	let  n = Math .floor (Math .random () * 100  + 1 ); 		if (n <= 30 ){             resolve ();           }else {             reject ();           } 	}, 1000 ); }); p.then ((value ) =>  {     alert ("success!"  + value); }, (reason ) =>  {     alert ("failed!"  + reason); }) 
 
const  handleClick  = (path ) => {	const  p = new  Promise ((resolve, reject ) => {         fs.readFile (path, (err, data ) => {             if (err) reject (err);             resolve (data);         }); 	}); 	 	p.then ((value ) =>  { 		console .log (value.toString ()); 	}, (reason ) =>  { 		console .log (reason.toString ()); 	}) }; const  handleClick  = (method, path ) => {	 	const  p = new  Promise ((resolve, reject ) =>  { 		 		const  xhr = new  XMLHttpRequest (); 		 		xhr.open (method, path); 		 		xhr.send (); 		 		xhr.onreadystatechange  = function ( ) { 			if  (xhr.readyState  === 4 ) { 			 			if  (xhr.status  >= 200  && xhr.status  < 300 ) { 				 				resolve (xhr.response ); 				} else  { 				 				reject (xhr.status ); 				} 			} 		}; 	}); 	p.then ((value ) =>  { 		console .log (value.toString ()); 	}, (reason ) =>  { 		console .log (reason.toString ()); 	}); }; 
 
3 promisify 
利用promisify,可以快速地对一个方法进行封装,不需要再手动实现函数。
 
const  fs = require ('fs' );const  util = require ('util' );const  readFile = util.promisify (fs.readFile );readFile ('./resource/content.txt' ).then (value  => {    console .log (value.toString ()); }) 
 
4 Promise API 
注:promise中的代码是同步代用的,不会进入到队列当中,会立即执行。
Promise构造函数:Promise(excutor){}:
executor函数:执行器(resolve, reject) =>{} 
resolve函数:内部定义成功时我们调用的函数value =>{} 
reject函数:内部定义失败时我们调用的函数reason =>{} 
说明:executor 会在 Promise内部立即同步调用,异步操作在执行器中执行。 
 
Promise.prototype.then方法:(onResolved, onRejected) =>{}:
onResoled函数:功的回调函数(value)=>{} 
onRejected函数:失败的回调函数(reason)=>{} 
说明:指定用于得到成功value的成功回调和用于得到失败reason的失败回调 返回一个新的promise对象 
 
Promise.prototype.catch方法:(onRejected)=>{}:
onRejected函数:失败的回调函数(reason)=> {} 
说明:该方法是then()的语法糖,相当于:then(undefined, onRejected) 
 
Promise.resolve方法:(value)=>{}:
value: 成功的数据或promise对象,传入的promise的返回结果会影响该函数的结果。内部成功返回成功,内部失败返回失败,返回的失败会异常,要用catch()捕获处理 
说明:返回一个成功/失败的promise对象 
 
Promise.reject方法:(reason) => {}:
reason:失败的原因,可以是数据或promise对象 
说明:返回一个失败的 promise对象,必定失败,即使传入的是成功的promise对象。返回的失败会异常,要用catch()捕获处理 
 
Promise.all方法:(promises)=> {}:
promises:包含n个promise的数组 
说明:返回一个新的 promise,只有所有的promise都成功才成功,只要有一个失败了就直接失败。成功返回的结果是由这些promise的成功结果构成的一个数组。失败则是返回那一个失败的promise的结果 
 
Promise.race方法:(promises)=> {}:
promises:包含n个promise 的数组 
说明:返回一个新的 promise,第一个完成的promise的结果状态就是最终的结果状态,无论成功失败。 
 
 
const  p = new  Promise ((resolve, reject ) => {});p.then ((value ) =>  {}, (reason ) =>  {}); p.catch (reason  =>  {}); Promise .resolve (data);Promise .reject (data);Promise .all ([p1, p2, p3]);Promise .race ([p1, p2, p3]);
 
let  p1 = new  Promise ((resolve,reject )=> {    setTimeout (() =>  {         resolve ('OK' );     }, 1000 ); }); let  p2 = Promise .resolve ('Success' );let  p3 = Promise .resolve ('Yes' );console .log (Promise .race ([p1, p2, p3]));
 
==promise未学== 5 promise 状态
x+1 axios 库  
九、面向对象 1 class 
ES6支持class关键字
 
class  Point {         #privateValue;               constructor (x,y ){                  this .#privateValue = 1 ;         this .x  = x;         this .y  = y;     }          toString ( ){         return  this .x  + " "  + this .y ;     } } class  Child  extends  Father  {  constructor ( ) {     super (); }      class  test (){    _value;          get  value () {         return  this .value ;       }          set  value (val ) {         this .value  = val;       } } 
 
2 函数嵌套 function  Person (name ){    let  obj = new  Object ();     obj.name  = name;     obj.showName  = function ( ){         console .log (this .name );     }     return  obj; } let  p = Person ("Bob" );p.showName (); function  Person (name ){    this .name  = name;     this .showName  = function ( ){         console .log (this .name );     } } let  p = new  Person ("Bob" );p.showName (); 
 
 
十、其他 1 游戏 
低于13kB的10个惊人的JavaScript游戏 - 知乎 (zhihu.com)