赖同学


  • 首页

  • 标签

  • 分类

  • 归档

  • 站点地图

  • 留言

  • 搜索

为什么我要放弃javaScript数据结构与算法(第一章)—— JavaScript简介

发表于 August 10, 2018|分类于 javaScript相关|阅读次数: –
字数统计: 2524|阅读时间: 13 min

数据结构与算法一直是我算比较薄弱的地方,希望通过阅读《javaScript 数据结构与算法》可以有所改变,我相信接下来的记录不单单对于我自己有帮助,也可以帮助到一些这方面的小白,接下来让我们一起学习。

第一章 JavaScript 简介

众所周知,JavaScript 是一门非常强大的编程语言,不仅可以用于前端开发,也适用于后端开发,其中 Node.js 就是背后的技术。

JavaScript 数据结构与算法

那么学习 JavaScript 数据结构与算法有什么作用呢?首要的作用是数据结构和算法可以高效地解决常见的问题,这影响着代码的质量。其次,在计算机科学里面,算法是基础的概念,是面试的时候的重头戏。

环境搭建

浏览器是最简单的开发环境,下载个 Firefox 或者 Chrome 都可以。

下载好浏览器之后可以搭载一个 Web 服务器,方式有很多种, 也都很简单,可以自行百度。下面介绍 Node.js.

使用 Node.js 搭建服务器

首先到Node.js 官网下载和安装 Node.js。然后打开终端应用,输入一下命令安装

npm i http-server -g

嫌安装过程慢的,可以安装一下淘宝镜像,就可以用 cnpm 来安装, 具体安装过程如下

npm install -g cnpm --registry=https://registry.npm.taobao.org

安装完淘宝镜像后,就可以用 cnpm 了

cnpm i http-server -g

安装好 http-server 后, cd 进入到目标路径后输入 http-server 就可以在本地运行服务器。

同样的还有 anywhere ,也可以达到同样的目的。

cnpm i anywhere -g

这样,整个环境就搭建好了。

JavaScript 基础

变量

变量能保存的数据可以在需要时设置、更新和摄取。赋给变量的值都有对应的类型。

JavaScript 的类型有数字、字符串、布尔值、函数和对象。还有 undefined 和 null,以及数组、日期和正则表达式。

注意:JavaScript 不是强语言类型,跟后面我要学的 TypeScript 不一样,这意味着声明变量的时候不用指定变量的类型

调试输出变量值的时候有三种简单的方法

| 方法 | 描述 | | ------------------- '| ---------------------------------- |' | alert("x") | 将输出到浏览器的警示窗口 | | console.log("x") | 把文本输出到调试工具的 Console 标签 | | document.write("x") | 直接输出到 HTML 页面里并被浏览器呈现 |

变量作用域

作用域指在编写的算法函数时,我们能够访问的变量(在使用时,函数作用域也可以是一个函数)。有局部变量和全局变量两种。

操作符

在 JavaScript 里有算数操作符、赋值操作符、比较操作符、逻辑操作符、位操作符、一元操作符和其他操作符。

算数操作符

| 算数操作符 | 描述 | | ---------- '| ---- |' | + | 加法 | | - ' | 减法 |' | * | 乘法 | | / | 除法 | | % | 取余 | | ++ | 递增 | | - '- | 递减 |'

赋值操作符

