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)