JavaScrips是一门世界上最流行的脚本语言。
一个合格的后端人员,必须精通javaScript
ECMAScript可以理解为是JavaScript的一个标准。
最新版本已经到es6版本
但是大部分浏览器还只停留在支持es5代码上。
开发环境-线上环境,版本不一致。
<script>
alert("1");
script>
<script src="js.js"></script>
浏览器调试:
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script>
// 1.定义变量 变量类型 变量名 = 变量值
var score = 78;
alert(score);
// 2. 条件控制
if (score > 70){
alert(">70");
}
//console.log(score); 在浏览器的控制台打印变量
script>
head>
<body>
body>
html>
控制台打印:
数值、文本、图形、音频、视频
js不区分小数和整数,Number
123 //整数
123.1 //浮点数123.1
1.123e3 //科学计数法
-99 //复数
NaN //not a number
Infinity //表示无限大
1、正常字符串我们使用 单引号、双引号
2、转义字符\
\'
\n
\t
\u4e2d \u### Unicode字符串
\x41 Ascll字符
3、多行字符串编写
<script>
'use strict';
var msg =
`hello
worlf
youyuan`
script>
4、模板字符串
<script>
'use strict';
//Tab 上面,Esc下面
let name = "youyuan";
let age = 23;
let msg = `hello,${name}`;
alert(msg)
<script>
5、字符串长度
console.log(msg.length)
6、字符串的可变性,不可变。
7、大小写转换
//调用方法
msg = msg.toUpperCase()
alert(msg);
msg = msg.toLowerCase();
alert(msg);
8、msg.indexOf(“y”);
返回字符在字符串当中的位置
9、substring
msg.substring(0)
msg.substring(1) //从第一个字符串截取到最后一个字符串
msg.substring(1,9) //[1,9)
true 、false
&& //两个都为真,结果为真
|| //一个都为真,结果为真
! //真即假,假即真
=
== //等于(类型不一样,值一样,也会判断为true)
=== //绝对等于(类型一样,值一样,结果为true)
这是一个JS的缺陷,坚持不要使用 == 比较
须知:
浮点数问题:尽量避免使用浮点数进行计算,存在精度问题。
console.log((1/3)===(1-2/3));
Math.abs((1/3)===(1-2/3))<0.000000001
若干键值对
var 对象名 = {
属性名:属性值,
属性名:属性值,
属性名:属性值
}
JS中对象,{…}表示一个对象,键值对描述属性:xxx:xxx,每个属性之间使用逗号隔开,最后一个属性不加逗号。
对象是大括号,数组是中括号。
JavaScript中的所有的键都是字符串,值都是任意对象
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script>
var arr = [1,2,3,4,5,"a",null,true];
var person = {
name:'zs',
age:3,
hobby:["12",23]
}
script>
head>
<body>
body>
html>
1、对象赋值
person.name='ls'
2、使用一个不存在的对象属性,不会报错!undefined
person.age12
undefined
3、动态的删减属性
delete person.age
4、动态的添加,直接给新的属性添加值即可
person.hbooy="ping-ping"
5、判断一个属性值是否在这个对象中。
'age' in person
true
//继承
'toString' in person
true
6、判断一个属性是否是这个对象自身拥有的hasOwnProperty()
person.hasOwnProperty('age')
true
person.hasOwnProperty('toString')
false
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script>
'use strict';
let i = 1;
script>
head>
<body>
body>
html>
Array可以包含任意的数据类型。
var arr = [1,2,3,45,6]
arr[0]
arr
1、长度
arr.length
注意:加入给arr.length赋值,数组大小就会发生变化,如果赋值过小,元素就会丢失。
2、indexOf,通过元素获得下标索引
arr.indexOf(2)
1
字符串的"1" 和数字1 是不同的。
3、slice()截取Array的一部分,返回一个新的数组,类似于String中的substring
arr.slice(0,3)
4、push(),pop() 头部
push:压入到尾部
pop:弹出头部的一个元素
5、unshift()、shitf()头部
unshift:压入到头部
shift:弹出头部的一个元素
6、排序 sort()
arr.sort()
7、元素反转 reverse()
arr.reverse()
8、concat()
rr.concat([1,67])
[4590, 456, 2, 1, 1, 0, 1, 67]
注意:concat()并没有修改数组,只是会返回一个新的数组。
9、连接join
打印拼接数组,使用特定的字符串连接。
arr.join("_")
10、多维数组
arr = [[1,2],[3,4]]
arr[1][1]
数组:存储元素(如何存,如何取)。
<script>
'use strict';
let age = 23;
if(age > 50){
alert("50")
}else if(age > 22){
alert(">22");
}else {
alert("else ..");
}
script>
while循环,避免程序死循环。
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Titletitle>
<script>
'use strict';
let age = 23;
while (age < 100){
age = age + 2;
}
alert(age)
do {
age = age + 3;
}while (age < 200)
alert(age);
script>
head>
<body>
body>
html>
for循环
var age = [12,34,56,34];
for (let i = 0; i < age.length; i++) {
console.log(age[i]);
}
forEach循环(函数)es5特性
age.forEach(function (value) {
console.log(value)
})
for…in(下标索引)
for(var num in age){
if (age.hasOwnProperty(num)){
console.log("存在");
console.log(num)
console.log(age[num]);
}
}
ES6的新特性
<script>
'use strict';
var map = new Map([['zs',100],['ls',90],['ww',120]]);
let zs = map.get(`zs`); //获取value
let youyuan = map.set('youyuan',23); //新增或修改
map.delete("ww");
script>
无序不重复的集合
var set = new Set([4,5,1,78,0,0]);
set.add(1); //添加
set.add(100);
set.delete(78); //删除
set.has(1); //是否包含某个元素
es6新特性
使用iterator来遍历迭代我们Map、Set
遍历数组:
var arr = [3,5,7];
for (var x of arr){
console.log(x);
}
遍历Map:
var map = new Map([['zs',100],['ls',90],['ww',120]]);
for (let x of map){
console.log(x);
}
遍历Set
var set = new Set([4,5,1,78,0,0]);
for(let x of set){
console.log(x);
}
定义方式一
绝对值函数
function abs(x){
if(x>=0){
return x;
}else{
return -x;
}
}
一旦执行到return 代表函数结束,返回结果。
如果没有执行return ,函数执行完也会返回结果,结果就是undefined。
定义方式二
var asb = function abs(x){
if(x>=0){
return x;
}else{
return -x;
}
}
function(x){…}这是一个匿名函数,但是可以把结果赋值给abs。
方式一和方式二等价!
调用函数
abs(10) //10
abs(-10) //10
参数问题:JavaScript可以传任意个参数,也可以不传递参数。
参数进来是否存在问题?
假设不存在参数,如何规避?
var abs = function abs(x){
if (typeof x != 'number'){
throw 'Not a Number';
}
if(x>=0){
return x;
}else{
return -x;
}
}
arguments
arguments
是一个JS免费赠送的关键字;
代表,传递进来的所有的参数,是一个数组。
for (let i = 0; i < arguments.length; i++) {
console.log(arguments[i]);
}
问题:arguments包含所有的参数,我们有时候想使用多余的参数来进行附加操作。需要排除已有参数。
rest
以前:
if (arguments.length == 2){
}else if(arguments.length == 3){
}
ES6引用的新特性,获取处理已定义的参数之外的所有的参数:
function aaa(a,b,c,...rest) {
console.log("a="+a);
console.log("b="+b);
console.log("c="+c);
console.log(rest)
}
rest参数只能写在最后面,必须用…标识。
在JavaScript中,var定义变量实际是有作用域的。、
假设在函数体中声明,则在函数体外不可以使用(非要想实现的话,后面可以研究一下(闭包))
<script>
function f() {
var x = 1;
x = x + 1;
}
x = x + 2;
script>
如果两个函数使用了相同的变量名,只要在函数内部,就不冲突。
<script>
function f1() {
var x = 1;
x = x + 1;
}
function f2() {
var x = 1;
x = x + 1;
}
script>
内部函数可以访问外部函数的成员,反之不行。
<script>
var x = 1;
function f3() {
var y = x + 1;
console.log(y); //2
}
f3();
var z = y + 1; // Uncaught ReferenceError: y is not defined
script>
假设,内部函数变量和外部函数的变量,重名!
<script>
var x = 1;
function f() {
var x = 'A';
console.log('inner'+x); //innerA
}
console.log('outer'+x); //outer1
f();
script>
假设在javaScript中函数查找变量从自生函数开始,有内向外查找,假设外部存在这个同名的函数变量,则内部函数会屏蔽外部函数的变量。
提高变量的作用
<script>
function f() {
var x = "x" + y;
console.log(x); //xundefined
var y = 'y';
}
f();
script>
结果:xundefined
说明:js执行了引擎,自动提升了y的声明做用域。
function f() {
var y;
var x = "x" + y;
console.log(x);
y = 'y';
}
这个是放在JavaScript建立之初就存在的特性。
养成规范:所以的变量定义都放在函数的头部,不要乱放,便于维护。
function f() {
//var x ,y,z.....;
//之后随便用
}
全局变量
//全局变量
x = 1
function f(){
console.log(x);
}
f();
console.log(x);
全局对象Window
<script>
var x = 'xxx';
alert(x);
alert(window.x); //默认所有的全局变量,都会自动定位在window对象上
script>
alert()这个函数本身也是一个window
函数
<script>
var x = 'xxx',old_alert;
alert(x);
alert(window.x); //默认所有的全局变量,都会自动定位在window对象上
old_alert = window.alert ;
window.alert = function () {
};
window.alert(123); //失效
window.alert = old_alert;//恢复
window.alert(124);
script>
JavaScript实际上只有一个全局变量作用域,任何变量(函数也可以视为变量),假设没有在函数作用范围内找到,就会向外查找。如果在全局作用域都没有找到,报错RefrenceError
。
规范
由于我们所有的全局变量都会绑定到我们的window上,如果不同的js文件,使用了相同的全局变量,冲突,如何能够减少冲突。
//唯一全局变量
var youyuan = {};
//定义全局变量
youyuan.name = 'you';
youyuan.add = function(a,b){
return a + b;
}
把自己的代码全部放入自己定义的唯一空间名字中,降低全局命名冲突的问题。
jQuery($.)
局部作用域 let
function f() {
for (var i = 0; i < 100; i++) {
console.log(i);
}
console.log(i+1);
}
f();
ES6 let 关键字,解决局部作用域冲突问题。
function f() {
for (let i = 0; i < 100; i++) {
console.log(i);
}
console.log(i+1);
}
f();
建议大家都是用’let’去定义局部作用域的变量。
常量 const
在ES6 之前,怎么定义常量:只有全部大写字母的变量就是常量,建议不要修改这样的值
var PI = 3.14;
console.log(PI);
PI = '12';
console.log(PI);
在ES6引入了常量关键字 const
const PI = 3.14;
console.log(PI);
定义方法
方法就是把函数放在对象里面,对象只有两个东西:属性与方法。
var youyuan = {
name:'youyuan',
birth:2001,
age:function () {
var now = new Date().getFullYear();
return now - this.birth;
}
}
//属性
youyuan.name
//方法,一定要带括号
youyuan.age()
将方法分开:
function getAge() {
var now = new Date().getFullYear();
return now - this.birth;
}
var youyuan = {
name:'youyuan',
birth:2001,
age:getAge
}
//youyuan.age()
//getAge() NAN
this是无法指向的,是默认指向调用它的那个对象。
apply
在js中可以控制this指向!
function getAge() {
var now = new Date().getFullYear();
return now - this.birth;
}
var youyuan = {
name:'youyuan',
birth:2001,
age:getAge
}
getAge.apply(youyuan,[]);//this,指向了youyuan
标准对象
typeof 123
"number"
typeof '123'
"string"
typeof true
"boolean"
typeof NaN
"number"
typeof []
"object"
typeof {}
"object"
typeof undefined
"undefined"
var date = new Date();
date.getFullYear(); //年
date.getMonth(); //月 0~11
date.getData(); //日
date.getDay(); //星期几
date.getHours(); //时
date.getMinutes(); //分
date.getSeconds(); //秒
date.getTime(); //时间戳
转换
now = new Date(1592006368511)
Sat Jun 13 2020 07:59:28 GMT+0800 (中国标准时间)
now.toLocaleString()
"2020/6/13 上午7:59:28"
now.toGMTString()
"Fri, 12 Jun 2020 23:59:28 GMT"
json是什么
早期,所有数据传输习惯用XML文件。
在JavaScript一切皆为对象,任何JS支持的类型都可以用JSON来表示:number,string…
格式:
JSON字符串和JS对象的转换。
var user = {
name:'zs',
age:23,
sex:'男'
}
//对象转化为json字符串
var jsonUser = JSON.stringify(user);
//json字符串转化为对象
var obj = JSON.parse(jsonUser);
jsonUser
"{"name":"zs","age":23,"sex":"男"}"
obj
{name: "zs", age: 23, sex: "男"}
JSON与JS对象的区别:
var obj = {name: "zs", age: 23, sex: "男"};
var json = "{"name":"zs","age":23,"sex":"男"}"
JavaScript、java、c#面向对象;JavaScript有些区别
原型
var user = {
name:'zs',
age:23,
sex:'男'
}
var student = {
name:'xiaoming'
}
//原型对象
student._proto_ = user;
class 继承
class
关键字,是在ES6引入的
1、定义一个类,属性,方法
class Student{
constructor(name) {
this.name = name;
}
hello(){
alert("hello");
}
}
var zs = new Student("zs");
//继承
class xiaoStudent extends Student{
constructor(name,grade) {
super(name);
this.grade = grade;
}
myGrade(){
alert("我是小学生");
}
}
var xs = new xiaoStudent("zs",6);
本质:查看对象原型。