<li class="example"><tag>实例1:if语句判断用户是否可以访问:<br></tag>
<label for="if">请输入你的年龄:</label> <input type="text" name="" id="if">
<button >提交</button>
</li>
<li class="example"><tag>实例2:switch语句判断用户是否可以访问:<br></tag>
<label for="switch">请输入你的年龄:</label> <input type="text" name="" id="switch">
<button >提交</button>
</li>
<li class="example"><tag>实例3:循环语句的应用:<br></tag>
<label for="for">请输入i:</label><input type="text" name="" id="for">
<button>提交</button>
</li>
<script>
var mytag = $(".example")
function judge(regobj,element){
$.each(mytag,function(i,d){
regobj.test(d.innerText)? d.append(element):console.log("匹配失败")
})
}
var regobj1 = new RegExp("实例8.1:if语句判断用户是否可以访问:","ig")
var span = $("<span></span>")
var jsonobj = {"text-indent":"4px","color":"red"}
$("#if+button").click(function(){
var ifage=$("#if").val()
if (ifage>=18) judge(regobj1,span.html('if语句').css(jsonobj)[0])
else judge(regobj1,span.html('青少年访问模式').css(jsonobj)[0])
})
var regobj2 = new RegExp("实例8.2:switch语句判断用户是否可以访问:","ig")
$("#switch+button").click(function(){
var switchage=Number($("#switch").val())
switch(switchage){
case 26:judge(regobj2,span.html('switch语句').css(jsonobj)[0]); break;
case 17:judge(regobj2,span.html('青少年不可访问').css(jsonobj)[0]); break;
default:judge(regobj2,span.html('switch语句').css(jsonobj)[0]);
}
})
var regobj3 = new RegExp("实例9:循环语句的应用:","ig")
$("#for+button").click(function(){
var i = Number($("#for").val())
switch(i){
case 1:
for( i=1;i<10;i++)
if(i**3==i) {
judge(regobj3,span.html(i).css(jsonobj)[0])
console.log(i)
}
break;
case 10:
for( i=10;i<100;i++)
if((i%10)**3+parseInt(i/10)**3==i){
judge(regobj3,span.html(i).css(jsonobj)[0])
console.log(i)
}
break;
case 100:
for(i=100;i<1000;i++)
if((i%10)**3+parseInt(i/10%10)**3+parseInt(i/100)**3==i){
judge(regobj3,span.html(i).css(jsonobj)[0])
console.log(i)
}
break;
}
})
</script>
二、函数
function.arguments
为当前执行的 function 对象返回一个arguments 对象。
functionName.caller
返回一个对函数的引用,该函数调用了当前函数。
2.1 函数与作用域
2.1.0 函数定义
function 函数名(参数列表){函数体;return 返回值}
;- 函数调用
函数名(参数列表)
2.1.1 注意
调用有参数的函数,但没有给其传值,函数一样可以运行,或者调用没有参数的函数,给其传值,该函数也一样运行。
说的简单点:只要写了函数名后面跟了一对小括号,该函数就会运行。那么传递的参数呢?
其实,在函数中有一个参数数组对象(arguments),该对象将传递的参数都封装在一个数组中。
例:
function demo()
{
alert(arguments.length);
}
demo(“hello”,123,true);
那么弹出的对话框结果是3,如果想得到所有的参数值,可以通过for循环遍历该数组。
for(var x=0; x<arguments.length; x++)
{
alert(arguments[x]);
}
为了增强阅读性,最好按照规范,按定义好的形式参数传递实际参数。
- 函数在调用时的其他写法:
var show = demo();
//show变量接收demo函数的返回值。
var show = demo;
//这种写法是可以的,意为show和demo代表同一个函数。
//那么该函数也可以通过show()的方式运行。
2.1.2 动态函数
通过Js的内置对象Function实现。
var demo = new Function(“x”,”y”,”alert(x+y);”);
demo(4,6);
如同:
function demo(x,y)
{
alert(x+y);
}
demo(4,6);
不同的是,动态函数,参数以及函数体都可以通过参数进行传递,可以动态指定。
2.1.3 匿名函数
- 匿名函数自执行:
(function (形参){})(实参);
- 定义变量接收匿名函数:
var fn=function (){};fn()
注:没有返回值的话 会是 undefined;没有传参的话 会默认传递 undefined
2.1.3 作用域
- 全局变量和全局函数:只要在函数外部使用 var 关键字定义的变量,或函数都是全局变量和全局函数,在任何地方都可以访问;所有省略 var 关键字定义的变量,一律是全局变量
- 局部变量/局部函数:在函数内部使用 var 关键字定义的变量为局部变量,函数内部定义的函数也为局部函数,只能在当前作用域中使用,外界无法访问
- 作用域链:局部作用域中访问变量或函数,首先从当前作用域中查找,当前作用域中没有的话,向上级作用域中查找,直至全局作用域
2.1.4 普通函数与作用域应用
<button onclick="f1() " >点击执行函数调用</button> <div id="dynamic1"></div>
<script>
function func1(a,b){return a>b?'函数1与三目':b}
var a = 10;
function func2(){
var a = 1;
$("#dynamic1").append(
$('<span style="margin: 10px 40px;color:red">
函数2内a='+a+'</span><br>')
);
}
func2()
console.log('执行函数3前a=',a)
function func3(){
a = 1;
$("#dynamic1").append(
$('<span style="margin: 10px 40px;color:red">
函数3内a='+a+'</span><br>')
);
}
func3()
console.log('执行函数3后a=',a)
function f1(){
$("#dynamic1").append($('<span style="margin: 10px 40px;color:red">'+func1(2,1)+'</span><br>'))
func2();
$("#dynamic1").append(
$('<span style="margin: 10px 40px;color:red">
函数2外a='+a+'</span><br>')
);
$("#dynamic1").append(
$('<span style="margin: 10px 40px;color:red">
函数3外a='+a+'</span><br>')
);
$("#dynamic1").append(
$('<span style="margin: 10px 40px;color:red">
函数3内a='+a+'</span><br>')
);
}
</script>
2.1.5 匿名函数的应用:闭包与作用域
<button onclick="f2()">点击执行函数调用</button> <div id="dynamic2"></div>
<script>
var a=1
function fun4(){
function inner(){a++;return a};
return inner()
}
function fun5(){
var a=10;
return function(){a++;return a};
}
function f2(){
$("#dynamic2").append(
$('<span style="margin: 10px 40px;color:red">
闭包函数4:a='+fun4()+'</span><br>')
);
$("#dynamic2").append(
$('<span style="margin: 10px 40px;color:red">
闭包函数5:a='+fun5()()+'</span><br>')
);
}
var b = 10
function f3(){
function inner(){
b = 1;console.log('执行闭包函数f3后b=',b)
}
return inner()
}
f3()
var c = 10
function f4(){
return function(){
var c=1;console.log('执行闭包函数f4后c=',c)
}
}
f4()()
function f5(){
console.log('this=',this)
}
f5()
f5.call({x:100})
f5.bind({x:200})()
</script>
闭包函数中作用域的查找规则:不是从执行函数中查找,而是从函数定义的地方查找,向上级作用域查找
注意:两者存在区别
function print(fn) {
const a = 200
fn()
}
const a = 100
function fn() {
console.log(a)
}
print(fn)
2.1.6 实际开发中闭包的应用
<script>
function createCache() {
const data = {}
return {
set: function (key, val) {
data[key] = val
},
get: function (key) {
return data[key]
}
}
}
const d = createCache()
d.set('a', 100)
console.log( d.get('a') )
</script>
2.2 分离绑定事件
- 查找元素var btn=document.getElementById();
- 函数返回元素节点列表;元素节点对象提供了以下属性来操作元素内容:innerHTML读取或设置元素文本内容,可识别标签语法、innerText设置元素文本内容,不能识别标签语法;
- 绑定事件
btn.onclick = function 函数名()/(){事件}
<button id="clk"
style="outline: 1px solid red;font-size: 20px;margin: 10px 40px;">
分离绑定事件
</button>
<script>
var clk = document.getElementById('clk');
clk.onclick = function (){
$("#clk").after(
$('<span style="margin: 10px 40px;color:red">
分离绑定事件</span><br>')
)
}
</script>
2.3 改变字体大小和颜色
<div class="overflow">
<div>
<a href="javascript:;" >大</a>
<a href="javascript:;">中</a>
<a href="javascript:;" class="focus">小</a>
</div>
<div>
<a href="javascript:;" >红</a>
<a href="javascript:;">绿</a>
<a href="javascript:;" class="focus">蓝</a>
<select name="" id="select">
<option value="">请选择</option>
<option value="red">红</option>
<option value="green">绿</option>
<option value="blue">蓝</option>
</select>
</div>
<div class="content">Lorem ipsum dolor sit amet consectetur adipisicing elit. Reiciendis delectus architecto quod adipisci ipsam fugiat ipsa necessitatibus minima provident, distinctio facere aliquid sequi quibusdam voluptas eum dignissimos repellendus ipsum officia!</div>
</div>
<script>
$.each($('.overflow a'),function(i,e){
if(i<3){
$(this).click(function(){
changeFontsize($(this).text())
})
}else{
$(this).click(function(){
alert($(this).text())
changeFontcolor($(this).text())
})
}
})
$('#select').change(function(){
$('.content').css('color',$(this).val())
})
function changeFontsize(etext){
switch(etext){
case "大":
$('.content').attr('style','font-size:32px');break
case "中":
$('.content').attr('style','font-size:22px') ;break
case "小":
$('.content').attr('style','font-size:18px') ;break
}
}
function changeFontcolor(etext){
switch(etext){
case "红":
$('.content').attr('style','color:red');break
case "绿":
$('.content').attr('style','color:green') ;break
case "蓝":
$('.content').attr('style','color:blue') ;break
}
}
</script>
三、类和继承
<script>
<!-- 类的定义 -->
class Person {
constructor(name,age){
this.name = name
this.age = age
}
say(){
console.log(`我是${this.name},今年${this.age}岁`)
}
wait(){
setTimeout(function f() {
console.log('setTimeout中this=',this)
})
}
}
class Dog {
constructor(name){
this.name = name
}
wait(){
setTimeout(
() =>{console.log('setTimeout中this=',this) }
)
}
}
</script>
<script>
<!-- 类的继承 -->
class Student extends Person {
constructor(name,age,major){
super(name,age)
this.major = major
}
learn(){
console.log(`我正在学习${this.major}`)
}
}
let zhangsan = new Person('张三',18)
zhangsan.say()
zhangsan.wait()
let jinmao = new Dog('大黄')
jinmao.wait()
let lisi = new Student('李四',19,'电子信息')
lisi.learn()
console.log(zhangsan.hasOwnProperty('learn'))
</script>
3.1 实例1:简易jQuery源码
<button class="btn">click me</button>
<script>
class jQuery {
constructor(selector){
const selectors = document.querySelectorAll(selector)
const length = selectors.length
for(let i=0;i<length;i++){
this[i] = selectors[i]
}
this.length = length
}
each(fn){
for(let i=0;i<length;i++)
fn(this[i])
}
on(type,fn){
return this.each(elem=>{
elem.addEventListener(type,fn,false)
})
}
}
const $btn = new jQuery('.btn')
console.log($btn)
$btn.on('click',() => {alert('clicked')})
</script>
3.2 实例2:深拷贝
<script>
const obj1 = {
age: 20,
name: 'xxx',
address: {
city: 'beijing'
},
arr: ['a', 'b', 'c']
}
console.log(deepClone(obj1))
function deepClone(obj = {}){
if (typeof obj !='object' || typeof obj == null) return obj
let result
if (obj instanceof Array) {
result = []
} else {
result = {}
}
for(let key in obj){
console.log(key,obj.hasOwnProperty(key))
if (obj.hasOwnProperty(key))
result[key] = deepClone(obj[key])
}
return result
}
</script>
四、数组
JS中提供了数组的包装对象Array,提供了数组处理相关的属性和方法。
Js中数组中的特点:可以存任意元素,长度是可变的。
Array对象提供的属性:
length:数组长度
4.1 定义js数组
var arrayObj = new Array(); //创建一个数组
var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长度
var arrayObj = new Array([element0[, element1[, …[, elementN]]]]); 创建一个数组并赋值
var arrayObj = [1,2,5,6,3];//数组直接量定义数组
4.2 遍历
for(var i in arr){document.write(i,arr[i])}
遍历数组中全部的值 获取到对应的索引
遍历数组的全部内容 ;
for(var i=0;i<length;i++){console.log(arr[i])}
如果对应索引的值为空 显示undefined;
4.3 方法
4.3.1 尾push(data);pop()
push(data)
在数组的末尾添加一个或多个元素,多个元素之间,使用逗号隔开,返回添加之后的数组长度;pop()
移除末尾元素返回被移除的元素
4.3.2 首unshift(data);shift()
unshift(data)
在数组的头部添加一个或多个元素,返回回添加之后的数组长度;shift()
移除数组的第一个元素返回被移除的元素
4.3.3 中:splice;slice(start, [end])
splice(index,num)
arr索引值为index的位置开始 返回的截取num个值splice(index,num,new_value1,new_value2)
索引值为index的位置开始,若index位置有值,则用new_value代替截取num个值,放在新数组中返回,若index位置无值,则从index位置开始添加new_value
slice(start, [end])
返回一个数组的一段。
- 转换:
toString()
将数组转换成字符串类型,返回字符串结果; join(param)
将数组转换成字符串,可以指定元素之间的连接符,如果参数省略,默认按照逗号连接,返回字符串;
4.3.4 concat([item1[, item2[, . . . [, itemN]]]])
返回一个新数组,这个新数组是由两个或更多数组组合而成的。
4.3.5 reverse()
反转数组,倒序重排, 返回重排的数组,注意该方法直接修改原数组的结构
4.3.6 sort()
对数组中元素排序,默认按照Unicode编码升序排列, 返回重排后的数组,直接修改原有数组
参数 : 可选,自定义排序算法
自定义降序
function sortDESC(a,b){
return b-a;
}
4.4 数组方法应用
<script>
var arr=[0,1,2,3,4];
document.write("arr=",arr,"<br>")
var arr = new Array(5,6,7)
document.write("arr=",arr,"<br><br>")
document.write('arr[arr.length-1]=',arr[arr.length-1],"<br>")
arr[10]=6;document.write("arr[10]=6修改后arr=",arr,"<br><br>")
for(var i=0;i<arr.length;i++){document.write(i,' ',arr[i],"<br>")}
for(var i in arr){document.write(i,' ',arr[i]),";"}
arr.push(8); document.write("<br>arr=",arr,"<br>")
arr.pop();document.write("arr=",arr,"<br>")
arr.unshift(0); document.write("arr=",arr,"<br>")
arr.shift();document.write("arr=",arr,"<br><br>")
var arr = [1,2,3,4,5];
var res = arr.splice(2,2);
document.write("res=",res,"<br>");
document.write("arr=",arr,"<br><br>");
var arr = [1,2,3,4,5];
var res = arr.splice(2,2,'?','?');
document.write("res=",res,"<br>");
document.write("arr=",arr,"<br><br>");
var arr = [1,2,5];
document.write("arr=",arr,"<br>");
arr.splice(2,0,3,4);
document.write("arr=",arr,"<br><br>");
document.write("str1=",arr.toString(),"<br>")
document.write("str2=",arr.join('-'),"<br><br>")
arr.sort(sortdsc);function sortdsc(a,b){return b-a};document.write("arr=",arr,"<br><br>")
function getnorepeatarr(arr,len){
res = [];
var sortrandom = function (){ return 0.5-Math.random()}
arr.sort(sortrandom);
for(var i=0;i<len;i++){
res.push(arr[i])
};
return res }
document.write("res=",getnorepeatarr([0,1,2,3],4))
、
</script>
<hr>
4.5 实例:从十张图片中随机显示五张
<div class="example"><tag>实例13:从十张图片中随机显示五张</tag> </div>
<div>
<img src="" alt="" class="img">
<img src="" alt="" class="img">
<img src="" alt="" class="img">
<img src="" alt="" class="img">
<img src="" alt="" class="img">
</div>
<script>
var arr = [];
while(arr.length<5){
var i = parseInt(Math.random()*10)
if(arr.indexOf(i)<0) arr.push(i)
}
console.log(arr)
$('.img').each(function(i,e){
$(this).attr('src',`imgs/bk${arr[i]}-8.jpg`)
})
</script>
五、字符串
String对象提供的属性:
length:数组长度
5.1 创建和属性
var str1 = 'abcd';
var str2 = new String("abcd")
5.2 方法
5.2.1 toUpperCase() /toLowerCase()
转换大小写;返回转换后的字符串,不影响原始字符串
5.2.2 charAt(index)/charCodeAt(index))
获取字符/字符编码获取指定下标的字符/获取指定下标的字符编码;参数为指定的下标,可以省略,默认为0
5.2.3 indexOf(str,fromIndex)
根据字符串找索引值获取指定字符的下标,从前向后查询,找到即返回
参数 :
str 表示要查找的字符串,必填
fromIndex 表示起始下标,默认为0
返回指定字符的下标,查找失败返回-1
5.2.4 lastIndexOf(substring[, startindex])
返回 String 对象中子字符串最后出现的位置。
5.2.5 substring(startindex,endindex)
根据指定的索引范围截取字符串,startIndex ~ endIndex-1
5.2.6 substr(startindex,length)
根据索引startindex截取指定length的字符串
5.2.7 split(param)
将字符串按照指定的字符进行分割,以数组形式返回分割结果
参数 : 指定分隔符,必须是字符串中存在的字符,如果字符串中不存在,分割失败,仍然返回数组
5.2.8 match(rgExp)
使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。
5.2.9 replace(rgExp, replaceText)
返回根据正则表达式进行文字替换后的字符串的复制。
5.2.10 search(rgExp)
返回与正则表达式查找内容匹配的第一个子字符串的位置。
5.2.11 slice(start, [end])
返回字符串的片段。
5.3 字符串方法应用:获取用户名和服务商
<input type="text" placeholder="请输入邮箱地址" id="email">
<button id="btn2">获取用户名和服务商</button>
<table>
<thead><tr><th>用户名</th> <th>服务商</th> </tr></thead>
<tbody id="tbd"></tbody>
</table>
<script>
var email = document.getElementById('email')
var btn2 = document.getElementById('btn2')
var tbody= document.getElementById('tbd')
btn2.onclick = function(){
var str = email.value
var arr = str.split('@')
var html='<tr>'+'<td > '+arr[0]+'</td>'+ '<td >'+arr[1]+' </td>'+'</tr>'
tbody.innerHTML=html }
</script>
六、正则表达式对象(Regular Expression)
属性lastindex可读可写,表示下一次匹配的起始索引br
- 默认情况下,正则表达式对象不能重复调用方法,如果重复调用,结果会出错:由于 lastIndex 保存再一次匹配的起始下标,重复调用时,不能保证每次都从下标0开始 验证,可以手动调整 lastIndex 为 0。
- 只有正则对象设置全局匹配 g ,该属性才起作用
6.1 创建
var reg1 = /字符模式/修饰符;<br>修饰符 :
i : ignorecase 忽略大小写
g : global 全局范围
var reg2 = new RegExp('匹配模式','修饰符');
正则表达式对象可以接收一个变量;
6.2 方法
6.2.1 reExp.test(str)
验证目标字符串str中是否存在满足正则匹配模式reg的内容,存在则返回true,
不存在返回false参数为要验证的字符串
6.2.2 rgExp.exec(str)
用正则表达式模式在字符串中运行查找,并返回包含该查找结果的一个数组。
6.2.3 str.match(regExp/subStr)
作用 : 查找字符串中满足正则格式或满足指定字符串的内容
返回 : 数组,存放查找结果,替换
6.2.4 str.replace(regExp/subStr,newStr)
作用 : 根据正则表达式或字符串查找相关内容并进行替换
返回 : 替换后的字符串,不影响原始字符串
6.3 正则表达式应用
<input type="text" id="keyword"><button id="btn">查找</button>
<div >
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Perspiciatis laudantium maiores voluptate. Iure, unde repudiandae molestiae eos doloribus fugit at voluptate earum ad reprehenderit magnam, nesciunt eligendi amet ullam repellendus.
</div>
<script>
var key = document.getElementById('keyword')
var btn = document.getElementById('btn')
var p = $("#btn+div")
btn.onclick = function(){
var reg = new RegExp(key.value,'ig')
var str = p.html()
console.log(str)
console.log(str.match(reg))
console.log(reg.test(str))
var res = str.replace(reg,'<tag >'+key.value+'</tag>')
reg.test(str)? res : (res =str)
p.html(res)
$("#btn+div>tag").css("color","red")
}
</script>
七、Math对象
- Math对象主要提供一些列数学运算的方法
- 属性 Math.PI圆周率, Math.E自然对数;
- 方法:
Math.random()随机0-1;
Math.ceil(x)对x向上取整,忽略小数位,整数位+1;
Math.floor(x)对x向下取整,舍弃小数位,保留整数位;
Math.round(x)对x四舍五入取整数
Math.abs(number)
返回数字的绝对值。
Math.exp(number)
返回 e(自然对数的底)的幂。
console.log(parseInt(Math.random()*10))
console.log(Math.floor(Math.random()*10))
console.log((function(n){return parseInt(Math.random()*n)+1})(9))
console.log(Math.floor(Math.random() * (n)));
console.log(Math.floor(Math.random() * n + 1));
八、时间对象
- 创建:
· var now = new Date()·//Wed Nov 11 2020 18:46:05 GMT+0800 (中国标准时间)
- 方法
getTime():读取或设置当前时间的毫秒数;
getFullYear()//年
getMonth()//月份从0开始
getDate()//某月的第几日
getDay()//星期几
九、Global对象
是一个内部对象,目的是把所有全局方法集中在一个对象中。
Global 对象没有语法。直接调用其方法。
eval(codeString)
十、JSON对象
JSON本质上就是一段字符串,能够保存较复杂关系的数据,具有良好的数据保存格式,又极为轻量,加之多种代码平台都支持对字符串的处理,所以我们可以使用JSON字符串进行数据的传入,甚至跨平台传输。
data = {
name:"zs",
age:19,
addr:["bj,sh,gz"],
wife:[
{name:"苏荃",age:40,job:["教主夫人","大大老婆"]},
{name:"建宁",age:20,job:["公主","小老婆"]},
]
}
查看当前JSON中第二个wife的工作
data[“wife”][1][“job”];
十一、自定义对象
除了js内置的对象,也可以自己定义对象。
11.1 构造函数定义对象1
function Person()
{
}
var p = new Person();
p.name = “zhangsan”;
p.age = 20;
p.run = function()
{
alert(“run”);
}
p.run();
11.2 构造函数定义对象2
function Person(name,age)
{
this.name = name;
this.age = age;
}
var p = new Person(“zhangsan”,20);
11.3 对象直接量
var obj = {name:”张”,age:19,run:function(){alert(“run”)}};
十二、JS对象操作
12.1 with语句:with(对象){}
with语句定义了某个对象的作用域,在该域中可以直接调用该对象的成员。
- 格式:
with(对象) {}
- 应用:当调用一个对象中多个成员时,为了简化调用,避免”对象.”这种格式的重复书写。
var p = new Person(“zhangsan”,20);
alert(p.name+”,”+p.age);
可以写成:
var p = new Person(“zhangsan”,20);
with(p)
{
alert(name+”,”+age);
}
12.2 for…in语句
用于遍历对象属性。
var p = new Person(“zhangsan”,20);
for(x in p)
{
alert(x);
alert(x+”:”+p[x]);
可以得到属性与属性的值。p[x]:p对象就是个数组,
要通过指定的元素名获取元素的值。
}
12.3 delete语句
删除对象的属性
var p = {name:"liubei",age:19}
p.addr = "peixian";
alert(p.addr);
delete p.addr;
alert(p.addr);