1.js的组成
核心(ECMAScript)、DOM、BOM
2.js的引入及写法
1.在head里插入script标签,引入外部js代码
2.在body标签最末尾引入script标签,直接在html内部书写js代码
在html标签后引入script,浏览器会自动修正,将script标签引入回body标签里(一般不这么引用,当页面需要植入内容时使用,但是会增加浏览器消耗)
几点注意:
变量污染:载入的js文件里变量或函数相同时,会覆盖
src地址里./代表当前文件夹,../代表上一级目录,引用外部js不要使用绝对路径,可以使用网址
head标签里的script有async defer(后面学习)
body里的js会污染head里引入的js,但是可以调用head里js的函数
3.标签里的javascript
<button onclick="console.log('aaaaa');" id='bn'>按钮</button>
<!-- 标签中行内JavaScript执行 -->
<button onclick="clickHandler()">按钮</button>
<a href="javascript:console.log('aaaaa')">超链接</a>
<!-- 不跳转 -->
<a href="javascript:void(0)">超链接</a> /*src没有这种用法*/
<script>
function clickHandler(){
console.log("aaaaa");
}
</script>
3.js注释和调试
注释可以让不用的代码不执行
注释可以用来解释代码的作用
1. ctrl+/ 行注释,注释一行的代码
2.shift+alt+a 块状注释
块状注释可以用来注释一行中的部分内容
块状注释可以用来注释掉一个函数和大量代码块
块状注释对于函数的注释说明在函数部分讲解
3.ctrl+shift+i控制面板里可以调试代码:
elements可查看html和css并修改,有断点,事件侦听,属性继承链(Properties,可查看一个标签有哪些属性)
console控制台
sources代码源,帮助排错,可设置断点
network是本地应用缓存
performance相当于录屏,网页崩溃时(内存泄漏)看看有哪些操作导致了
memory当前快照,当前页面系统内存占有
二、常用方法属性和变量
对象有两种模式,一种是属性,属性使用=赋值,一种是方法,方法需要()执行
1.方法
alert("你好");//将字符串以弹窗弹出,并且暂停到当前行
alert(message?:any):void
提示 message 参数名称 ?可以不写值 :any 这个参数的类型可以是任意的, :void 不返回任何值
var a=confirm("是否继续?");//弹出确定取消框
var s=prompt("你今年多大了?","20");//弹出输入框
document.write("10","20","30");*//文档中写入字符
document.write("<a href='#'>超链接</a>")
2.属性
document.body.innerHTML="你好"; document.body.innerHTML="<div></div>";
注意:document.write和innerHTML的区别
write仅属于document的方法,可以给整个文档中增加内容
innerHTML是所有body内(含body)标签的属性,可以给这些标签内局部增加内容和标签
3.变量
1.变量的赋值
a=b=3; //连等,先赋值给=号最左边的元素,再逐级向右 // =号左侧是变量名称,=号右侧是值 // 不需要定义,随手写,不需要类型(弱类型) // =号赋值也是有返回值 console.log(a=3);//结果为3 a=b=3; 相当于 a=(b=3); //代码遵从从左至右的执行方式 b=1; console.log(a=b++); //结果为1
2.变量的命名规则
1、变量必须驼峰式命名法
2、临时变量必须使用_起头,后面接驼峰式命名,
有时候也会在函数的参数中使用临时变量命名
var _a=3;
3、变量不可以使用关键词和保留字
var if=3; var public=10;//保留字 var static=20;
4、全局的变量名不能与window下的属性和方法同名
var alert=10;
console.log(alert);
alert("aaaa");
var status=10;
console.log(status);//返回字符型10,而非数字型
console.log(var a=3);//一旦使用var是不可以返回的
console.log(a=3); 没有使用var会被赋值的结果返回3
3.常量
const 常量是一旦定义值就不能改变值了 常量定义是名称必须全部大写,并且使用_区分单词 使用常量目的是不会被别人修改或者变量污染改变
const EVENT_ID="changes";
三、数据类型
1.字符型string
所有使用 '' "" ``都是字符型 string
var a="a"; var b='1'; var c=`true`; var d='你好这个非常"不错"'; console.log(a,b,c,d); console.log(typeof a); console.log(typeof(a));
2.数值型number
var a=3; var b=3.1; var c=-5; var d=-5.6; var e=0xFF;//16进制 var f=065;//8进制 var g=3.1e+5;//科学计数法 3.1*10(5)5次幂 var h=3.5e-5;//科学计数法 3.5*10(-5) -5次幂 console.log(typeof g,g); 定义的不一定和打印的结果完全相同,全部都会转换为10进制
3.布尔型boolean
<style>
div{
100px;
height: 100px;
}
</style>
<div id="div0"></div>
<script>
var div0=document.getElementById("div0");
var bool=true;//这就是布尔值;
div0.onclick=function(){
bool=!bool;//将bool取反,因为这个bool值的值域只有true和false
div0.style.backgroundColor=bool ? "red" : blue";
}
</script>
4.未定义undefined
var a;//仅定义变量未设置值 var b=undefined; //定义变量并且设置值为undefined; 值是相同的但是形态不同 console.log(a===b);//true var arr=[1,2,,undefined,3]; var a; // 用于全局定义,然后根据需要时赋值,初始是没有值的 var b=undefined //用于初始值必须是undefined,或者将原有有值的变量修改为undefined var x=10; x=undefined;
5.空值null
var a=null;
console.log(typeof a); //object对象类型
console.log(a===undefined);//false
//空值是将所有引用地址标记清空,用于清理内存 垃圾回收
var obj={a:1};
obj=null;
//字符类型,数值类型,布尔类型,未定义型都不需要null清除
6.对象类型object
var obj={};//空对象
obj=null;//将obj引用地址清空
var d="names";
obj={
// key:value关键词和值,对象不能出现重复的key,key不需要加""
a:1,
b:"ab",
"c":true, //变量作为key必须在外层增加[]
[d]:"xietian"
}
console.log(obj.a);//1
console.log(obj.b);//ab
console.log(obj.names);//xietian
console.log(obj[d]);//xietian
console.log(obj["a"]);//1
// 获取对象中key的值时有两种方法
// 一种是点语法,点语法使用范畴仅限于key属性固定,并且明确
// 另一种是[]语法,如果是固定的key,就使用字符串方式来设定,
// 如果不固定,直接[变量]就可以
四、数据类型转换
1.数值转字符串
String(a)、a.toString(16)、a.toFixed(2)、a.toExponential()、a.toPrecision()
var a=15.452;
var b=String(a);//类型强制转换
a=String(a);将a转换为字符串覆盖原有变量a
a=a+"";//利用隐式转换方式,没有强制转换,根据运算特征自动转换为字符串,隐式转换
// 隐式转换所使用的的转换方法是自动执行String(a);
// toString()实际上是Object对象的方法,因此,万物皆对象,任何类型都可以调用这个方法
a=a.toString(16);//参数必须是2-36之间,否则报错,转换为指定的进制数
console.log(a);
var color=0x0000FFFF;
var div0=document.getElementById('div0');
div0.style.color="#"+(color<<8).toString(16);
//toFixed(小数点位数) 转换为字符串,并且保留小数点位数,自动四舍五入
a=a.toFixed(2);
console.log(a);
a.toExponential();
a.toPrecision();
2.数值转换为布尔值
Boolean(a)
除了0以外所有的数值转换为布尔值都是true 0转换为布尔值是false var a=0; a=Boolean(a); console.log(a);
3.数值转换为对象
Object(a)
var a=0; a=Object(a);//数值型对象,存储在堆中 console.log(typeof a);
4.字符串转换为数值
Number(a)、parseInt(a,16)、parseFloat(a)
var a="a";
var a="3.2"
a=Number(a);//强制转换为数值类型
a=parseInt(a);//转换为整数
a=parseFloat(a);//转换为浮点数
var a="101";
a=parseInt(a,2);//将字符串转换为2进制
var color="FF0000";
color=parseInt(color,16);
console.log(color);
a=parseFloat();//不能转换进制
var b="32 1";
var b="32 "
b=Number(b);
b=parseInt(b);
b=parseFloat(b);
console.log(b);
//NaN 数值类型中的非数值
// 隐式转换遵从Number()转换方法
5.字符串转换为布尔值
Boolean(a)
// 仅空字符串转换为布尔值时,是false,除此之外全部是true var str=""; str=Boolean(str); console.log(str);
6.字符串转换为对象
Object(a)
var str="aaa"; str=Object(str); //转换为字符串对象 console.log(str); var str=" a a "; str=str.trim();//清除字符串前后空格 console.log(str);
7.布尔转换为数值
Number(a)
//true转换为1,false转换为0 var b=true; b=Number(b); console.log(b);
8.布尔转换为字符
转换后就是字符串true和false
9.布尔转换为对象
转换后就是布尔值对象
10.任何类型转换为布尔值
var a="";
var b=0;
var c=NaN;
var d=false;
var e=null;
var f=undefined;
//以上6种转换布尔值是false,其他都是true
var a="32a";
if(Number(a)){
}
//undefined null转换为字符串和数值
var a;
var b=null;
a=String(a);
b=String(b);
console.log(b);
a=Number(a);//转换为数值是NaN
b=Number(b);//转换为数值是0
a=parseInt(a);//NaN
b=parseInt(b);//NaN
console.log(a,b);
var a,b,c;
var a1=3,
b1=4,
c1="a",
d1=true;
var a=b=3;//尽量不要使用连等赋值
五、算术运算符
+ - * / %(取模运算符)
var a=3;
var b=5;
var s=a+b;
var s=a-b;
var s=a*b;
var s=a/b;
var s=b%a;
// 运算浮点数运算是会有误差
console.log(0.1+0.2); //0.300000004 用slice不能用toFixed
var bn0=document.getElementById("bn0");
var sum=1;
bn0.onclick=function(){
sum=sum+1;//先计算=号右边,完成后的结果赋值给等候左边
if(sum%2){
bn0.innerHTML="开";
}else{
bn0.innerHTML="关";
}
}
// 如果在算术运算符中前后出现字符串,并且使用+
// 必须使用字符串首尾相连的方式将内容连接
String() Number() Boolean() Object();
var a=3;//因为a不是字符串,所以就会隐式转换为字符串
var a="bbb";
var a=true;
var a;
var a=null;
var b="a";
console.log(a+b);
// 如果运算过程中没有使用字符串,使用+符号,
// 其他类型都会转换为数值,并且相加
var a=3;
var b=true;
var b;
var b=null;
var a;
var b=null;
var a=true;
var b=null;
console.log(a+b);//1
// 所有类型遇到 - * / %都会隐式转换为数值,然后运算的
var a="5";
var b=2;
console.log(a*b);//10
六、一元运算符和赋值运算符
var a=3;
var b=4;
var s=0;
console.log(s=a+b);//7
var a=3;
a+=7;//a=a+7; 7就是步长 step
console.log(a+=7);//17
var a=3;
a+="";
console.log(a);//字符串类型的3
//利用隐式转换完成字符串转换
var a=3;
a-=2;
console.log(a);//1
var a=3;
a*=2;//6
a/=2;//3
a%=2;//1
a+=a+1;//3
// 赋值运算符的优先级最低
var b=a+3+(a+=4)
console.log(b);//13
var a=3;
a<<=2;
console.log(a);//12
var a=1;
for(var i=0;i<5;i++){
a<<=1;
console.log(a);//2 4 8 16 32
}
var a=5;
a>>=1;
console.log(a);//2
// 一元运算符
var a=3;
a++;//3下一次运算才为4
a=a+1;//4
a+=1;//4
var a=3;
var b= (a=a+1) *3;//12
var b=(a++)*3;//先把a返回 9
var b=(++a)*3;//把a运算的结果返回 12
var s=1;
var d=s=s+1;
console.log(d);//2
a++;++a; 对于a来说,这两个公式运算结果都是相同
var a=1;
a++;
++a;
console.log(a);//2;
// 如果将a++或者++a作为返回值参与运算或者赋值时
// ++a 是+1以后的结果先参与运算或者赋值
// a++ 是将a先参与运算或者赋值
var a="3";
var b=a++;
// 对于++ 和 -- 通常都会直接使用算术运算来处理,
// 也就是说我们会将内容先隐式转换为数值,然后再运算
console.log(b);//数值型3
var a=3;
var b=a++ + a++ +a + a++ + a + a;//29
//3+8+16
var b=a+++(a+=a)+a++*2;
console.log(b,a);//27,9
七、关系运算符
// 关系运算是返回布尔值的一种运算表达式
var a=3;
var b=4;
var c=10;
console.log(a<b);
console.log(c+(a<b));//11
c+=a<b;
console.log(c);//11
var c=a>b ? 0 : 1; //1
var c=Number(a>b); //0
// 运算符 < > <= >=
// == 判断值是否相等 === 判断值和类型是否相等
//以后所有代码必须使用===
var a=3;
var b="3";
console.log(a==b);//自动隐式转换
// 优先隐式转换为数值,并且比较
console.log(""==false);//true
console.log(0=="");//true
console.log(0==false);/true
console.log(undefined==null);//因为两者都不是数据true
console.log(NaN==NaN);//false
var a="3a"; //isNaN 将这个字符串转换为数值后判断是否是NaN非数值
if(isNaN(a)){
console.log(123);//123
}
var a=0;
if(a==false){
console.log("aa");
// a-> 0 false ""
}
if(a===false){
console.log("aa");
// a-->false
}
if(!a){
console.log("aa");
// a-->0 null undefined false "" NaN
}
if(a==null){
// a-->undefined null
}
if(a===undefined){
//a-->undefined
}
// != !==
八、逻辑运算符
// && || !
var a=3;
var b=4;
console.log(a>0 && b<5);//true
// true && true = (第二个值)
// true && false = (第二个值)
// false && true = (第一个值)
// false && false = (第一个值)
console.log(3 && 0);//0
console.log(3 && 4);//4
console.log(0 && 4);//0
console.log(0 && "");//0
var a=1;
a=a-- && a++;
console.log(a);//0
// true || true = (第一个值)
// true || false = (第一个值)
// false || true = (第二个值)
// false || false = (第二个值)
var obj={a:2};
// 如果obj转换为布尔值是true,直接熔断
// 如果是false,取第二个值
obj=obj || {a:1};
console.log(obj);
class Box{
static _instance;
static getInstance(){
return Box._instance || (Box._instance=new Box());
}
}
var a=3;
var b=a===3 || 0;
console.log(b); //true
// ! 取反
var bool=false;
var bn=document.getElementById("bn");
bn.onclick=function(){
bool=!bool;//取反运算
bn.innerHTML=bool ? "开" : "关";
}
var a;
if(!a){
console.log(123);//123
}