一、输入和输出

1.1、弹框输入

var name = prompt("please your name:");

1.2、输出

<body>
    <div id="div1"></div>
    <script>
        var name = "abc";
        console.log(name);		// 控制台输出
        window.alert(name);		// 弹窗输出
        document.write(name);	// 写入HTML页面,如果在文档已完成加载后执行,整个HTML页面将被覆盖。
        document.getElementById("div1").innerHTML = name;   // 写入HTML标签
    </script>
</body>

二、变量

通过var声明变量,变量名有如下规则:

1、变量名可包含数字、字母、下划线和$符号
2、变量名不可以数字开头,建议使用字母开头
3、大小写敏感
4、保留字不可用作变量名

如:

var num1, str1 = 'abc';

tips:let和const

let声明的变量只在let命令所在的代码块{}内有效;

var a = 5;
console.log(a);			// 5
{
    let a = 2;
    console.log(a);		// 2
}
console.log(a);			// 5

const用于声明常量,声明时必须初始化,初始化后值不可更改:

const PI = 3.14;

PI = 3.14159;				// 报错

三、注释

单行注释://
多行注释:/* */

四、数据类型

4.1、原始类型

4.1.1、Number

  • 定义方法:
var n1 = 123;		# typeof(n1)为number
var n2 = new Number(123);	# type(n2)为object
  • 八进制和16进制:以0开头表示8进制,以0x开头表示16进制。
  • Infinity:无穷大,数字最大为64位,超过上限后为Infinity
    tips:10/0不会报错,也是一个Infinity
  • NaN:非数字
Infinity + Infinity		// Infinity
Infinity * Infinity		// Infinity
Infinity - Infinity		// NaN
Infinity / Infinity		// NaN
isNaN(Infinity)			// false
  • Number常用方法
Number('123')				// 123,强制类型转换,将字符串转为数字
Number('123a')				// NaN
parseInt('123.4abc5');		// 123,字符串以数字开头,提取开头的数字转为整型
parseInt('abc123.45');		// NaN
parseFloat('123.4abc5');	// 123.4
parseFloat('abc123.45');	// NaN
isNaN(Infinity);			// false
Number.isInteger(123.4);	// false
var a = 123.456;
a.toFixed(2);				// 123.46,返回指定小数位数

4.1.2、String

  • 定义字符串:
var str1 = "abc";
var str2 = new String("def");

tips:数字和字符串可以直接相加,结果为拼接字符串,如:123+‘abc’,结果为’123abc’

  • 字符串常用属性和方法:
    属性:
'abc'.length		// 3,字符串长度

方法:

String(null);						// 'null',强制类型转换
'abcdef'.charAt(2);					// 'c',返回指定下标的字符
'abc'.concat('def','g');			// 'abcdefg',连接字符串
'abc'.startsWith('ab');				// true,判断字符串是否以指定字符串开头
'abc'.endsWith('bc');				// true,判断字符串是否以指定字符串结尾
'abcd'.indexOf('cd');				// 2,返回子字符串出现的位置,无则返回-1
'abcd'.includes('cd');				// true,判断字符串是否包含子串
'abcdxcd'.lastIndexOf('cd');		// 5,子串最后出现的位置
'ab'.repeat(3);						// ababab,3次连接
'abcdefcd'.replace('cd','12');		// 'ab12efcd',替换1次
'abcdefcd'.replaceAll('cd', '12');	// 'ab12ef12',替换所有
'abcdef'.slice(2,-2);				// 'cd',提取子串,范围为[start, end)
'ab**cd*e'.split('*');				//  ['ab', '', 'cd', 'e'],切片
'abcdef'.substr(2, 3);				// 'cde',提取子串,参数1为下标,参数2为提取长度
'abcdef'.substring(2, 4)			// 'cd',提取两个指定下标间的字符,不支持负数,范围[)
'AbCd'.toLowerCase();				// 'abcd',转小写
'AbCd'.toUpperCase();				// 'ABCD',转大写
'  ab cd  '.trim();					// 'ab cd',去除两端空格
str1 = new String('ABC');		
str1.valueOf();						// 返回字符对象原始值
str1.toString();					// 返回字符对象原始值

4.1.3、Boolean

  • ture/false
  • 支持强制类型转换,如:Boolean(‘’):false

4.1.4、Null

  • 空:str1 = null;

4.1.5、Undefined

  • 定义了变量,但未赋值就使用
var str1;
console.log(str1);			// undefined

4.2、引用类型

4.2.1、Array

  • 数组定义:
var lst1 = ['a', 'b', 'c'];
var lst2 = new Array(['d', 'e', 'f']);

console.log(typeof(lst1), typeof(lst2));	// object object
  • 常用属性:
length:数组长度
  • 常用方法:
var lst1 = ['a', 'b', 'c'];
var lst2 = ['d', 'e', 'f'];					

// 约定每一个示例之前都为lst1 lst2赋以上初值

var lst3 = lst1.concat(lst2);			// ['a', 'b', 'c', 'd', 'e', 'f'],连接
var lst1.fill('mm');					// ['mm', 'mm', 'mm'],填充
lst1.includes('c');						// true,lst1中是否包含'c'
lst1.indexOf('c');						// 2,'c'出现的位置,无则返回-1
lst1.join('-');							// 'a-b-c',数组转字符串,默认分隔符为','
lst1.lastIndexOf('c');					// 2,数组元素最后出现位置
lst1.pop()								// 'c',删除最后个元素并返回其值
lst1.push('d')							// 4,在末尾添加元素,并返回新长度
lst1.reverse();							// ['c', 'b', 'a'],反转
lst1.shift();							// 'a',删除第一个元素并返回其值
lst1.unshift();							// 4,在开头添加元素,并返回新长度
var str3 = lst1.slice(0, -1);			// ['a', 'b'],取指定范围,返回给新数组,范围[)
lst1.splice(1, 1, 'd');					// ['b'],删除/添加元素
// 参数1:必填,删除/添加的的位置
// 参数2:可选,删除元素个数,未填时,从该位置删到结尾
// 参数3...n:可选,要添加的元素
lst1.splice(1, 0, 'mm', 'nn');			// [],lst1变为:['a', 'b', 'mm', 'nn', 'c']
var str1 = lst1.toString();				// 'a,b,c',转字符串,逗号分隔,lst1不变

4.2.2、Object

  • 对象声明:
obj1 = {a:1,b:2};
obj2 = new Object({a:1,b:2});
  • 对象属性:
obj1 = {name: "zhangsan", age: 20};
obj1.name				// "zhangsan"
obj1.age				// 20
obj1['age']				// 20
obj1['age1']			// undefined
  • 对象方法:
var obj1 = {
    name: "zhangsan",
    age: 20,
    func: function(){
        return [this.name, this.age];
    }
};

obj1.name		// "zhangsan"
obj1.age		// 20
obj1.func()		// ['zhangsan', 20]
  • this关键字
  • 在对象方法中:
    this关键字指向它所在方法的对象,如上例,this在方法func()中,它指向func()方法所在的对象obj1。
  • 单独使用时:
    this指全局对象。如浏览器中,全局对象是[object Window]
<body>
    <div id="div1"></div>

    <script>
        document.getElementById("div1").innerHTML = this;
    </script>
</body>

运行结果如下:

[object Window]
  • 函数中的this:
    JS中,函数的所有者默认绑定this,所以在函数中this指全局对象:
<body>
    <div id="div1"></div>

    <script>
        document.getElementById("div1").innerHTML = func1();
        function func1() {
            return this;
        }
    </script>
</body>

结果如下:

[object Window]

在严格模式下,函数是未绑定到 this,这时候this是undefined:

<body>
    <div id="div1"></div>

    <script>
        "use strict";
        document.getElementById("div1").innerHTML = func1();
        function func1() {
            return this;
        }
    </script>
</body>

结果如下:

undefined
  • 事件中的this:
    在HTML事件处理程序中,this指的是接收此事件的HTML元素:
<body>
    <button id="btn1" οnclick="this.style.display='none'">点我我便消失</button>
</body>
  • 显示函数绑定:
    apply和call允许切换函数执行的上下文环境(context),即this绑定的对象,可以将this引用到任何对象。
    实例如下:
var person1 = {
	fullName: function() {
		return this.firstName + " " + this.lastName;
	}
}
var person2 = {
	firstName:"John",
	lastName: "Doe",
}
person1.fullName.call(person2);  // 返回 "John Doe"

4.2.3、Date

  • 创建对象
d = new Date();		
// 当前日期时间
var d = new Date(2022, 6, 7, 12, 30, 50, 0);		
// 创建时指定年月日时分秒毫秒
// 日时分秒毫秒均可以不指定。未指定时,日默认为1,其他默认为0

var d = new Date(2022);	
// 只带1个参数时,表示毫秒
// Thu Jan 01 1970 08:00:02 GMT+0800 (中国标准时间)
var d = new Date("July 13, 2022 12:13:30");	
// Wed Jul 13 2022 12:13:30 GMT+0800 (中国标准时间) 
var d = new Date("2022-07-06");		
// Wed Jul 06 2022 08:00:00 GMT+0800 (中国标准时间)
var d = new Date("2022-07-06T12:01:02");	
// 日期时间通过'T'分隔
// Wed Jul 06 2022 12:01:02 GMT+0800 (中国标准时间)
var d = new Date("07/19/2022");
// Tue Jul 19 2022 00:00:00 GMT+0800 (中国标准时间)
  • 方法
