作者:魔王哪吒 来自掘金
小伙伴们,下午好。关于JavaScript学习相关文章,小编我最少发布了十几篇文章了,具体请见本篇文章底部,有兴趣的小伙伴可以看看。
var a = [1, 2, 5];for(var k in a){ console.log(k); // k 为当前元素的下标}for(var m of a){ console.log(m); // m 为当前元素的值}VM215:3 0VM215:3 1VM215:3 2VM215:6 1VM215:6 2VM215:6 5复制代码
代码:
// ES5var a = 'web';window.a; // 'web'// ES6let b = 'web';window.b; // undefined复制代码
代码:
// 单行注释/*多行注释*/复制代码
代码:
// ES5及之前console.log(a); // undefinedvar a = 1;console.log(a); // 1// ES6开始console.log(b); // Uncaught ReferenceError: b1 is not definedlet b = 2;console.log(b); // 2复制代码
代码:
// 函数声明f(); // 'web'function(){console.log('web');};复制代码
// 函数表达式g(); // Uncaught TypeError: g is not a functionvar g = function(){ // 换成 let 声明也一样console.log('web');}复制代码
示例{}包含的内容表示一个代码块
代码:
if(test1=="red") { test1 = "blue"; alert(test1);}复制代码
JavaScript关键字:
break,else,new,varcase,finally,return,voidcatch,for,switch,whilecontinue,function,this,withdefault,if,throwdelete,in,trydo,instanceof,typeof复制代码
在javascript中,变量是存储信息的容器,变量存在两种类型的值,即为原始值和引用值。
代码:
console.log( null == undefined); // true复制代码
使用isFinite()方法判断参数值是否是有穷的。
示例:
console.log(NaN == NaN) // falseconsole.log(isNaN("66")); // false复制代码
返回值:
undefined,变量是Undefined类型boolean,变量是Boolean类型的number,变量是Number类型的string,变量是String类型的object,变量是一种引用类型或者Null类型复制代码
示例:
console.log(typeof 12); // number复制代码
typeof运算符对null的值返回Object。
示例:
<script> var a = new Array(); if(a instanceof Array) { console.log('a是一个数组类型'); }else{ console.log('a不是一个数组类型'); }</script>复制代码
示例:
赋值运算符的符号为=算数运算符:+,-,*,/,%比较运算符:>,>=,<,<=,!=,==,===,!==逻辑运算符: &&,逻辑与,表示表达式前后全为true才能返回true||,逻辑或,表示表达式前后只要有一个true就返回true!,逻辑取反,表示表达式后若为true,则返回false,否则反之。复制代码
示例:
if(条件 1) { 当条件1为true时执行的代码}else if(条件 2){ 当条件2为true时执行的代码}else{ 当条件1和条件2都不为true时执行的代码}复制代码
示例:
switch(n){ case1: 执行代码块1 break; case2: 执行代码块2 break; default: ...}复制代码
示例:
for(语句1;语句2;语句3){ 被执行的代码块}复制代码
示例:
for(键 in 对象) { 代码块}复制代码
示例:
while(表达式){ 代码块}复制代码
示例:
do { 代码}while(表达式)复制代码
数组的属性和方法:
concat()
连接两个或更多的数组,并返回一个新数组。
语法:
arr.concat(a1, a2, ..., an)复制代码
参数:
join()
使用指定分隔符,连接两个或多个数组的元素,返回一个字符串。
pop()和push()
shift()和unshift()
示例:
let arr = [1, 2, 3, 5, 6];let a1 = arr.slice(2); // [3, 5, 6]let a2 = arr.slice(2,3); // [3]let arr = [1, 2, 3, 4];let a = arr.splice(1, 2, "web", "a");// a => [2, 3]// arr => [1, "web", "a", 4]复制代码
代码:
let a = [1,3,5,7];a.forEach(function(val, index, arr){ arr[index] = val * 2})a ; // [2, 6, 10, 14]复制代码
代码:
arr.every(callback)测试数组的所有元素是否都通过了指定函数的测试。some()测试数组中的某些元素是否通过由提供的函数实现的测试。复制代码
示例:
let a = [1, "", "aa", 2, 6];let res = a.filter(function(val, index, arr){ return typeof val == "number";})res;//[1, 2, 6]复制代码
对每个元素执行此方法,并返回一个执行后的数组。
示例:
let a = [1, 3, 5];let b = a.map(function(val, index, arr){ return val + 1;})b; //[2, 4, 6]复制代码
拓展运算符使用(...)
示例:
console.log(...[1, 2, 3]); // 1 2 3 console.log(1, ...[2,3], 4); // 1 2 3 4复制代码
// 通常情况 浅拷贝let a1 = [1, 2];let a2 = a1; a2[0] = 3;console.log(a1,a2); // [3,2] [3,2]// 拓展运算符 深拷贝let a1 = [1, 2];let a2 = [...a1];// let [...a2] = a1; // 作用相同a2[0] = 3;console.log(a1,a2); // [1,2] [3,2]复制代码
let [a, ...b] = [1, 2, 3, 4]; // a => 1 b => [2,3,4]let [a, ...b] = [];// a => undefined b => []let [a, ...b] = ["abc"];// a => "abc" b => []复制代码
new Array(3).fill('a'); // ['a','a','a'][1,2,3].fill('a'); // ['a','a','a'][1,2,3].fill('a',1,2);// [1, "a", 3]复制代码
代码:
[1,2,3].includes(3,3); // false[1,2,3].includes(3,4); // false[1,2,3].includes(3,-1); // true[1,2,3].includes(3,-4); // true复制代码
示例:
var arr1 = [1, 2, [3, 4]];arr1.flat(); // [1, 2, 3, 4]var arr2 = [1, 2, [3, 4, [5, 6]]];arr2.flat();// [1, 2, 3, 4, [5, 6]]var arr3 = [1, 2, [3, 4, [5, 6]]];arr3.flat(2);// [1, 2, 3, 4, 5, 6]复制代码
var arr4 = [1, 2, , 4, 5];arr4.flat();// [1, 2, 4, 5]复制代码
语法
var new_array = arr.flatMap(function callback(currentValue[, index[, array]]) { // return element for new_array}[, thisArg])复制代码
var arr1 = [1, 2, 3, 4];arr1.map(x => [x * 2]); // [[2], [4], [6], [8]]arr1.flatMap(x => [x * 2]);// [2, 4, 6, 8]// only one level is flattenedarr1.flatMap(x => [[x * 2]]);// [[2], [4], [6], [8]]复制代码
let arr1 = ["it's Sunny in", "", "California"];arr1.map(x => x.split(" "));// [["it's","Sunny","in"],[""],["California"]]arr1.flatMap(x => x.split(" "));// ["it's","Sunny","in", "", "California"]复制代码
reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
var sum = [0, 1, 2, 3].reduce(function (accumulator, currentValue) { return accumulator + currentValue;}, 0);// 和为 6var total = [ 0, 1, 2, 3 ].reduce( ( acc, cur ) => acc + cur, 0);复制代码
语法
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])initialValue可选作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。复制代码
字符串对象属性
字符串对象方法
indexOf(),lastIndexOf(),search()和match()。
3种字符串截取方法:substring(),slice(),substr()
字符串替换
replace(),replace(正则表达式/要被替换的字符串,要替换成为的子字符串)。
字符串切割
split()用于将一个字符串分割成字符串数组,语法为字符串。split(用于分割的子字符串,返回数组的最大长度),返回数组的最大长度一般情况下不设置。
事件流:
事件的处理过程主要有三个阶段:捕获阶段,目标阶段,冒泡阶段 事件流包含三个阶段:事件捕获阶段,处于目标阶段和事件冒泡阶段。
事件冒泡和事件捕获
事件触发方式
代码:
addEventListener("click","doSomething","true")复制代码
第三个参数为true,表示采用事件捕获,若false,表示采用事件冒泡。
<!DOCTYPE html><html lang="en><head><meta charset="UTF-8"><title>Document</title><style>html,body{ width:100%; height:100%;}</style><script> window.onload=function(){ d1 = document.getElementById("d1"); d2 = document.getElementById("d2"); d3 = document.getElementById("d3"); // true 表示在捕获阶段响应 // false 表示在冒泡阶段响应 d1.addEventListener("click",function(event){ console.log("d1") },"true"); d2.addEventListener("click",function(event){ console.log("d2") },"true") d3.addEventListener("click",function(event){ console.log("d3") },"true") }</script></head><body><div id="d1" style="background: #0000ff; width: 500px; height: 500px"><div id="d2" style="background: #00ff00; width: 400px; height: 400px"><div id="d3" style="background: #ff0000; width: 200px; height: 200px"></div></div></div></body></html>复制代码
addEventListener网页,点击跳转:addEventListener.html
一个响应事件委托到另一个元素。
<ul id="btn"> <li id="btn1">按钮1</li> <li id="btn2">按钮2</li> <li id="btn3">按钮3</li></ul>var btn1 = document.getElementById('btn1');var btn2 = document.getElementById('btn2');var btn3 = document.getElementById('btn3');webbtn.myAddFun(btn1, 'click', function(event){ alert('1点击');});webbtn.myAddFun(btn2, 'click', function(event){ alert('2点击');});webbtn.myAddFun(btn3, 'click', function(event){ alert('3点击');});复制代码
添加一个事件处理函数,来做事件委托
var btn = document.getElementById('btn');webbtn.myAddFun(btn, 'click', function(event){ event = webbtn.getMyEvent(event); var target = webbtn.getMyTarget(event); switch(target.id){ case "btn1": alert('1点击'); break; case "btn2": alert('2点击'); break; case "btn3": alert('3点击'); break; }});复制代码
键盘事件就是有关键盘操作所触发的世界。
键盘事件:
鼠标绑定onmousedown(),onmousemove(),onmouseup()事件。
mouse网页,点击跳转:mouse.html
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>mouse</title> <style> html,body{ width: 100%; height: 100%; } #dd { width: 120px; height: 120px; background: #00ff00; position: absolute; } </style> <script> var dd; var mflag = false; function ondown() { dd = document.getElementById('dd'); mflag = true; } function onmove(e){ if(mflag) { dd.style.left = e.clientX - 60 + "px"; dd.style.top = e.clientY - 60 + "px"; } } function onup() { mflag = false; } </script></head> <body onmousemove="onmove(event)"> <div id="dd" onmousedown="ondown()" onmouseup="onup()" style="left: 80px;top: 120px;" </body></html>复制代码
鼠标事件:
示例:
function web(e) { mouseX = e.clientX; mouseY = e.clientY; console.log("x:"+mouseX + "," + "y:"+mouseY)}<body onclick="web(event)">复制代码
窗口事件:
load事件,表示当页面完全加载完之后,就会触发window上面的load事件。包含所有的图像,js文件,css文件等外部资源。
示例:
window.onload=function(){}复制代码
当页面完全加载完之后执行其中的函数。
示例:
<script> window.onload = function() { var mydiv = document.getElementById("mydiv"); console.log(mydiv.innerText); }</script><body> <div id="mydiv"></div></body>复制代码
示例:
function imgLoad() { myimg = document.getElementById("myimg"); // 图片加载完成后,给图片加载框 myimg.style.border = "9px solid function imgLoad() { myimg = document.getElementById("myimg"); // 图片加载完成后,给图片加载框 myimg.style.border = "9px solid $00ff00";}<img id="myimg src="" onload="imgLoad()">复制代码ff00";}<img id="myimg src="" onload="imgLoad()">复制代码
resize事件
示例:
document.body.clientWidth和
document.body.clientHeight获得窗口的宽和高。
html,body { width: 100%; height: 100%;}<script> function winChange() { winWidth = document.body.clientWidth; winHeight = document.body.clientHeight; }</script><body onresize="winChange()"></body>复制代码
scrol事件,文档或者浏览器窗口被滚动时触发scroll事件
示例:
<script> function scrollChange() { srpos = document.getElementById("srpos"); srpos.innerText = document.documentElement.scrollTop; srpos.style.top = docuemnt.documentElement.scrollTop+"px"; }</script><body onscroll="scrollChange()"> <div style="height:300%;"> <br/> <font id="srpos" style="position: relative;top: 0px">滚动条滚动到0px</font> </div></body>复制代码
焦点事件
示例:
<script>var note;function myfocus(fname,notename) { note = document.getElementById(notename); note.innerText = fname+'获得焦点';}function myblur(fname,notename) { note = document.getElementById(notename); note.innerText = fname + '失去焦点';}</script><body><form name="myform"><input type="text" name="uname" onfocus="myfocus('uname','unote')" onblur="myblur('uname','unote')"/><font id="unote"></font><br/><input type="text" name="pwd" onfocus="myfocus('pwd','pnot')" onblur="myblur('pwd','pnote')"/><font id="pnote"></font></form></body>复制代码
事件方法
窗口事件
鼠标事件
键盘事件与事件冒泡,获取
JavaScript的DOM操作,包含获取节点,获取,设置元素的属性值,创建,添加节点,删除节点,属性操作。
获取节点的方法:
document.getElementById(idName)复制代码
document.getElementsByName(name)复制代码
document.getElementsByClassName(className)复制代码
document.getElementsByTagName(tagName)复制代码
获取,设置元素的属性值
示例:
<script>window.onload=function(){ mytable = document.getElementById('mytable'); // 获取mytable中标签名为tr的字节点 trs = mytable.getElementsByTagName("tr"); len = trs.length; flag = true; for(i=0;i<len;i++){ if(flag){ trs[i].setAttribute('bgcolor','#cccccc'); flag = false; }else{ flag = true; } } ww = mytable.getAttribute('width');}</script><body><table id="mytable' align='center' width="80%" border="1"><tr bgcolor = "#cccccc"> <td>aaa</td> <td>bbb</td> <td>ccc</td></tr></table></body>复制代码
创建,添加节点
代码:
// 创建节点:document.createElement("h1");document.createTextNode(String);document.createAttribute("class");复制代码
代码:
element.appendChild(Node);element.insertBefore(newNode, existingNode);复制代码
代码:
element.removeChild(Node)复制代码
属性操作:获取当前元素的父节点,获取当前元素的子节点,获取当前元素的同级元素,获取当前元素的文本,获取当前节点的节点类型,设置样式。
代码:
element.parentNode复制代码
代码:
element.chlidren复制代码
代码:
element.nextElementSiblingelement.previousElementSibling复制代码
代码:
element.innerHTMLelement.innerText复制代码
代码:
node.nodeType复制代码
document对象
document属性和方法:
location对象
location属性和方法:
navigator 对象
navigator对象包含有关浏览器的信息
screen对象
screen对象的属性:
history对象
history对象的属性:
数学函数
日期函数
代码:
function 函数名(参数){ 函数体 return 返回值}复制代码
代码:
function web1 () { document.write("1");}web1();var web2 = function(){ document.write("2")}web2();// 无须调用,直接执行,此方法不常用var web3 = new function( document.write("3"));复制代码
在js中一个函数在另一个函数中定义,就可以访问到父函数的成员,内部的函数就称为闭合函数。
闭合是词法闭包的简称,是引用了自由变量的函数。
闭包函数的特点:
代码:
function init() { var name = "web"; // name 是一个被 init 创建的局部变量 function displayName() { // displayName() 是内部函数,一个闭包 alert(name); // 使用了父函数中声明的变量 } displayName();}init();复制代码
init() 创建了一个局部变量 name 和一个名为 displayName() 的函数。
displayName() 是定义在 init() 里的内部函数,并且仅在 init() 函数体内可用。
displayName() 没有自己的局部变量。然而,因为它可以访问到外部函数的变量,所以 displayName() 可以使用父函数 init() 中声明的变量 name 。
displayName() 函数内的 alert() 语句成功显示出了变量 name 的值(该变量在其父函数中声明)。
这个词法作用域的例子描述了分析器如何在函数嵌套的情况下解析变量名。
词法指,词法作用域根据源代码中声明变量的位置来确定该变量在何处可用。嵌套函数可访问声明于它们外部作用域的变量。
闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
JavaScript中所有的function都是一个闭包。不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的“闭包”。
闭包的作用
在a执行完并返回后,闭包使得Javascript的垃圾回收机制GC不会收回a所占用的资源,因为a的内部函数b的执行需要依赖a中的变量。
代码如下:
for(var i = 0 ; i<10; i++){ setTimeout(function(){ console.log(i); },100);}复制代码
返回的是10个10。
解决:
for(var i = 0; i<10 ; i++){ (function(i){ setTimeout(function(){ console.log(i); }, i*100); })(i);}复制代码
ES6之前,使用var声明变量会变量提升问题:
for(var i = 0 ; i<10; i++){ console.log(i)};console.log(i); // 变量提升 返回10复制代码
示例:
// 1var Person = function(id,name){ this.id = di; this.name = name;}var user1 = new Person(1,"web");// 2var web1 = {id:1,name:"web"};var web2 = Object.create({id:2,name:"web"});复制代码
创建正则表达式
使用一个正则表达式字面量:
let reg = /ab+c/;let reg = /^[a-zA-z]/gi;复制代码
字符串方法
正则对象方法
RegExp对象方法
[a-z]匹配小写字母从a到z中的任意一个字符复制代码
[A-Z]匹配大写字母从a到z中的任意一个字符复制代码
[0-9]匹配数字0到9中任意一个字符,等于 \d复制代码
[0-9a-z]匹配数字0到9或者小写字母a到z中任意一个字符。复制代码
[0-9a-zA-Z]匹配数字0到9或小写a到z或大写A到Z中任意一个字符复制代码
[abcd]匹配字符abcd中的任意一个字符复制代码
[^a-z]匹配除小写字母a到z外的任意一个字符复制代码
[^0-9]匹配除数字0到9外的任意一个字符复制代码
[^abcd]匹配除abcd外的任意一个字符复制代码
元字符是拥有特殊含义的字符:
.查找单个字符,除了换行和行结束符。复制代码
\w查找单词字符。复制代码
\W查找非单词字符。复制代码
\d查找数字。复制代码
\D查找非数字字符。复制代码
\s查找空白字符。\S查找非空白字符。复制代码
\0查找 NUL 字符。\n查找换行符。\f查找换页符。\r查找回车符。\t查找制表符。\v查找垂直制表符。复制代码查找 NUL 字符。\n查找换行符。\f查找换页符。\r查找回车符。\t查找制表符。\v查找垂直制表符。复制代码
\xxx查找以八进制数 xxx 规定的字符。\xdd查找以十六进制数 dd 规定的字符。\uxxxx查找以十六进制数 xxxx 规定的 Unicode 字符。复制代码
量词描述
.定位符定位符可以将一个正则表达式固定在一行的开始或者结束,也可以创建只在单词内或者只在单词的开始或者结尾处出现的正则表达式。复制代码
^匹配输入字符串的开始位置复制代码
$匹配输入字符串的结束位置复制代码
\b匹配一个单词边界复制代码
\B匹配非单词边界复制代码
/^[\d]{4}-[\d]{1,2}-[\d]{1,2}${1,2}$]/日期字符复制代码
转义符使用转义符(反斜杠\)进行转义复制代码
new RegExp(str[, attr])接收2个参数,str是一个字符串,指定正则表达式匹配规则,attr可选,表示匹配模式,值有g(全局匹配),i(区分大小写的匹配)和m(多行匹配)。
表达式:g,i,mg 表示全局模式应用于所有字符串,而非在发现第一个匹配项就停止i 表示不区分大小写模式m 表示多行模式继续查找下一行中是否存在模式匹配的项复制代码
函数的实际参数会被保存在一个类数组对象 arguments 对象中,通过索引访问具体的参数:
var a = arguments[i]复制代码
onBlur:当失去输入焦点后产生该事件
onFocus:当输入获得焦点后,产生该文件
Onchange:当文字值改变时,产生该事件
Onselect:当文字加亮后,产生该文件
1.如果本文对你有帮助,就点个赞支持下吧,你的「赞」是我创作的动力。
《关于前端174道 JavaScript知识点汇总(一)》
《关于前端174道 JavaScript知识点汇总(二)》
《关于前端174道 JavaScript知识点汇总(三)》
《JavaScript ECMAScript语法概括【思维导图】》
《都2020年了,你还不会JavaScript 装饰器?》
《100个原生JavaScript代码片段知识点详细汇总【实践】》
《送你 43 道 JavaScript 面试题》
《70个JavaScript知识点详细总结(上)【实践】》
《70个JavaScript知识点详细总结(下)【实践】》
《3个很棒的小众JavaScript库,你值得拥有》
《Echa哥教你彻底弄懂 JavaScript 执行机制》
《3个很棒的小众JavaScript库,你值得拥有》
《几个非常有意思的javascript知识点总结【实践】》
《开源了一个 JavaScript 版敏感词过滤库》
《推荐7个很棒的JavaScript产品步骤引导库》
《一个合格的中级前端工程师需要掌握的 28 个 JavaScript 技巧》
作者:魔王哪吒
转发链接:
https://juejin.im/post/5e8089dde51d4546d72d2099