代码注释(comment)
代码中不会被当作代码来运行的文字, 用来在代码中写笔记, 分为单行和多行注释
//两个正斜杠作单行注释
/*
多行注释第1行
多行注释第2行
多行注释第3行
*/
字符串, 数字, 布尔值
字符串(string)
'吉吉喵' //单引号或双引号包围的文本是字符串, 大多用于显示文字
"吉吉喵" //作用和上面其实一样, 但建议用', 因为输入比"方便
数字(number)
8 //整数
1.5 //浮点数
布尔值(boolean)
true //真
false //假
特殊的类型(special types)
undefined//未定义
null//空
Infinity//无穷大
NaN//不存在(错误类型)
//NaN不能用==来判断,需用
isNaN()
运算符(operator)
数字加减乘除模
1.5 + 4 //1.5加4得5.5
1.5 - 4 //1.5减4得-3.5
1.5 * 4//1.5乘4得6
1.5 / 4 //1.5除以4得0.375
7 % 4 //7对4取模得3
2 ** 7 //2的7次方得128
字符串拼接与字符读取(string concatenation/get char)
'吉吉喵有' + 100 + '块钱' //字符串拼接出 '吉吉喵有100块钱'
'吉吉喵'[0] //0号位的字符是'吉'
'吉吉喵'[2] //2号位的字符是'喵'
与或非布尔运算(and/or/negate)
true && true //true与true得true
true && false //true与false得false
false && false //false与false得false
true || true //true或true得true
true || false //true或false得true
false || false //false或false得false
!true //非true得false
!false //非false得true
比较运算(comparison)
2 > 3 //2大于3得false
2 >= 3 //2大于等于3得false
2 < 3 //2小于3得true
2 <= 3 //2小于等于3得true
2 == 3 //2等于3得false
2 != 3 //2不等于3得true
位运算(bitwise)
const a = 10;
const b = 2;
a << b//a左移b位,相当于a*(2^b)
a >> b//a右移b位,相当于a/(a^b)
a | b//按位或,把a,b转换成二进制,每一位对齐进行或运算
a & b//按位与,把a,b转换成二进制,每一位对齐进行与运算
a ^ b//按位异或,把a,b转换成二进制,每一位对齐进行异或运算
==与===
null == undefined//true
null === undefined//false
false == ''//true
false === ''//false
更多看这里
变量(variable)
用于存放可变的数据
let name = '吉吉喵' // 名字是'吉吉喵'
let lv = 1 // 等级是1
let money = 10 // 金钱是10
let hp = 100 // 生命值是100
let atk = 20 // 攻击力是20
name = '雷电猴' //名字从吉吉喵变成雷电猴
atk += 10 //攻击力加10, 变成了30攻击力
hp -= 20 //生命值减了20, 变成80生命值
lv++ //等级加1, 变成2级
money-- //金钱减1, 变成9
可行的变量命名风格
var my_var_name //蛇式命名法
var myVarName //驼峰式命名法
var MyVarName //对象类命名法
var MY_VAR_NAME //常量命名法
var $my_var_name //美元符蛇式命名法
var $myVarName //美元符驼峰式命名法
var my_var_name99 //蛇式+数字混搭
var myVarName88 //驼峰式+数字混搭
常量(constant)
常量用于存放不会被改变的数据
const PI = 3.1415926535897932384626433832795 //圆周率
const DAYS_OF_A_WEEK = 7 //一周有7天
使用console控制台调试代码
let a = 2
let b = 3
console.log(a + b) //在控制台输出5
console.clear() //清除控制台的输出记录
对象与属性(object property)
给空对象设置属性:
let obj = {} //定义一个名为obj的变量存储一个空对象
obj.name = '吉吉喵' //给obj设置name属性, 值为'吉吉喵'
obj.money = 99 //给obj设置money属性, 值为99
obj.atk = 10 //给obj设置atk属性, 值为10
//控制台输出:'吉吉喵有99块钱, 10攻击力'
console.log(`${obj.name}有${obj.money}块钱, ${obj.atk}攻击力)
让对象带有初始属性:
let obj = {
name:'吉吉喵',
money: 99,
atk: 10,
}
//控制台输出:'吉吉喵有99块钱, 10攻击力'
console.log(`${obj.name}有${obj.money}块钱, ${obj.atk}攻击力`)
函数(function)
函数用于把多步计算过程封装成1步, 有助于简化代码
//定义一个名为add的函数, 有3个参数, 分别是 a b c
function add(a, b, c) {
a += b
a += c
return a //返回累加后的 a
}
add(2, 3, 4) //用参数2,3,4调用add, 返回 9
add('abc', 'def', 'ghi') //返回 'abcdefghi'
//上面的函数的运算过程也可以简化成1行
function add(a, b, c) {
return a + b + c //直接返回abc的和
}
将函数用于操作对象属性:
let obj1 = {
name:'吉吉喵',
money: 99,
}
let obj2 = {
name:'雷电猴',
money: 10,
}
function addMoney(obj, n) {//给对象加钱
obj.money += n
console.log(`${obj.name}获得了${n}块钱`)
}
function giveMoney(sender,receiver, n) {//把钱从一个对象转到另一个对象
receiver.money += n
sender.money -= n
console.log(`${sender.name}给了${receiver.name}${n}块钱`)
}
function display(obj) {
console.log(`${obj.name}有${obj.money}块钱`)
}
display(obj1)
display(obj2)
addMoney(obj2, 10)
display(obj2)
giveMoney(obj1, obj2, 20)
display(obj1)
display(obj2)
/* 控制台输出:
吉吉喵有99块钱
雷电猴有10块钱
雷电猴获得了10块钱
雷电猴有20块钱
吉吉喵给了雷电猴20块钱
吉吉喵有79块钱
雷电猴有40块钱
*/
函数的其他形态
匿名函数(没有名字的函数)
//匿名函数赋值到变量, 函数本身没有名字, 名字用的是变量的名字
//缺点是要求在声明后才能调用
let add = function(a, b, c) {
return a + b + c
}
add(1,2,3)
箭头函数
//箭头函数赋值到变量, 匿名函数的简写, 而且this关键词在箭头函数无效
let add = (a, b, c) => {
return a + b + c
}
let add2 = (a, b, c) => a + b + c
//在表达式只有1行时, 可以进一步简写
console.log(add(1,2,3), (1,2,3))
异步函数
//用async关键词修饰函数, 可以让函数异步执行
//await关键词用于让异步函数同步执行, await必须在async函数中使用
async function countDown() {
console.log(3)
await sleep(1000) //等待1000毫秒
console.log(2)
await sleep(1000) //等待1000毫秒
console.log(1)
await sleep(1000) //等待1000毫秒
console.log(0)
}
console.log('start')
countDown()
console.log('end')
// 匿名函数 和 箭头函数 同样可以使用async/await
let a = async function () {
await sleep(1000)
}
let b = async () => {
await sleep(1000)
}
对象的方法(object method)
对象方法, 是对象自带的函数, 用于操作自身属性, 方法里的this关键词可以用来指向对象自身
当一个对象属性的值是函数, 这个属性就可以当作方法来用
let obj1 = {
name:'吉吉喵',
money: 99,
giveMoney: function(receiver, n) {//giveMoney方法, 把钱转到另一个对象
receiver.money += n
this.money -= n
console.log(`${this.name}给了${receiver.name}${n}块钱`)//this表示对象自身
},
}
let obj2 = {
name:'雷电猴',
money: 10,
giveMoney(receiver, n) {//giveMoney方法的简写
receiver.money += n
this.money -= n
console.log(`${this.name}给了${receiver.name}${n}块钱`)
},
}
function display() {
console.log(`${this.name}有${this.money}块钱`)
}
//把外边的display函数设置赋值到show属性, show就可以当作方法来用
obj1.show = display
obj2.show = display
obj1.show()
obj2.show()
obj1.giveMoney(obj2, 20)
obj1.show()
obj2.show()
obj2.giveMoney(obj1, 10)
obj1.show()
obj2.show()
/*
吉吉喵有99块钱
雷电猴有10块钱
吉吉喵给了雷电猴20块钱
吉吉喵有79块钱
雷电猴有30块钱
雷电猴给了吉吉喵10块钱
吉吉喵有89块钱
雷电猴有20块钱
*/
我们常用的console.log和console.clear, 就是全局对象console里的log方法和clear方法
数组(array)
数组可以允许你将数据按顺序存储在一个变量中
let arr = ['吉吉喵', 3, 100, 'a', 'b']
console.log(`${ arr[0] }有${ arr[2] }块钱`) //获取数组对应位置的元素
console.log(arr.length) //获取数组长度
条件分支(conditional branching)
if/else
let hp = 50
if (hp >= 80) {
console.log('你处于健康状态')
}
else if (hp > 50) {
console.log('你处于轻伤状态')
}
else if (hp > 0) {
console.log('你处于重伤状态')
}
else {
console.log('你已阵亡')
}
switch
let gunType = '冲锋枪'
let gunConfig
switch (gunType) {
case '冲锋枪':
gunConfig = {
atk:3,//攻击力
range:7,//射程
fireRate:10,//射速
}
break
case '狙击枪':
gunConfig = {
atk:10,//攻击力
range:12,//射程
fireRate:2,//射速
}
break
case '散弹枪':
gunConfig = {
atk:6,//攻击力
range:5,//射程
fireRate:4,//射速
}
break
default://如果gunType没有匹配以上3类枪械
gunConfig = {
atk:2,//攻击力
range:5,//射程
fireRate:6,//射速
}
break
}
循环语句(loops)
for…of
按顺序遍历数组中每一个元素
let arr = ['吉吉喵', 3, 100, 'a', 'b']
for (const e of arr) { //遍历arr中的每一个元素
console.log(e)
}
/*
吉吉喵
3
100
a
b
*/
while
当条件满足时会一直保持循环
let i = 10
while (i-- > 0) {
console.log(i)
}
for…in
遍历对象中的每一个属性名
let obj = {a: 1, b: 2, c: 3}
for (const k in obj) {
const v = obj[k]
//k为属性名, v为属性值
console.log(k, v) //输出 k 和 v
}
for
常用的循环语句
for (let i=0; i<10; i++) {
console.log(i)
}
对象的类(class)
定义一个类
class Gamer {//定义一个名为Gamer的类
constructor(name, money){//构造方法, 每次创建实例都会执行
this.name = name
this.money = money
}
giveMoney(receiver, n) {//giveMoney方法, 把钱转到另一个对象
receiver.money += n
this.money -= n
console.log(`${this.name}给了${receiver.name}${n}块钱`)
}
display() {
console.log(`${this.name}有${this.money}块钱`)
}
}
let gamer1 = new Gamer('吉吉喵', 99) //new 可以将类实例化, 将参数传到构造方法里
let gamer2 = new Gamer('雷电猴', 20)
gamer1.display()
gamer2.display()
gamer1.giveMoney(gamer2, 20)
gamer1.display()
gamer2.display()
子类(subclass)
子类可以继承父类的的方法和属性
class Attacker extends Gamer {//Attacker是Gamer的子类, Gamer是Attacker的父类
constructor(name, money, atk){
super(name, money)//super()是父类的构造方法
this.atk = atk
}
display() {//重写父类的display方法
super.display()//通过super.xxx访问父类的方法
console.log(`${this.name}有${this.atk}攻击力`)
}
}
let gamer1 = new Attacker('吉吉喵', 99, 3)
let gamer2 = new Attacker('雷电猴', 20, 10)
gamer1.display()
gamer2.display()
gamer1.giveMoney(gamer2, 20)
gamer1.display()
gamer2.display()
语法小技巧
解构赋值(destructing assignment)
简化取出对象里边的数据的写法
let arr = [1,2,3]
let obj = {a:88, b:99}
let {a, b} = obj
//简化了 let a = obj.a
// let b = obj.b
let [c, d, e] = arr
//简化了 let c = arr[0]
// let d = arr[1]
// let e = arr[2]
console.log(a,b,c,d,e)
内置方法(built-in methods)
数组
数组内置方法的详细内容可参考 这个页面
let arr = [1,2,3,4,5]
arr.length
arr.concat()
arr.copyWithin()
arr.fill()
arr.find()
arr.findIndex()
arr.lastIndexOf()
arr.pop()
arr.push()
arr.reverse()
arr.shift()
arr.unshift()
arr.slice()
arr.sort()
arr.splice()
arr.includes()
arr.indexOf()
arr.join()
arr.keys()
arr.entries()
arr.values()
arr.forEach()
arr.filter()
arr.flat()
arr.flatMap()
arr.map()
arr.every()
arr.some()
arr.reduce()
arr.reduceRight()
arr.toLocaleString()
arr.toString()
字符串
字符串内置方法的详细内容可参考 这个页面
let str = 'abcde'
str.length
str.anchor()
str.big()
str.blink()
str.bold()
str.charAt()
str.charCodeAt()
str.codePointAt()
str.concat()
str.endsWith()
str.fontcolor()
str.fontsize()
str.fixed()
str.includes()
str.indexOf()
str.italics()
str.lastIndexOf()
str.link()
str.localeCompare()
str.match()
str.matchAll()
str.normalize()
str.padEnd()
str.padStart()
str.repeat()
str.replace()
str.search()
str.slice()
str.small()
str.split()
str.strike()
str.sub()
str.substr()
str.substring()
str.sup()
str.startsWith()
str.toString()
str.trim()
str.trimStart()
str.trimLeft()
str.trimEnd()
str.trimRight()
str.toLocaleLowerCase()
str.toLocaleUpperCase()
str.toLowerCase()
str.toUpperCase()
str.valueOf()
str.replaceAll()
对象
对象内置方法的详细内容可参考 这个页面
Object.assign()
Object.getOwnPropertyDescriptor()
Object.getOwnPropertyDescriptors()
Object.getOwnPropertyNames()
Object.getOwnPropertySymbols()
Object.is()
Object.preventExtensions()
Object.seal()
Object.create()
Object.defineProperties()
Object.defineProperty()
Object.freeze()
Object.getPrototypeOf()
Object.setPrototypeOf()
Object.isExtensible()
Object.isFrozen()
Object.isSealed()
Object.keys()
Object.entries()
Object.fromEntries()
Object.values()
数学
数学内置方法的详细内容可参考 这个页面
let arr = [1,2,3,4,5]
arr.length
arr.concat()
arr.copyWithin()
arr.fill()
arr.find()
arr.findIndex()
arr.lastIndexOf()
arr.pop()
arr.push()
arr.reverse()
arr.shift()
arr.unshift()
arr.slice()
arr.sort()
arr.splice()
arr.includes()
arr.indexOf()
arr.join()
arr.keys()
arr.entries()
arr.values()
arr.forEach()
arr.filter()
arr.flat()
arr.flatMap()
arr.map()
arr.every()
arr.some()
arr.reduce()
arr.reduceRight()
arr.toLocaleString()
arr.toString()
JSON
JSON.parse()
JSON.stringify()