var d = new Date("2022-07-06T12:01:02");	
// Wed Jul 06 2022 12:01:02 GMT+0800 (中国标准时间)

d.getFullYear();	// 2022,年
d.getMonth();		// 6,0-11,6表示7月
d.getDate();		// 6,获取日期
d.getDay();			// 3,获取星期,0-6,星期天为0
d.getHours();		// 12,时
d.getMinutes();		// 1,分
d.getSeconds();		// 2,秒
d.getMilliseconds();// 0,毫秒
d.getTime();		// 1657080062000,时间戳,单位为毫秒

// 除Day外,其他都可以用同名的set进行设置。如:setDate(20)

4.2.4、其他

Fuction、Re’gExp等。

五、运算符

5.1、算术运算符

+	-	*	/	%	++	--

5.2、赋值运算符

=	+=	-=	*=	/=	%=

5.3、比较运算符

==		===		!=		!==		>		<		>=		<=

tips:绝对等于和等于区别如下:

10 == '10';			// true,值相等则为真
10 === '10';		// falae,值和类型都需要相等
10 != '10';			// false
10 !== '10';		// true

5.4、逻辑运算符

&&		||		!		
与	    或	   非

5.5、条件运算符

var num1 = 5
var str1 = (num1 > 5)?"big":"small";		// "small"

六、逻辑控制

6.1、if

var a = 10, b = 20;
if (a > b){
    console.log('a大于b');
} else if (a < b){
    console.log('a小于b');
} else {
    console.log('a等于b');
}		

// 'a小于b'

6.2、switch

var n = 2

switch(n)
{
    case 1:
        console.log('n为1');
        break;
    case 2:
        console.log('n为2');
        break;
    default:
        console.log('n为其他');
}

// 'n为2'

tips:如果没有break,则之后的语句都会执行:

var n = 2

switch(n)
{
    case 1:
        console.log('n为1');
    case 2:
        console.log('n为2');
    default:
        console.log('n为其他');
}

// 'n为2'
// 'n为其他'

6.3、while

while:

var i = 1;
while (i <= 5){
    console.log("index: %d", i);
    i++;
}

// index: 1
// index: 2
// index: 3
// index: 4
// index: 5

do while:

var i = 8;
do {
    console.log("index: %d", i);
    i++;
} 
while (i <= 5);

// index: 8

6.4、for

for (var i = 1; i <= 5; i++) {
    console.log("index: %d", i);
}

// index: 1
// index: 2
// index: 3
// index: 4
// index: 5

6.5、break&continue

break跳出循环;continue终端循环的当前迭代,继续执行下一个迭代。

七、函数

7.1、函数定义

函数的一般格式如下:

function add(a, b) {
    return a + b;
}

var sum = add(3, 4);
console.log(sum);

// 12

js对函数的形参和实参无限制,当形参个数大于实参个数时,多余的形参为undefined;当形参个数小于实参个数时,多余的实参被忽略:

function myFunc(a, b, c) {
    console.log(a, b, c);
}

// 形参个数大于实参个数
myFunc(1, 2);			// 1 2 undefined

// 形参个数小于实参个数
myFunc(1, 2, 3, 4);		// 1 2 3

函数还可以通过如下方式定义:

函数表达式:

var myFunc = function (a, b) {
     console.log(a, b);
};

myFunc(1, 2);		// 1 2

Function()构造器:

var myFunc = new Function("a", "b", "console.log(a + b);");

myFunc(1, 2);		// 3

7.2、函数提升

将变量、函数的声明提升到当前作用域顶端:

变量提升:

console.log(a);

var a = 2;

// undefined
/*
相当于:
var a;
console.log(a);
a = 2;
*/

函数提升:

myFunc();

function myFunc() {
	console.log("test.")
}

// test.
// 将函数的声明提升到顶端

tips:函数表达式不会被提升

myFunc();

myFunc = function () {
	console.log("abc")
};

// 报错:Uncaught ReferenceError: myFunc is not defined

7.3、函数自调用

如下:

(function myFunc(a, b) {
	console.log(a*b);
})(2, 3);

7.3、函数的属性和方法

函数也是对象,有自己的属性和方法:

function myFunction(a, b) {
	return argument.length;				// 接收参数的个数
}

console.log(myFunction.toString());		// 以字符串返回函数
console.log(myFunction(1,2,3));

7.4、箭头函数

  • 格式:
const 函数名 = (参数1, 参数2, ...) {函数体};
  • 示例:
const func = (x, y) => {
    var sum = x + y;
    var sub = x - y;
    return [sum, sub];
}

console.log(func(3, 4));	// [7, -1]

只有一个参数时,可省略();只有一条语句时,可省略return和{}:

const func01 = x => x * 5;

console.log(func01(5));		// 25

7.5、void

