1. 基础调试代码
1.1 控制台打印
可以一次性输出多个值:
console.log(要输出的内容);
console.log(fun,10,100);
输出一个对象或者一个值的详细信息:
console.dir(要详细输出的内容);
console.dir(fun);
1.2 弹窗
alert(); 是在浏览器窗口中弹出一个提示框,提示框中输出指定的信息。提示框,如果点击是确定,返回值就是true,如果点击的是取消,返回值就是false。
var obj={name:"lili"};
alert(obj);
confirm();相对于alert来说,给用户提供了确定和取消两种选择
var res=confirm("你准备好了吗?");
console.log(res);
prompt();带输入框的提示框: 返回值,如果点击的是确定,返回的就是你输入的内容,如果点击是取消是null。
var res2=prompt("你是男孩还是女孩?");
console.log(res2);
1.3 页面输出
document.write("哈哈")
2. 堆(heap)栈(stack)内存
浏览器加载页面,运行代码的时候。每打开一个页面,就会从计算机的内存条中分配出两块内存:堆内存(heap)和栈内存(stack)。
-
堆内存(heap):主要存放引用数据类型的值,对象存储的就是键值对,如果是函数,把整个函数当成字符串进行存储。
-
栈内存(stack):给代码提供可执行的环境;存储基本数据类型的值。
思考题:
var a=12;
var b=a;
console.log(b);
var obj1={"name":"lili","age":12};
var obj2=obj1;
obj2.age=18;
console.log(obj1.age);
3. 代码自上往下执行 (之前还有一个变量提升阶段,会在后面的课程中进行讲解)
基本数据类型:存在栈内存中, 按值操作。
引用数据类型的值比较复杂,存在堆内存中,按引用地址的操作。
4. 赋值操作的三步曲:
-
先创建值。
-
再创建变量。
-
最后把创建的变量和值关联在一起。
练习题:
var a={
n:12
}
var b=a;
b={
n:13
}
console.log(a.n); //12
------------------------
var obj={
n:10,
b:obj.n*10
}
console.log(obj.b);//报错,因为obj还没有创建出来是无法访问他的属性的
3. 在JS中用来检测数据类型的四种方式
-
typeof
-
instanceof
-
constructor
-
Object.prototype.toString.call()
4. typeof 运算符详解
typeof 首先返回的是一个字符串,它返回的类型。
-
'number'
-
'string'
-
'boolean'
-
'undefined'
-
'object'
-
'function'
特点:
-
typeof null 的结果是 "object"(这个是浏览器的BUG:所有的值在计算中都已二进制编码存储浏览器中把前三位是000的当做对象,而null的二进制前三位就是000,所以被识别为对象。
-
typeof 普通对象/数组对象/正则对象... 结果都是"object",这样就无法基于typeof区分是普通对象还是数组对象等了。
-
两个以上的typeof 结果都是“string”。
typeof 12 ===> "number"
typeof "zhufeng" ====> 'string'
typeof false ===>'boolean'
typeof true ====> 'boolean'
typeof null ====> 'object'
typeof undefined ====>'undefined'
typeof [1,2] =====>"object"
typeof function(){} ===>"function"
typeof [] =====>"object"
typeof typeof [] ====> 'string'
typeof typeof typeof typeof typeof [] ====> 'string'
5.条件语句(实现分支结构)
5.1 单向分支 if
if (表达式) {
code...
}
5.2 双向分支 if...else
if (表达式) {
code...
} else {
code...
}
5.3 多向分支 if... else if
if (表达式) {
code...
} else if (表达式) {
code...
} else if (表达式) {
code...
} else {
code...
}
5.4 多向分支 switch...case
一个变量在不同值情况下的不同操作,我们可以改写为 switch case 判断。(他只能应用于等于什么值做什么事情,不能用户大于或者小于啥值做啥)。
switch (值) {
case 可能的值: code....; break;
//=>每一种情况结束都要设置break(以供当此条件成立并处理完事情后,通知代码不在向下执行)
case 可能的值: code....; break;
//每一种case情况都是基于 === 进行比较的(严格比较,需要保证数据类型的一致)
case 可能的值: code....; break;
case 可能的值: code....; break;
default: code....; //=>等价于else,而且最后一个判断结束无需设置break
}
var num = 6;
switch (num) {
case 5:
num++;
break;
case 6:
num--;
// break;
case 7:
num--
// break;
default:
num = 0;
}
console.log(num);
注意!!!
如果忘记写break,无论你是否满足case的要求,都会往下执行一直到遇到breake或者default结束。
5.5 分支结构嵌套
if (表达式) {
if (表达式) {
code....
}
code ...
} else {
code...
}
6. 循环语句(实现循环结构)
6.1 while 循环
while (循环条件) {
code...
}
6.2 do...while循环
do {
code...
} while (循环条件)
6.3 for 循环
for (循环变量; 循环条件; 循环变量变化) {
code ...
}
//循环输出 0-10
for (var i = 0; i <= 10; i ++) {
console.log(i)
}
6.4 跳转语句
-
break语句结束整个循环。
-
continue语句结束当前循环。
-
return语句返回函数值(后面看)。
for(var i=0;i<10;i++){
if(i<5){
i++;//
continue;
}
if(i>7){
i+=2;
break;
}
i+=1;
}
console.log(i);//10
-------------------------------
for(var i=1;i<=10;i+=2){
if(i<=5){
i++;//
continue;
}else{
i-=2;
break;
}
i--;
console.log(i);
}
console.log(i);//5
-------------------------------
for (var i = 0; i < 10; i++) {
console.log(i);
break;
}
console.log(i);//0
6.5 i++和++i的理解
++在前,正常运算。
++在后,先赋值,后+1。
var i = 5;
var b=i++;
console.log(b);//5
<script>
var a = 15, //16 17
b = 25,//24 23 22 21
c = 10,//9 8 7 6
d = 6;//7 8
// 15 25 9 7 24 8
var resultA = a++ + b-- + --c + ++d + b-- + --c; //88
// 16 23 7 8 22 6
var resultB = a++ + b-- + --c + ++d + b-- + --c; //82
document.write(resultA)
document.write(`<br>`)
document.write(resultB)
</script>
6.6 三元运算
语法:条件表达式 ? 条件成立执行的语句 :条件不成立执行的语句
var num=5
if(num>=5){
num++
}else{
num--
}
改写成三元运算符
num>=5?num++:num--
特殊情况:条件成立,我想做一件事情,不成立我什么都不做,可以用 undefined / null /void 0来做占位符。
var num=5;
num>=5?num++:undefinde;
num>=5?num++:null;
num>=5?num++:void 0;
多条语句:如果条件成立之后,想同时执行多条语句,我们可以用“小括号”把执行语句包起来,并且语句与语句之间用“逗号”进行分割。
var num=5;
var a=3;
num>=5?(num++,a--):null;
练习:
<script>
var num = 12;
let num2 = num > 0 ? (num < 10 ? num++ : num--) : (num == 0 ? (num++, num / 10) : null)
document.write(num2);
</script>
7. 条件判断里面的相互转换规则
7.1 ==和===
-
==先将不同的类型转换成相同的类型,在进行比较,如果值相等,就相等。
-
===值和数据类型相等才相等。
注意特殊的!!!!
对象和对象比较看引用地址 。
对象和字符串,先将对象转为字符串,再比较。
console.log(""== 0);//""--->0 ==> true
console.log(null == undefined);//true
console.log(arr == arr2);//false
console.log(arr == arr3);//true
console.log(arr2 == arr3);//false
console.log([] == "");//true []---""
console.log({} == "");//false {}--"[object object]"
console.log([10] == “10");//true [10]---"10"
console.log([10,20] == “10 20");//false [10,20]---"10,20"
7.2 ==和!=,===和!==
-
对象==数字类型的时候,都先转换为数字,再比较。
-
对象==字符串类型的时候,把对象转换为字符串,再进行比较。
-
对象==布尔数据类型的时候,都先转换为数字,在比较。
-
数字==字符串,都先转换数字类型,再比较。
-
数字==布尔,都先转换为数字类型,再比较。
-
字符串==布尔,都先转换为数字类型,再比较。
总结:对于不同的数据类型转换规律:
1)对象和字符串比较的时候,是对象先转为字符串然后再进行比较。
2)除了第一种,不同数据类型比较都是先转换为number数字,再进行比较。
特殊情况总结:
null == undefined true
nul l=== undefined false
null 和 undefined 和其它值永远不相等。
NaN 和其它值永不相等。
// 1 == 1
console.log(1 == true);//true
// 1 == 0
console.log(1 == false);//false
// 2 == 1
console.log(2 == true);//false
// 0 == 1
console.log([] == true);//false
// !真 == 真 同类型的比较
console.log(![] == true);//false
//同类型的比较,数组地址不一样
console.log([] == []);//false
console.log(1 != true);//false
console.log(null !== undefined);//true
8. 与或非
&&(与):全为真,才为真。
||(或):全为假,才为假。
// 逻辑短路
var a = 10,
b = 20,
c = 30;
if(--a > 5 || ++b > 20 || c-- > 20){
console.log("通过")
}else{
console.log("不通过")
}
console.log(a,b,c);
答案:通过,a=9,b=20,c=30
--------------------------------------
var a = 10,
b = 20,
c = 30;
if(--a > 5 && ++b < 20 && c-- > 20){
console.log("通过")
}else{
console.log("不通过")
}
console.log(a,b,c);
答案:不通过,,a=9,b=21,c=30
9. 相关知识铺垫
9.1 元素包含的常用属性
-
className: 存储的是字符串,代表当前元素的类名。
-
id: 存储的是字符串,代表当前元素的id名。
-
innerHTML:存储当前元素的所有内容,包含标签。
-
innerText:存储当前元素的文本内容。
-
style:存贮当前元素的所有行内样式。
-
onclick:点击事件属性。
-
onmouseover:鼠标滑过事件。
-
onmouseout:鼠标离开事件。
9.2 通过id 获取一个元素
通过id 获取一个元素:document.getElementById("id名字")
<div id="box1">box1</div>
<script>
var Obox1=document.getElementById("box1");
console.log(Obox1)
</script>
9.3 通过标签名去获取一类标签
通过标签名去获取一类标签:[context].getElementsByTagName;
var olis=document.getElementsByTagName("li"); // 获取文档中左右的li标签
var box1=document.getElementById("box1");
var lis=box1.getElementsByTagName("li");// 获取box1 下面所有的li元素
9.4 通过style属性去添加或者修改元素的样式
<div id="box1">box1</div>
<script>
var Obox1=document.getElementById("box1");
Obox1.style.backgroundColor="pink";
</script>
9.5 给元素添加类名
var Obox1=document.getElementById("box1");
Obox1.className="current";
10. 开关灯案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{
margin:0;
padding:0;
}
body{
background:darkturquoise;
}
#main{
width:300px;
border:1px solid green;
margin:0 auto;
}
#button{
width:100%;
height:50px;
background:lightblue;
text-align: center;
}
#imgbox{
display:block;
}
</style>
</head>
<body>
<div id="main">
<button id="button">隐藏</button>
<img id="imgbox" src="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577444372587&di=1684c649c2b1d4b1fdcd5910968c508b&imgtype=0&src=http%3A%2F%2Fimg.pconline.com.cn%2Fimages%2Fupload%2Fupc%2Ftx%2Fpcdlc%2F1709%2F16%2Fc79%2F59427944_1505500668556.gif" alt="">
</div>
</body>
</html>
<script>
/*
默认:图片是显示的,按钮的内容 隐藏
点击按钮的时候,如果按钮原来是隐藏,
+ 按钮内容变成“显示”
+ 图片消失
点击按钮的时候,如果按钮是显示,
+ 按钮内容变成“隐藏”
+ 图片显示
*/
var button=document.getElementById("button");
var oimg=document.getElementById("imgbox");
button.onclick=function(){
var value=button.innerText;
if(value=="隐藏"){
button.innerHTML="显示";
oimg.style.display="none";
}else{
button.innerHTML="隐藏";
oimg.style.display="block";
}
}
</script>
11. 案例之隔行变色
如果每隔三行实现一个变色,就是.main>li:nth-child(3n+1) .main>li:nth-child(3n+2) .main>li:nth-child(3n)12
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{
margin:0;
padding:0;
}
ul,ol{
list-style: none;
}
body{
background:lightseagreen;
}
.main{
width:500px;
/* border:1px solid #000; */
margin:50px auto;
color:#666;
}
.main>li{
height:40px;
line-height:40px;
text-indent: 20px;
}
.main>li:nth-child(even){
background:yellow;
}
.main>li:nth-child(odd){
background:lightgreen;
}
.main>li:hover{
background:lightblue;
}
</style>
</head>
<body>
<ul class="main">
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
</ul>
</body>
</html>
12. js实现奇偶行变色
分析:隔行变色的原理:
操作的元素:li ,
让 处于奇数的li 变一个颜色1
让 处于偶数行的li 变一个颜色2
12.1 方法一: 通过style行内属性来改变
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
ul,
ol {
list-style: none;
}
body {
background: lightseagreen;
}
#main {
width: 500px;
/* border:1px solid #000; */
margin: 50px auto;
color: #666;
}
#main>li {
height: 40px;
line-height: 40px;
text-indent: 20px;
}
</style>
</head>
<body>
<ul id="main">
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
<li>走在前沿的专家级课程:微信小程序实战开发课程</li>
</ul>
<script>
var omain = document.getElementById("main");
console.log(omain)
var lis = omain.getElementsByTagName("li");
for (var i = 0; i < lis.length; i++) {
if (i % 2 != 0) {
lis[i].style.backgroundColor = "yellow";
} else {
lis[i].style.backgroundColor = "pink";
}
}
</script>
</body>
</html>
12.2 方法二:通过添加类名
<style>
.color1{
background:lightsalmon;
}
.color2{
background:yellow;
}
</style>
for(var i=0;i<lis.length;i++){
if(i%2!=0){
lis[i].className="color1";
}else{
lis[i].className="color2";
}
}
全部用js实现,隔行变色,并且鼠标滑上去的时候,改变颜色,鼠标离开之后,还原原有的颜色
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
*{
margin:0;
padding:0;
}
li{
height:30px;
line-height: 30px;
}
</style>
</head>
<body>
<ul class="main" id="main" style="background:blue">
<li>1</li>
<li>2</li>
<li>3</li>
<li>4</li>
<li>5</li>
</ul>
</body>
</html>
<script>
/*
原理:获取到所有的li元素,如果这个li是偶数我们就让它是一个颜色,如果不是偶数就是另一个颜色
*/
var omain=document.getElementById("main");
var lis=omain.getElementsByTagName("li");
for(var i=0;i<lis.length;i++){
if(i%2==0){
lis[i].style.background="blue";
}else{
lis[i].style.background="yellow";
}
// 鼠标滑上li的时候,改变那个li的背景颜色
lis[i].onmouseover=function(){
// 把原有的颜色绑定上去
this.bgColor=this.style.backgroundColor;
this.style.background="lightpink";
}
// 鼠标离开的时候,恢复原有的颜色
lis[i].onmouseout=function(){
this.style.background=this.bgColor;
}
}
</script>
13. 阿里引发的一道血案面试题
let a={
n:1,
}
let b=a;
a.x=a={
n:2
}
console.log(a.x);
console.log(b)
连等赋值:是按照从右向左
var a=b=20;
// 第一步:先创建一个值
// 第二步:b=20
// 第三步:var a=20;