• JavaScript


    1 开始

    1.1 什么是JavaScript

    JavaScript可被用于:

    • 前端开发人员
    • 后端开发人员
    • 全栈开发人员

    JavaScript能做什么?

    • Web/Mobile应用
    • 实时网络应用
    • 命令行工具
    • 游戏

    JavaScript运行于什么地方?

    • 浏览器,JavaScript引擎(FireFox: SpiderMonkey, Chrome: V8)
    • Node, 浏览器外运行JavaScript的运行时环境

    JavaScript vs ECMAScript?

    • ECMAScript只是一个规范,第一版发行于1997年,最新的版本目前是ES2015/ES6
    • Javascript是一种被ECMAScript确认符合该规范的编程语言

    1.2 配置开发环境

    编辑器:

    • Visual Studio Code
    • Sublime Text
    • Atom

    Node.js为JavaScript提供了一个浏览器之外的运行环境,请下载并安装方便学习。

    VS Code安装完成后,命令行执行下面指令:

    $ cd ~
    $ mkdir apps
    $ cd apps
    $ mkdir demo01
    $ cd demo01
    $ code .

    进入VSCode后,添加"index.html"文件,并拷贝以下代码:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <h1>Hello, World!</h1>
    </body>
    </html>

    安装VS Code的扩展插件Live Server,完成后以Live Server打开index.html正常则安装成功。

    1.3 浏览器中的JavaScript

    可以把JavaScript嵌入到HTML文件head或body中的任何部分,如下是把JavaScript嵌入到HTML中的body部分:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <h1>Hello, World!</h1>
        <script>
            // JavaScript代码
            console.log('Hello, World');
        </script>
    </body>
    </html>

    Live Server中打开index.html然后按F12并点击Console标签查看控制台输出:Hello, World

    1.4 分离HTML和JavaScript

    VS Code环境中,index,html同目录下,添加index.js,并添加以下代码到该index.js文件:

    console.log("Hello, My World!");

    VS Code环境,回到index.html并更新index.html为以下内容:

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
    </head>
    <body>
        <h1>Hello, World!</h1>
        <script src="index.js"></script>
    </body>
    </html>

    以Live Server打开index.html文件,F12后并点击Console标签查看控制台输出。

    1.5 Node中的JavaScript运行环境

    如果node.js正确安装完成,则可以从VS Code的终端直接运行index.js,方法如下:

    • 从VS Code菜单选择终端,在终端运行下面命令运行index.js
    $ node index.js
    Hello, My World!

    2 JavaScript基础

    2.1 变量

    JavaScript使用变量在内存中临时存储数据:

    • var 关键字用于声明一个变量
    • let 关键字与var相似也声明一个变量

    更新index.js为以下代码:

    let name;
    console.log(name);

    命令行(终端)运行index.js:

    $ node basics.js
    undefined

    终端输出undefined表示name变量没有定义。更新index.js为:

    let name = 'Jinzd';
    console.log(name);

    终端运行node index.js控制台输出Jinzd

    小结:

    • 变量名不能是JavaScript保留字
    • 变量名应该有意义
    • 变量名不能以数字开始
    • 变量名不能包含空格或减号“-”
    • 变量名是大小写敏感的
    • 变量命名规则通常有Camel规则(firstName)或Pascal规则(FirstName)

    2.2 常量

    普通变量的值设定之后是可以被更改的:

    let interestRate = 0.3;
    interestRate = 1;
    console.log(interestRate);

    而常量的值在设置之后不能再被修改:

    const interestRate = 0.3;
    interestRate = 1;
    console.log(interestRate);

    运行上面代码会产生错误信息:Assignment to constant variable.

    2.3 JavaScript原生数据类型和引用类型

    JavaScript原生数据类型包括:

    • String
    • Number
    • Boolean
    • undefined
    • null

    JavaScript还大量使用引用类型:

    • Reference Types

    更新index.js为以下内容,并以node运行它:

    let name = 'jinzd';     // string literal
    let age = 30;           // number literal
    let isApproved = true;  // boolean literal
    let isChecked = false;  // boolean literal
    
    let firstName;              // undefined
    let lastName = undefined;   // undefined
    
    let middleName = null;          // typeof middleName => object
    console.log(typeof middleName); // object

    2.4 动态类型

    JavaScript是一种动态语言,与之相对的是静态语言,如:Java,静态语言变量声明后其类型不能再改变;而动态语言的变量类型则可以被改变。

    静态语言:

    string name = "Jinzd";

    动态语言:

    let v = 'demo';    // string literal
    console.log(typeof v);
    v = 30;
    console.log(typeof v);

    2.5 Objects

    对象属于引用类型,引用类型包括:

    • Object
    • Array
    • Function

    按下更新index.js并在控制台以node运行它:

    let person = {
        name: 'Mosh',
        age: 30
    };
    
    console.log(person);
    
    person.name = 'John';
    console.log(person);
    
    person['name'] = 'Mary';
    console.log(person);
    
    let section = 'name';
    person[section] = 'Jim'
    console.log(person);

    2.6 Arrays 数组

    参看以下数组例子,并更新到index.js然后以node运行它:

    let selectColors = ['red', 'blue'];
    console.log(selectColors);
    
    console.log(selectColors[0]);
    
    selectColors[2] = 'yellow';
    console.log(selectColors);
    
    selectColors[3] = 5;
    console.log(selectColors);
    
    selectColors[2] = true;
    console.log(selectColors);
    
    console.log(typeof selectColors);   // object
    
    console.log(selectColors.length);   // 4

    2.7 Functions函数

    function greet(name, lastName) {
        console.log('Hello, ' + name + ' ' + lastName);
    }
    
    greet('John', 'Smith');
    greet('mary');

    更新上代码到index.js然后以node运行它,输出:

    Hello, John Smith
    Hello, mary undefined

    2.8 函数类型

    函数包括两类:

    • 函数执行一个任务没有返回值
    • 函数执行一组计算任务然后返回一个值

    执行任务无返回值函数参看2.7节,下函数执行任务并返回值:

    function square(number) {
        return number * number;
    }
    
    console.log(square(4));

    3 操作符

    3.1 JavaScript操作符

    JavaScript包括以下操作符:

    • 算术操作符(Arithmetic)
    • 赋值操作符(Assignment)
    • 比较操作符(Comparison)
    • 逻辑操作符(Logical)
    • 位操作符(Bitwise)

    3.2 算术操作符

    let x = 10;
    let y = 3;
    
    console.log(x + y);
    console.log(x - y);
    console.log(x * y);
    console.log(x / y);
    console.log(x % y);
    console.log(x ** y);
    
    // increment
    console.log(++x);   // first + then output
    console.log(x++);   // output then +
    
    console.log(--x);   // first - then output
    console.log(x--);   // output then -

    3.3 赋值操作符

    let x = 10;
    
    x = x + 5;
    x += 5;
    
    x = x * 3;
    x *= 3;

    3.4 比较操作符

    let x = 1;
    
    console.log(x > 0);
    console.log(x >= 1);
    console.log(x < 1);
    console.log(x <= 1);
    
    console.log(x === 1);
    console.log(x !== 1);

    3.5 等号运算符

    // strict equality (same type and same value)
    console.log(1 === 1)        // true
    console.log('1' === 1)      // false
    
    // lose equality (check value only)
    console.log(1 == 1)         // true
    console.log('1' == 1)       // true
    console.log(true == 1)       // true

    3.6 三元运算符(Ternary Operator)

    let points  = 110;
    let type = points > 100 ? 'gold' : 'silver';
    
    console.log(type);

    3.7 逻辑运算符

    Logical AND (&&)
    Logical OR (||)
    Logical NOT (!)

     3.8 非布尔值逻辑运算

    console.log(false || true);     // true
    console.log(false || 'Mosh');   // Mosh
    console.log(false || 1);        // 1
    
    /*
    below are Falsy (false) values
    
    undefined
    null
    0
    false
    ''
    NaN (Not a Number)
    
    Anything that is not Falsy -> Truthy
    */

    短路:

    let userColor = 'red';
    let defaultColor = 'blue';
    let currntColor = userColor || defaultColor;
    
    console.log(currntColor);       // red
    
    userColor = undefined;
    currntColor = userColor || defaultColor;
    console.log(currntColor);       // blue

    3.9 位操作符

    • 1 = 00000001
    • 2 = 00000010
    • 3 = 00000011

    And(&) Or(|),参看下面代码:

    const readPermission = 4;
    const writePermission = 2;
    const execPermission = 1;
    
    let myPermission = 0;
    
    myPermission = myPermission | readPermission | writePermission | execPermission;
    
    let message = myPermission & readPermission ? 'yes' : 'no';
    
    console.log(message)

    3.10 运算优先级

    4 流程控制

    4.1 if ... else

    let hour = 10;
    
    if (hour > 6 && hour < 12)
        console.log('Good morning');
    else if (hour >= 12 && hour < 18)
        console.log('Good afternoon');
    else
        console.log('Good evening');

    4.2 switch ... case

    let role = 'moderator';
    
    switch (role) {
        case 'guest':
            console.log('Guest User');
            break;
    
        case 'moderator':
            console.log('Moderator User');
            break;
        
        default:
            console.log('default user');
    }

    4.3 for loops

    4.3.1 for

    for (let i = 0; i < 5; i++) {
        console.log("Hello, World.");
    }

    4.3.2 while

    let i = 0;
    
    while (i < 5) {
        console.log(i);
        i++;
    }

    4.3.3 do ... while

    let i = 0;
    
    do {
        console.log(i);
        i++;
    } while (i < 5);

    4.3.4 无限循环

    do {
        console.log("xxx");
    } while (true);

    4.3.5 for ... in

    const person = {
        name: 'jinyc',
        age: 20
    };
    
    for (let key in person)
        console.log(key, person[key]);
    
    let colors = ['red', 'green', 'blue'];
    
    for (let index in colors)
        console.log(index, colors[index]);

    4.3.6 for ... of

    let colors = ['red', 'green', 'blue'];
    
    for  (let color of colors)
        console.log(color);

    4.3.7 Max

    function GetMax(num1, num2) {
        return (num1 > num2) ? num1 : num2;
    }
    
    console.log(GetMax(2, 5));

    4.3.8 Landscape and Portrait

    function isLandscape(width, height) {
        return (width > height);
    }
    
    console.log(isLandscape(500, 1000));

    4.3.9 FizzBuzz

    function fizzBuzz(input) {
        if (typeof input !== 'number')
            console.log(NaN);
        else if (input % 3 === 0 && input % 5 !== 0)
            console.log('Fizz');
        else if (input % 3 !== 0 && input % 5 === 0)
            console.log('Buzz');
        else if (input % 3 === 0 && input % 5 === 0)
            console.log('FizzBuzz');
        else
            console.log(input);
    }
    
    fizzBuzz(15);

    4.3.10 Check Speed

    function checkSpeed(speed) {
        const speedLimit = 70;
        const kmPerPoint = 5;
    
        if (typeof speed !== 'number')
            return NaN;
    
        if (speed <= speedLimit)
            return 'OK'
    
        let points = Math.floor((speed - speedLimit) / kmPerPoint);
    
        if (points >= 12)
            return "suspended"
        else
            return points;
    }
    
    console.log(checkSpeed(60));
    console.log(checkSpeed(80));
    console.log(checkSpeed(60));
    console.log(checkSpeed(120));
    console.log(checkSpeed(140));

     4.4 break and continue

    done

    4.5 Truthy & Falsy

    以下是一些 falsy 值:

    • underfined
    • null
    • ''
    • false
    • 0
    • NaN
    function countTruthy(array) {
        let cnt = 0;
    
        for (let v of array)
            if (v)
                cnt++;
    
        return cnt;
    }
    
    let a = [1, 2, 3];
    
    console.log(countTruthy(a));

    4.6 显示属性

    let b = {
        name: 'jinzd',
        age: 40
    };
    
    function showProperties(s) {
        for (let key in s)
            console.log(key, s[key]);
    }
    
    showProperties(b);

    上示例也可用于数组。

    4.7 3和5倍数的和

    console.log(sum(10));
    
    function sum(limit) {
        let sum = 0;
    
        for (let i = 0; i <= limit; i++)
            if (i % 3 === 0 || i % 5 === 0)
                sum += i;
    
        return sum;
    }

    4.8 成绩

    const marks = [80, 80, 50];
    
    console.log(calculateGrade(marks));
    
    function calculateGrade(marks) {
        let avg = getAverage(marks);
        
        if (avg >= 90) return 'A';
        if (avg >= 80) return 'B';
        if (avg >= 70) return 'C';
        if (avg >= 60) return 'D';
        return 'F';
    }
    
    function getAverage(array) {
        let sum = 0;
        let avg = 0;
    
        for (let value of array)
            sum += value;
    
        return sum / array.length;
    }

    4.9 Starts

    let cnt = 10;
    
    showStars(cnt);
    
    function showStars(cnt) {
        for (let i = 1; i <= cnt; i++) {
            let star = '';
    
            for (let j = 1; j <= i; j++)
                star += '*';
    
            console.log(star);
        }
    }

    4.10 Prime Numbers 质数

    showPrimes(200);
    
    function showPrimes(limit) {
        for (let number = 2; number <= limit; number++) {
            let isPrime = true;
    
            for (let factor = 2; factor < number; factor++) {
                if (number % factor === 0) {
                    isPrime = false;
                    break;
                }
            }
    
            if (isPrime)
                console.log(number);
        }
    }

    5 对象 Objects

    5.1 对象基础 Object Basics

    // OOP
    const circle = {
        radius: 1,
        location: {
            x: 1,
            y: 1
        },
        isVisible: true,
        draw: function() {
            console.log('draw');
        }
    };
    
    circle.draw(); // method

    5.2 工厂函数

    function createCircle(radius) {
        return {
            radius,
            draw() {
                console.log("draw");
            }
        };
    }
    
    const circle1 = createCircle(1);
    console.log(circle1);
    circle1.draw();
    
    const circle2 = createCircle(2);
    console.log(circle2);
    circle2.draw();

    5.3 构造函数

    使用 new 关键字

    function Circle(radius) {
        this.radius = radius;
        this.draw = function() {
            console.log('draw');
        }
    }
    
    const circle = new Circle(2);
    
    circle.draw();
  • 相关阅读:
    1571:【例 3】凸多边形的划分
    1570:【例 2】能量项链
    2.25
    2.24 T2 牧场 by greens 1s 128M (pasture.cpp)
    2.24 T1 P3515 [POI2011]Lightning Conductor
    白嫖视频的方法
    2.24 T3 P1912 [NOI2009] 诗人小G
    2.24
    斜率优化
    windy数的补充——数位dp中如何求[a,b]区间内的方案数
  • 原文地址:https://www.cnblogs.com/jinzd/p/14057905.html
Copyright © 2020-2023  润新知