文章目录
JavaScript
-
JavaScript(简称“JS”) 是一种具有函数优先的轻量级,解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名的,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言,并且支持面向对象、命令式和声明式(如函数式编程)风格。
-
JavaScript 是 web 开发者必学的三种语言之一:
(1) HTML 定义网页的内容
(2)CSS 规定网页的布局
(3)JavaScript 对网页行为进行编程
基础部分
js的引入方式
- 可以使用script标签,在script标签内编写js代码,script标签可以放在head或者body标签内
- 也可以使用script标签引入外部js文件。
提示:把脚本置于 <body> 元素的底部,可改善显示速度,因为脚本编译会拖慢显示。
js的显示数据方式
- 使用 window.alert() 写入警告框(弹框)
- 使用 document.write() 写入 HTML 输出(仅用于测试)
- 使用 innerHTML 写入 HTML 元素
- 使用 console.log() 写入浏览器控制台
JavaScript 变量
- 使用var来声明
JavaScript 注释
- // 或者 /* 和 */ 之间的代码被视为注释
JavaScript 算数
-
<script> x = "8" + 3 + 5; document.getElementById("demo").innerHTML = x; </script> //输出835
-
<script> var x = 3 + 5 + "8" document.getElementById("demo").innerHTML = x; </script> //88
关于js中的 == 与 ===
- == 代表相同, ===代表严格相同
- 当进行双等号比较时候: 先检查两个操作数数据类型,如果相同, 则进行 === 比较, 如果不同, 则愿意为你进行一次类型转换, 转换成相同类型后再进行比较, 而===比较时, 如果类型不同,直接就是false.
js 数据类型
- JavaScript 变量能够保存多种数据类型:数值、字符串值、数组、对象等等:
- JavaScript 拥有动态类型
- 这意味着相同变量可用作不同类型:
-
var x; // 现在 x 是 undefined var x = 7; // 现在 x 是数值 var x = "Bill"; // 现在 x 是字符串值
(1) JavaScript 只有一种数值类型,即写数值时用不用小数点均可:
(2) 字符串变量可以使用单引号也可以使用双引号。嵌套使用时,内类型引号须与外不同。
(3) JavaScript 数组
var cars = ["Porsche", "Volvo", "BMW"];
(4) JavaScript 对象
var person = {firstName:"Bill", lastName:"Gates", age:62, eyeColor:"blue"};
js类型运算符
运算符 | 描述 |
---|---|
typeof | 返回变量的类型 |
instanceof | 返回true,对象是对象类型的实例 |
typeof 运算符
- 可以返回4种原始类型之一:string,number,boolean,undefine
- 可以返回2种复杂类型之一:function,object(对象,数组或null)
-
typeof "" // 返回 "string" typeof "Bill" // 返回 "string" typeof 0 // 返回 "number" typeof 314 // 返回 "number"
- typeof 运算符对数组返回 “object”,因为在 JavaScript 中数组属于对象。
- 在 JavaScript 中,没有值的变量,其值是 undefined。typeof 也返回 undefined。
- 任何变量均可通过设置值为 undefined 进行清空。其类型也将是 undefined
js值
空值
空值与 undefined 不是一回事,空的字符串变量既有值也有类型。
var car = ""; // 值是 "",类型是 "string"
Null
- 在 JavaScript 中,null 是 “nothing”。它被看做不存在的事物,null 的数据类型是对象,可以通过设置值为 null 清空对象:
null是object类型
Undefined 与 Null 的区别
- Undefined 与 null 的值相等,但类型不相等
js函数(待更新。。。)
- 定义一个函数
function myFunction(p1,p2) { return p1*p2; }
- 使用函数能够对代码进行复用:只要定义一次代码,就可以多次使用它
- 当 JavaScript 到达 return 语句,函数将停止执行。
- () 运算符调用函数
调用方法时,toCelsius 引用的是函数对象,而 toCelsius() 引用的是函数结果。
js对象
- 定义一个对象
var person = { firstName: "Bill", lastName : "Gates", id : 678, fullName : function() { return this.firstName + " " + this.lastName; } };
- 在函数定义中,this 引用该函数的“拥有者”。
- 访问对象属性
objectName.propertyName
objectName["propertyName"]
- 访问对象方法
objectName.methodName()
- 如果您不使用 () 访问 fullName 方法,则将返回函数定义。
js事件
- 通过 JavaScript 代码,HTML 允许您向 HTML 元素添加事件处理程序。
<p>点击按钮来显示日期。</p> <button onclick="displayDate()">时间是?</button> <script> function displayDate() { document.getElementById("demo").innerHTML = Date(); } </script> <p id="demo"></p>
- 常见的 HTML 事件
事件 描述 onchange HTML 元素已被改变 onclick 用户点击了 HTML 元素 onmouseover 用户把鼠标移动到 HTML 元素上 onmouseout 用户把鼠标移开 HTML 元素 onkeydown 用户按下键盘按键 onload 浏览器已经完成页面加载
js字符串
-
字符串长度:内建属性 length 可返回字符串的长度:
var txt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; document.getElementById("demo").innerHTML = txt.length;
-
js中转译字符
\" 转译后" \' 转译后' \\ 转译后\
-
长代码行换行
- 为了最佳可读性, 程序员们通常会避免每行代码超过 80 个字符串。
- 对长字符串换行的最安全做法(但是有点慢)是使用字符串加法:
document.getElementById("demo").innerHTML = "Hello" +
"Kitty!";
-
字符串可以是对象
var x = "Bill"; //string类型 var y = new String("Bill");//object类型 x == y true x === y false
- JavaScript 对象无法进行对比,比较两个 JavaScript 将始终返回 false。
var x = new String("Bill"); // x 是对象 var y = new String("Bill"); // y 也是对象 document.getElementById("demo").innerHTML = (x==y); // false
高级部分(待待待更新。。)
-
面向过程(pop)
- 分析出解决问题所需要的步骤,然后用函数一步一步实现,使用的时候再一个一个的依次调用就可以了。
-
面向对象(oop)
- 把事务分解成为一个个对象,然后由对象之间分工合作
-
面向对象的特性:
- 封装性
- 继承性
- 多态性
-
在JavaScript中,对象是一组无序的相关属性和方法的集合,所有的事物都是对象,例如字符串,数值,数组,函数等。
-
对象由属性和方法组成
属性:事物的特征,在对象中用属性表示
方法:事物的行为,在对象中用方法表示
创建类和对象
- 创建类
-
<!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> </head> <body> <script> //1.创建类 class创建一个 明星类 class Star { constructor(uname,age) { this.uname = uname; this.age = age; } } //2.利用类创建对象 new var cyx = new Star('陈奕迅',18); var hg = new Star('胡歌',20); console.log(cyx.uname); console.log(hg); </script> </body> </html>
- 多个方法
-
<!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> </head> <body> <script> //1.创建类 class创建一个 明星类 class Star { constructor(uname,age) { this.uname = uname; this.age = age; } sing(song) { console.log(this.uname + song); } } //2.利用类创建对象 new var cyx = new Star('陈奕迅',18); var hg = new Star('胡歌',20); console.log(cyx.uname); console.log(hg); //类里面所有函数不需要写function //多个函数方法之间不需要添加逗号分隔 cyx.sing('两只老虎'); hg.sing('春天在哪里'); </script> </body> </html>
类的继承
<!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>
</head>
<body>
<script>
class Father {
constructor(x,y) {
this.x = x;
this.y = y;
}
sum(){
console.log(this.x + this.y);
}
}
class Son extends Father{
constructor(x,y) {
// this.x = x;
// this.y = y;
// 使用以上注释部分会报错
super(x,y);
}
}
var son = new Son(1,2);
son.sum();
var son2 = new Son(12,21);
son2.sum();
</script>
</body>
</html>
- super关键字调用父类普通函数
<!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>
</head>
<body>
<script>
//super 关键字调用父类普通函数
class Father {
say() {
return '我是爸爸';
}
}
class Son extends Father{
say() {
console.log(super.say() + '的儿子');
}
}
var son = new Son();
son.say();
//继承中的属性或者方法查找原则:就近原则
// 1.继承中,如果实例化一个子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的
// 2.继承中,如果自类里面没有,就去查找父类有没有这个方法,如果有,就执行父类这个方法(就近原则)
</script>
</body>
</html>
- super必须放在子类this之前
<!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>
</head>
<body>
<script>
//父类有加法方法
class Father {
constructor(x,y) {
this.x = x;
this.y = y;
}
sum() {
console.log(this.x + this.y);
}
}
//子类继承父类加法方法 同时 扩展减法方法
class Son extends Father{
constructor(x,y) {
//利用super 调用父类构造方法
//super 必须在子类this之前调用
super(x,y);
this.x = x;
this.y = y;
}
substract() {
console.log(this.x - this.y);
}
}
var son = new Son(5,3);
son.substract();
son.sum();
//继承中的属性或者方法查找原则:就近原则
// 1.继承中,如果实例化一个子类输出一个方法,先看子类有没有这个方法,如果有就先执行子类的
// 2.继承中,如果自类里面没有,就去查找父类有没有这个方法,如果有,就执行父类这个方法(就近原则)
</script>
</body>
</html>
- 使用类的注意事项
- 在 ES6 中类没有变量提升,所以必须先定义类,才能通过类实例化对象
- 类里面的共有的属性和方法一定要加this使用
- 类里面this指向问题:constructor 里面的this指向实例对象,方法里面的this指向这个方法的调用者