01 - 基础语法

开始应付暑期实训(自己太菜找不到实习),选的是Cocos2D引擎相关,要学习Javascript和Typescript。有了Javascript的基础,Ts就容易掌握了,因此先看看Javascript的基础语法。

输出

提供三种方式输出:

//三种输出的方式
//1.在网页的内部输出
document.write("helloworld");
//2.弹窗里面输出
alert("helloworld");
//3.控制台输出(重点)
console.log("helloworld");

变量

声明变量

可用varlet关键字声明一个变量,推荐用let

var id = 1;
let name = "LiHua";

它俩的区别如下:

  1. var定义变量存在变量提升的问题

  2. var定义变量是全局作用域,let定义变量是块作用域

基本数据类型

number类型(包括整数int和浮点数float),boolean布尔值,string字符串,function函数,object特殊对象类。

运算符

​ 1.算术运算符:+ - * / %

​ 2.比较运算符:> < >= <= == != === !==

​ 3.逻辑运算符:&& || !

&&:所有小条件成立,整个大的条件才成立

||:只要有一个小条件成立,整个大的条件就成立

!:取反

​ 其中 有短路操作。

​ 4.赋值运算符:+= -= *= /= %=

​ 5.++ --

​ 6.三目运算符:表达式1 ? 表达式2 : 表达式3

=====

==判断相等,存在隐式转换,如果数据类型不一样,但是值一样,判断也是成立的

===判断相等,数据类型和值都相同

语句

判断语句

判断语句有ifswitch

// if
if(判断条件){
    判断条件成立的时候执行的代码块;
}
else{
    判断条件不成立,执行else的代码块;
}

// switch
switch(){
    case :
        break;
    case :
        break;
    default:
        break;
}

循环语句

循环语句有forwhile

// for
for(表达式1;表达式2;表达式3){
    循环体;
}
// 表达式1:初始化语句,可以省略的
// 表达式2:循环终止的判断条件
// 表达式3:增量,让循环趋于结束,可以省略
// 上面所说的可以省略,表达是意思是可以在其他地方体现

// while
while(判断条件){

}

// do-while
do{
    循环体;
}while(判断条件)

函数

普通函数

一般函数可这样定义和调用:

function test() {
    
}
test();

如果普通函数想获得调用者的this,需要使用call()bind()apply()

  • 对于直接调用的场合,使用call()

    this.a = 123;
    test();				// this.a = undefined
    test().call(this);	// this.a = 123
  • 对于稍后调用的场合,使用bind()apply()

    function test()
    {
        console.log(this.a);
    }.bind(this, args...);
    // .apply(this, [arg1, arg2, ...]);

回调函数

匿名函数和箭头函数属于回调函数,用于传参等操作,让其他函数去执行它们,而不是主动去调用。

它们的语法如下:

// 匿名函数
let test = function() {
    
}
test();

// 箭头函数
let func = () => {
    
}
func();

箭头函数可将this传入函数体内部

函数闭包

看下面一段代码:

function test(){
    let num = 0;
    function temp(){
        num++;
        return num;
    }
    return temp;
}

let temp2 = test();
console.log("num1:" + temp2());
console.log("num2:" + temp2());
console.log("num3:" + temp2());
// 输出1 2 3

test()是一个函数闭包,其中有变量num。在执行tmp2 = test()时初始化num并返回内部函数temp(),之后运行temp2()就是在运行temp(),且使用外部变量num

数组

是特殊的object类型。

定义

let arr = [1, 2, 3];

增删改查

使用.push()方法往数组末尾添加元素:

arr.push(99);

使用.splice(要插入的索引,删除的长度,插入的数据...)往数组任意位置添加元素:

arr.splice(2,0,88,99);

// 使用.splice()从索引2删除两个元素
arr.splice(2,2);
// 删除所有元素
arr.length = 0;

// 使用.splice(), 将索引2的元素修改成99
arr.splice(2, 1, 99);
// 直接通过索引修改
arr[2] = 99;

通过索引[ ]访问。

遍历

通过索引遍历:

for(let i = 0; i < arr.length; i++){
    let num = arr[i];
    console.log(arr[i]);
}

通过迭代器遍历:

for(let num of arr){
    console.log(num);
}

对象

定义

let player = {
    hp: 50,
    mp: 100
}

对象利用键值对存储数据,键是字符串类型,值是任意类型。

增改查

// 增
player["atk"] = 50;
player.atk = 50;

// 改
player.mp = 200;
player["mp"] = 200;

// 查
// 对象访问属性的方式
// (1)对象名.属性名
// (2)对象名["属性名"]
// 用途:如果存在该属性的情况下,改数据或者查找数据,如果不存在这个属性,插入数据

遍历

for(let key in player){
    console.log(key);
    console.log(player[key]);
}

this指向问题

谁调用thisthis就指向谁。例如下方代码player2.print使用的是player1.print,但输出的是李四。

//this指向问题:谁调用指向谁
let player1 = {
    name: "张三",
    print: function () {
        console.log(this.name);
    }
}

let player2 = {
    name: "李四"
}

player2.print = player1.print;
player2.print();

浅/深拷贝

一般都是浅拷贝:

let player1 = {
    hp: 100
};
let player2 = player1;
player1.hp = 50;

console.log(player2.hp);// 50

为了让player1player2独立,可以用深拷贝,新建一个空对象,将player1所有属性赋值到player2中:

let player2 = {};
player2.hp = player1.hp;
player1.hp = 50;

console.log(player2.hp);// 100