一、JavaScript的组成
核心:ECMAScript(为了可以让所有浏览器都使用js,我们定义了一个标准
ECMAScript,各大浏览器都必须按照这个标准来渲染页面)
文档对象模型:DOM
浏览器对象模型:BOM
二、JavaScript的引入及写法
对于html来说,从上向下同步解释性文档,上面的代码无法调用下面的标签或者script
内部书写
在html文件中直接进行代码的书写
1、位于 head 部分的脚本:
当你把脚本放置到 head 部分后,必须等到全部的javascript代码都被下载、解析和执行完成后,才能开始呈现页面的内容(浏览器在遇到body标签才开始呈现内容)。
2、位于 body 部分的脚本:
为了避免上述问题,现代web应用程序一般把javascript引用放在body中,放在页面内容后面。这样,在解析包含的javascript代码之前,页面内容将完整呈现。
外部引入
载入外部js,可以在head和body部分,一般将外部js在head部分引入<script src="路径名"></script>
路径名为当前文件夹./(都要加上)../上一级目录
如果加载的js中,变量或者函数相同时,就会覆盖,叫做变量污染
直接写在标签内
<p onclick="alert('你好');">点击我</p>
<!-- 不跳转 -->
<a href="javascript:void(0)">超链接</a>
三、注释
1、可以让不用的代码不执行
2、可以用来解释代码的作用,
单行注释
ctrl+/ 行注释,注释一行的代码
块注释
shift+alt+a 块级/多行注释
1、可以用来注释一行中的部分内容
2、可以用来注释掉一个函数和大量代码块
## 四、调试 浏览器调试 ctrl+shift+i
五、常用方法
js语言每行结束时必须使用;结束,必须是半角
js代码中大小写必须严格按照规定
方法一般包括 方法名(参数...).都必须是英文半角
js是点语法,表示某个对象的方法和属性
控制台输出
var name = 'Petter';
// 1、输出字符串
console.log('Hello, world!');
// "Hello, world!"
// 2、输出变量
console.log(name);
// "Petter"
// 3、输出变量/字符串
console.log('Hello, ' + name + '!');
// "Hello, Petter!"
页面输出
document.write("Hello,word!");
write仅属于document的方法,可以给整个文档增加内容
document.body.innerHTML="hello,world"
innerHTML是所有body内(含body)标签的属性,可以给这些标签内局部增加内容和标签
赋值,对象的属性需要赋值
对象有两种模式,一种是属性,属性的使用=赋值,一种是方法,方法需要()执行
提示框输出
alert("hello,word!");
alert(message?:any):void
提示 message 参数名称 ?可以不写值 :any 这个参数的类型可以是任意的, :void 不返回任何值
将字符串以弹窗弹出,并且暂停到当前行
将window省略了,window.alert();
确认框
confirm("您确定要退出吗?");
弹出确定取消框
输入框
prompt("请输入您的名字");
六、变量
ES5之前
window.a = 3;
a = 3;
a=b=3;连等,先赋值给=号最左边的元素,再逐级向右。=号左侧是变量名称,=号右侧是值。不需要定义,随手写,不需要类型(弱类型)。=号赋值也是有返回值
a=b=3; a=(b=3); 代码遵从从左至右的执行方式
ES5 不允许直接使用变量的赋值
var a = 3;定义变量,如果不使用var声明,那就这个变量就一定是window的属性。而在函数以外的地方使用var声明也是设置了window的属性
变量的命名:
1、一般首字母都是小写,除了类。都是用法驼峰式命名规则
2、临时变量必须使用_起头,后面接驼峰式命名,有时也会在函数的参数中使用临时变量命名 var _a=3;
3、变量不可以使用关键字和保留字
关键字 :break do instanceof typeof case else new var catch finally return void continue for switch while function this with default if throw delete in try
保留字:abstract int short boolean export interface static byte extends long super char
final native class float
throws const goto private
double import public
4、全局变量名不能与window下的属性和方法同名
ES6
let 变量
const
常量 变量是定义后可以变化值的,常量是一旦定义值就不能改变值了,常量定义是名称必须全部大写,并且使用_区分单词,使用常量目的是不会被别人修改或者变量污染改变 const EVENT_ID="changes";
七、数据类型
数据的分类:(字符类型,数值类型,布尔类型,未定义型,空值,) 基本数据类型 (对象型) 复杂数据类型
1、字符型 string
所有使用 '' "" ``都是字符型
2、数值型 number
小数叫做浮点数
// 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次幂
定义的不一定和打印的结果完全相同,全部都会转换为10进制
3、布尔类型 boolean
true,false 对和错,是和否,还可以认为是任何事情的两面
4、未定义值 undefinded
var a;仅定义变量未设置值
var b=undefined; 定义变量并且设置值为undefined;
值是相同的但是形态不同
var a;用于全局定义,然后根据需要时赋值,初始是没有值的
var b=undefined 用于初始值必须是undefined,或者将原有有值的变量修改为undefined var x=10; x=undefined;
5、空值 null
var a = null;
console.log(typeof a);//object
空值是将所有引用地址标记清空,用于清理内存 垃圾回收
var obj={a:1};
obj=null;
// 字符类型,数值类型,布尔类型,未定义型都不需要null清除
6、对象类型
获取对象中key的值时有两种方法
一种是点语法,点语法使用范畴仅限于key属性固定,并且明确
另一种是[]语法,如果是固定的key,就使用字符串方式来设定,
如果不固定,直接[变量]就可以
var d="names";
obj={
// key:value//关键词和值
// 对象不能出现重复的key
// key不需要加""
a:1,
b:"ab",
"c":true,
// 变量作为key必须在外层增加[]
[d]:"xietian"
}
console.log(obj.a);
console.log(obj.b);
console.log(obj.names);
console.log(obj[d]);
console.log(obj["a"]);
八、数据类型转换
数据类型的转换分为强制转换和隐式转换两种
数值类型转其他
1、数值转字符串
var a = 3.1415;
var b = String(a);//类型强制转换
a=String(a);//将a转换为字符串覆盖原有的变量a
a = a + "";//利用隐式转换方式,没有强制转换,根据运算特征自动转换为字符串,隐式转换
隐式转换所使用的转换方法是自动执行String(a)
toString()实际上是Object对象的方法,因此,万物皆对象,任何类型都可以调用这个方法
a=a.toString(16);//参数必须是2-36之间否则报错;转换为指定的进制数
toFixed(小数点位数) 转换为字符串,并且保留小数点位数,自动四舍五入
toExponential(num)必需。规定指数计数法中的小数位数,是 0 ~ 20 之间的值,包括 0 和 20,有些实现可以支持更大的数值范围。如果省略了该参数,将使用尽可能多的数字。
toPrecision(num)num为数字长度,把数字格式化为指定的长度
2、数值转换为布尔值
除了0以外的所有值转换为布尔值都是true,0转换为布尔值是false
3、数值转换为对象
var a = 0;
a = Object(a);//数值型对象,储存在堆中
字符串类型转其他
1、字符串转换为数值
var a = "3.2"
a = Number(a);//强制转换为数值类型
a = parseInt(a);//转换为整数
a = parseFloat(a);//转换为浮点型
var a = "101";
a=parseInt(a,2);//将字符串转换为2进制,输出为十进制
a = parseFloat();//不能转换进制
var a = "a";
a = Number(a);
console.log(a);//NaN 数值类型中的非数值
隐式转换遵从Number()转换方法
2、字符串转换为布尔值
仅空字符串转换为布尔值时,是false,除此之外全部是true
3、字符串转换为对象
var str="aaa";
// str=Object(str);
// 转换为字符串对象
// console.log(str);
// var str=" a a ";
// str=str.trim();//清除字符串前后空格
布尔值转其他
1、布尔值转换为数值
true转换为1,false转换为0
2、布尔转换为字符
转换后就是字符串true和false
3、布尔转换为对象
转换后就是布尔值对象
任何类型转换为布尔值
//var a="";
//var b=0;
//var c=NaN;
//var d=false;
//var e=null;
//var f=undefined;
//以上6种转换布尔值是false,其他都是true
undefined null转换为字符串和数值
//var a;
//var b=null;
//a=String(a);undefined
//b=String(b);null
//console.log(b);
//a=Number(a);//转换为数值是NaN
//b=Number(b);//转换为数值是0
//a=parseInt(a);//NaN
//b=parseInt(b);//NaN
//console.log(a,b);
尽量不要使用连等赋值
九、运算符
算术运算符 + - * / %(取模运算符)
运算浮点运算会有误差
如果在算术运算符中前后出现字符串,并且使用+,必须使用字符串首尾相连的方式将内容连接
String() Number() Boolean() Object()
如果运算过程中没有使用字符串,使用+符号,其他类型都会转换为数值,并且相加
所有类型遇到 - * / %都会隐式转换为数值,然后运算的
一元运算符
++ 累加
-- 递减
a++ 先用后加
++a 先加后用
关系运算符
关系运算是返回布尔值的一种运算表达式
运算符 < > <= >=
== 判断值是否相等 === 判断值和类型是否相等
*以后所有代码必须使用===
undefined==null 只有这两个相等
isNaN 将这个字符串转换为数值后判断是否是NaN非数值
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
}
逻辑运算
true && true = (第二个值)
true && false = (第二个值)
false && true = (第一个值)
false && false = (第一个值)
true || true = (第一个值)
true || false = (第一个值)
false || true = (第二个值)
false || false = (第二个值)
如果obj转换为布尔值是true,直接熔断
如果是false,取第二个值
位运算
1、位与运算符 &
1&1==1 1&0==0 0&1==0 0&0==0
任何数与2^n-1都为原数值;
6&7==6
2、位非运算符 |
1|1==1 0|1==1 1|0==1 0|0==0
3、位异或运算符 ^
0^0==0 1^1==0 0^1==1 1^0==1
4、位非运算符 ~
加1取反
三目运算符
判断条件是否成立,如果条件成立返回第一个值 否则返回:后面的第二个值
如果表达式的结果转换为布尔值为真时,返回问号后面的值,否则返回冒号后面的值
问号前面的内容会自动隐式转换为布尔值
三目运算符比赋值运算优先级高
当需要返回的是布尔值时,请不要使用三目运算符