| 赋值操作符 | 描述 | | ---------- '| ---------------------------- |' | = | 赋值 | | += | (x += y) == ( x = x + y ) | | -= | (x -= y) == ( x = x - 'y ) |' | _= | (x _= y) == ( x = x * y ) | | /= | (x /= y) == ( x = x / y ) | | %= | (x %= y) == ( x = x % y ) |

比较操作符

| 比较操作符 | 描述 | | ---------- '| -------- |' | == | 相等 | | === | 全等 | | != | 不等 | | > | 大于 | | >= | 大于等于 | | < | 小于 | | <= | 小于等于 |

逻辑操作符

| 逻辑操作符 | 描述 | | ---------- '| ---- |' | && | 与 | | 双竖线 | 或 | | ! | 非 |

位操作符

| 位操作符 | 描述 | | -------- '| ---- |' | & | 与 | | 单竖线 | 或 | | ~ | 非 | | ^ | 异或 | | << | 左移 | | >> | 右移 |

typeof 操作符可以返回变量或者表达式的类型。

console.log(typeof num); // number
console.log(typeof "num"); // string
console.log(typeof true); // boolean
console.log(typeof [1, 2, 3]); //object
console.log(
  typeof {
    num: "2",
  }
); // object

真值和假值

true 和 false 在 javascript 中的转换如下表

| 数值类型 | 转换成布尔值 | | --------- '| ------------------------------------------- |' | undefined | false | | null | false | | 布尔值 | true 或者 false | | 数字 | +0/-0/NaN 都是 false 其他是 true | | 字符串 | 如果字符串是空(长度是 0)为 false, 其他为 true | | 对象 | true |

相等操作符

| 类型(x) | 类型(y) | 结果 | | ------------ '| ------------ | ------------------- |' | null | undefined | true | | undefined | null | true | | 数字 | 字符串 | x == toNumber(y) | | 字符串 | 数字 | toNumber(x) == y | | 布尔值 | 任何类型 | toNumber(x) == y | | 任何类型 | 布尔值 | x == toNumber(y) | | 字符串或数字 | 对象 | x == toPrimitive(y) | | 对象 | 字符串或数字 | toPrimitive(x) == y |

如果 x 和 y 是相同类型,javaScript 会比较它们的值或者是对象值。其他没有在上述表格中的情况都会返回 false。

toNumber 和 toPrimitive 方法都是内部的,并根据以下表格对其进行估值

toNumber 方法对不同类型返回的结果如下表

| 值类型 | 结果 | | --------- '| ------------------------------------------------------------ |' | undefined | NaN | | null | +0 | | 布尔值 | true=>1 或者 false=>+0 | | 数字 | 数字对应的值 | | 字符串 | 将字符串解析成数字。如果字符串中包含字母,就返回 NaN, 如果是由数字字符组成的,就转换成数字 | | 对象 | Number(toPrimitive(value)) |

toPrimitive 方法对不同类型返回的结果如下:

| 值类型 | 结果 | | ------ '| ------------------------------------------------------------ |' | 对象 | 如果对象的 valueOf 方法的结果是原始值,返回原始值。如果对象的 toString 方法返回原始值,就返回这个值,其他情况都返回一个操作。 |

"x" ? true : false; // true
"x"(NaN) == true(1); // false
"x"(NaN) == false(+0); // false

那么 === 操作符呢?

相比较起来就简单很多,如果比较的两个值类型不同,比较的结果就是 false , 如果类型相同,就会根据下面的表格进行判断。

| 类型(x) | 值 | 结果 | | ----------- '| ----------------------------- | ---- |' | 数字 | x和y数值相同(但不是 NaN) | true | | 字符串 | x和y是相同的字符 | true | | 布尔值 | x和y同是 false 或者 true | true | | 对象 | x和y引用同个对象 | true |

"x" === true; // false
"x" === "x"; // true
var person1 = {
  name: "John",
};
var person2 = {
  name: "John",
};
person1 === person2; // false 不同的对象

控制结构

条件语句支持 if...else 和 switch 。循环支持 while 、 do...while 和 for 。

条件语句

实例:判断 month

`

1.
if ...
else
if (month === 1) {
    console.log('January');
} else if (month === 2) {
    console.log('February');
}...
else {
    ...
}

2.
switch
switch (month) {
    case 1:
        console.log('January');
        break;
    case 2:
        console.log('February');
        break;
        ...
    default:
        consolo.log(...)
}

3. && 与 || 运算符(month == 1 && console.log('January')) || (month == 2 && console.log('February')) || ...

    4. 三元运算符
month == 1 ? console.log('January') : month == 2 ? console.log('February') : ...
    `
循环

处理数组元素的时候经常会用到循环。

实例:输出 0 到 9

1.
for
for (var i = 0; i < 10; i++) {
    console.log(i);
}

2.
while
var i = 0;
while (i < 10) {
    console.log(i);
    i++
}

3. do ...
    while
var i = 0;
do {
    console.log(i);
    i++:
} while (i < 10)

函数

函数在 JavsScript 中是很重要的。分为用传参数、return 或者是直接调用。

JavaScript 面向对象编程

JavaScript 里的对象就是普通名值对的集合。创建一个普通对象有两种方式。

// 第一种方式:
var obj = new Object();

// 第二种方式
obj = {
    name: {
        first: "赖",
        last: "xx"
    },
    address: "jj"
}

可以看出,声明 JavaScript 对象的时候,键值对中的键就是对象的属性,值就是对应属性的值。

在面向对象编程(OOP)中,对象是类的实例。一个类定义了对象的特征。我们会创建很多类来表示算法和数据结构。

// 声明一个类来表示书
function Book(title, pages, isbn) {
  this.title = title;
  this.pages = pages;
  this.isbn = isbn;
}

// 实例化这个类
var book = new Book("title", "pages", "isbn");
//可以修改或者是访问对象的属性
book.title; // 书名
book.title = "new title"; //修改书名

// 类可以包含函数,可以声明和使用函数
Book.prototype.printTitle = function () {
  console.log(this.title);
};
book.printTitle();

// 也可以直接在类的定义里声明函数
function Book(title, pages, isbn) {
  this.title = title;
  this.pages = pages;
  this.isbn = isbn;
  this.printIsbn = function () {
    console.log(this.isbn);
  };
}
book.printIsbn();

注意:在原型的例子里, printTitle 函数只会创建一次,在所有实例中共享。如果在类的定义里声明,则每个实例都会创建自己的函数副本。使用原型方法可以节约内存和降低实例化的开销。不过原型方法只能声明公共函数和属性,而类定义可以声明只在类内部访问的私有函数和属性。

调试工具

Firefox 和 Chrome 都支持调试。这里有一个了解 谷歌开发者工具的好教程, 可以自己了解一下。

ECMAScript 概述

ECMAScript 是一种语言的规范,具体想知道的可以 点击这里

ECMAScript6 的功能

因为在别的地方有做了更详细的笔记,在这里就不累述,详情点击下面。

点我

补充:使用类进行面向对象编程

function Book(title, pages, isbn) {
    this.title = title;
    this.pages = pages;
    this.isbn = isbn;
}
Book.prototype.printTitle = function() {
    console.log(this.title);
}
ES6:

    class Book {
        constructor(title, pages, isbn) {
            this.title = title;
            this.pages = pages;
            this.isbn = isbn;
        }
        printTitle() {
            console.log(this.title);
        }
    }

继承

除了新的声明类的方式,类的继承也有简化的语法。

clas ITBook extends Book {
    constructor(title, pages, isbn, technology) {
        super(title, pages, isbn);
        this.technology = technology;
    }
    printTitle() {
        console.log(this.title);
    }
}

我们可以用 extends 关键字扩展一个类并继承它的行为,在构造函数中,我们可以通过 super 关键字引用父类的构造函数。

小结

本章主要讲了如何搭建简单的开发环境,也稍微地把 javaScript 基础知识、和 ECMAScript6 过了一遍,为接下来的数据结构——数组做铺垫。

书籍链接: 学习 JavaScript 数据结构与算法

javaScript数据结构与算法
深入浅出HTTP,从开始到放弃(第三章)—— HTTP 报文内的 HTTP消息
深入浅出HTTP,从开始到放弃(第二章)—— 简单的 HTTP 协议
  • 文章目录
  • 站点概览
  1. 1.第一章 JavaScript 简介
    1. 1.JavaScript 数据结构与算法
    2. 2.环境搭建
      1. 1.使用 Node.js 搭建服务器
    3. 3.JavaScript 基础
      1. 1.变量
        1. 1.变量作用域
      2. 2.操作符
        1. 1.算数操作符
        2. 2.赋值操作符
        3. 3.比较操作符
        4. 4.逻辑操作符
        5. 5.位操作符
      3. 3.真值和假值
      4. 4.相等操作符
    4. 4.控制结构
      1. 1.条件语句
      2. 2.循环
    5. 5.函数
    6. 6.JavaScript 面向对象编程
    7. 7.调试工具
    8. 8.ECMAScript 概述
    9. 9.ECMAScript6 的功能
      1. 1.补充:使用类进行面向对象编程
    10. 10.小结
© 2018 — 2023赖彬鸿
1.6k
载入天数...载入时分秒...
0%