计算一个表达式,但不返回值,格式如下:

void func()
javascript:void func()
// 或
void(func())
javascript:void(func())

如:

<a href="javascript:void(0)">单击此处什么也不会发生</a>

八、异常处理

8.1、try

语法如下:

try {
    ...		// 抛出异常
} catch(err) {
    ...		// 捕获和处理异常
} finally {
    ...		// 接数处理,不论是否产生异常都会执行该部分
}

示例:

try {
    console.log(str1);
} catch(err) {
    console.log(err.message);
}

// str1 is not defined

8.2、throw

创建自定义错误。

var num = 1000;
try {
    if(num < 0) throw "值为负数";
    if(num > 100) throw "超过100";
} catch(e) {
    console.log(e)
}

// 超过1000

九、JSON

  • JSON->Object
js1 = '{"name": "abc", "age": 20}';
obj1 = JSON.parse(js1);					// {name: "abc", age: 20}
  • Object->JSON
obj1 = {name: "abc", age: 20};
js1 = JSON.stringify(obj1);				// '{"name":"abc","age":20}

十、类

10.1、创建类

class ClassName {
	constructor() { ... }		// 构造函数
    method_1() { ... }
    method_2() { ... }
    method_3() { ... }
}

示例如下:

class Person {
    constructor(name, age) {
        this.name = name;
        this.age = age;
    }
    
    eat (food) {
        console.log(this.name + " eat " + food);
    }
    
    run () {
        console.log("I'm running!");
    }
    
    static say() {		// 静态方法,类可以调用,实例化对象不可以
        console.log("say hello");
    }
    
}


p1 = new Person("zhangsan", 18);
p1.eat("apple");		// zhangsan eat apple
p1.run();				// I'm running!
p1.say();				// 报错:p1.say is not a function
Person.say()			// say hello

10.2、类继承

接上例:

class Student extends Person {
    constructor(name, age, school) {
        super(name, age);
        this.school = school;
    }
    
    mySchool() {
        console.log("My school is " + this.school);
    }
}

p2 = new Student("lisi", 17, "xxx");
p2.mySchool();		// My name is lisi,I'm 17 years old.My school is xxx

十一、正则表达式

11.1、语法

var patt = /pattern/modifiers;
var patt = new RegExp(pattern, modifiers);

11.2、修饰符

i		大小写不敏感
g		全局匹配,查找所有匹配而非找到第一个即停止
m		多行匹配

11.3、方括号

用户查找某个范围的字符

[abc]		// 查找方括号间的任何字符
[^abc]		// 不再方括号间的任何字符
[0-9]		// 数字
[a-z]		// 小写字母
[A-Z]		// 大写字母
[A-z]		// 大小写字母

11.4、元字符

.		// 匹配除换行和行结束符外的所有字符
\w		// 数字、字母、下划线
\W		// 非单词字符
\d		// 数字
\D		// 非数字
\s		// 空白字符
\S		// 非空白字符
\b		// 单词边界
\B		// 非单词边界
\0		// NULL字符
\n		// 换行符
\f		// 换页符
\r		// 回车符
\t		// 制表符

11.5、量词

n+		// 至少1个n
n*		// 0个或多个n
n?		// 0个或1个n
n{X}	// X个n	
n{X,}	// 至少X个n
n{X,Y}	// 至少X个,至多Y个n

11.6、RegExp对象方法

exec()		// 检索字符串中指定的值。返回找到的值,并确定其位置。
test()		// 检索字符串中指定的值。返回true或false。
toString()	// 返回正则表达式的字符串。

11.7、String 对象方法

search()	// 检索与正则表达式相匹配的值。找到返回其下标,未找到返回-1
match()		// 找到一个或多个正则表达式的匹配。返回数组,未找到返回null
replace()	// 替换与正则表达式匹配的子串。
split()		// 把字符串分割为字符串数组。

11.8、示例

var str1 = "Hello hello"

var patt1 = /H(.*?)o/ig;
var patt2 = /H.*?x/ig;

var result1 = patt1.exec(str1);		// Hello,ell
var result2 = patt2.exec(str1);		// null

var result3 = patt1.test(str1);		// true
var result4 = patt2.test(str1);		// false
var str1 = "My name is Gaohui";

document.write(str1.search(/g.*?i/i));		// 11
document.write(str1.search(/g.*?x/i));		// -1

var str2 = "abcadcaec";
document.write(str2.match(/a.c/ig));		// abc,adc,aec

var str3 = "I'm a good good man."
newStr3 = str3.replace(/g.*?d/g, "nice")	
document.write(str3);						// I'm a good good man.
document.write(newStr3);					// I'm a nice nice man.	

var str4 = 'ab**cd*e';
var lst = str4.split(/\*+/);
console.log(lst);						// [ab, cd, e]