精讲typescript从入门到入土
前言
TypeScript是一种由Microsoft开发的编程语言,它是JavaScript的超集,意味着它可以编写与JavaScript完全兼容的代码,并且可以扩展其功能。TypeScript的主要目标是提供类型安全性和更好的可维护性,使得开发大型复杂应用程序更加容易。在本文中,我们将介绍入门TypeScript的基础知识。
安装TypeScript
首先,我们需要安装TypeScript。可以使用npm包管理器全局安装TypeScript:
bashCopy code
npm install -g typescript
安装完成后,可以通过输入以下命令来检查是否安装成功:
bashCopy code
tsc --version
编写第一个TypeScript程序
让我们从一个简单的“Hello, World!”程序开始。创建一个名为hello.ts
的文件,然后在其中编写以下代码:
typescriptCopy code
function sayHello(name: string) {console.log(`Hello, ${name}!`);
}sayHello("TypeScript");
保存并退出文件。然后使用以下命令将其编译为JavaScript:
bashCopy code
tsc hello.ts
执行上述命令后,将生成一个名为hello.js
的文件。要运行这个程序,可以在命令行中输入以下命令:
bashCopy code
node hello.js
输出应该是:
bashCopy code
Hello, TypeScript!
在上面的代码中,我们定义了一个名为sayHello
的函数,它有一个参数name
,类型为字符串。在函数体内,我们使用console.log
打印出“Hello, ”和name
的值,并使用模板字面量将它们组合在一起。最后,我们调用这个函数并将参数设置为“TypeScript”。
类型注释
TypeScript的主要特点之一是提供类型注释,可以在编译时检查类型错误。在上面的示例中,我们定义了一个name
参数的类型为字符串,这是通过在函数声明中使用冒号和类型名称来实现的。
TypeScript支持多种类型注释,包括:
- 基本类型:如数字、字符串、布尔值、null、undefined、void等。
- 对象类型:如数组、元组、枚举、类等。
- 函数类型:如函数声明、函数表达式、箭头函数等。
例如,以下是一个函数声明的完整类型注释:
typescriptCopy code
function add(x: number, y: number): number {return x + y;
}
在这个示例中,我们定义了两个参数x
和y
,它们的类型都是数字,并且函数返回值的类型也是数字。
元组
元组是一种特殊的数组类型,它可以存储多个类型不同的值。在 TypeScript 中,我们可以使用元组来表示一组有序的值。
下面是一个简单的示例:
typescriptCopy code
let tuple: [string, number, boolean] = ["hello", 42, true];console.log(tuple[0]); // "hello"
console.log(tuple[1]); // 42
console.log(tuple[2]); // true
在这个示例中,我们定义了一个名为tuple
的元组,它具有三个元素,分别是string
、number
和boolean
类型的值。我们使用索引访问元组中的元素。
枚举
TypeScript支持枚举,它是一组具有名称的常量。下面是一个简单的示例:
typescriptCopy code
enum Color {Red,Green,Blue
}let color: Color = Color.Red;
console.log(color); // 0let colorName: string = Color[1];
console.log(colorName); // "Green"
在这个示例中,我们定义了一个名为Color
的枚举,它有三个值:Red
、Green
和Blue
,它们分别对应0、1和2。我们可以使用枚举的值来声明变量,或使用枚举的名称和值之间的映射来获取名称。
泛型
TypeScript支持泛型,它允许我们编写可重用的代码,可以适用于多种类型。下面是一个简单的示例:
typescriptCopy code
function identity<T>(arg: T): T {return arg;
}let result = identity<string>("Hello");
console.log(result); // "Hello"
在这个示例中,我们定义了一个名为identity
的函数,它接受一个类型为T
的参数,并返回同样的类型。我们使用了类型参数来指定函数应该适用于哪种类型。
接口
接口类型是一种抽象的数据类型,用于描述对象的形状和结构,可以被用作对象的类型注解,以确保对象的属性和方法符合指定的形状。
下面是一个简单的接口类型的示例:
typescriptCopy code
interface Person {name: string;age: number;
}
上述代码定义了一个名为 Person
的接口类型,它有两个属性 name
和 age
,分别表示人的姓名和年龄。在 TypeScript 中,我们可以使用这个接口类型来定义一个符合该接口类型要求的对象:
typescriptCopy code
const person: Person = { name: "Tom", age: 18 };
上述代码定义了一个 person
对象,它符合 Person
接口类型的要求,因为它有 name
和 age
两个属性,分别为字符串和数字类型。
使用接口类型可以提高代码的可读性和可维护性,因为它能够明确指定对象的属性和方法的类型和结构。
类型别名
类型别名是一种给类型起别名的方式,用于提高代码的可读性和可维护性。在 TypeScript 中,我们可以使用type
关键字来定义类型别名。
下面是一个简单的示例:
typescriptCopy code
type Point = {x: number;y: number;
};function distance(p1: Point, p2: Point) {const dx = p1.x - p2.x;const dy = p1.y - p2.y;return Math.sqrt(dx * dx + dy * dy);
}const p1: Point = { x: 0, y: 0 };
const p2: Point = { x: 3, y: 4 };console.log(distance(p1, p2)); // 5
在这个示例中,我们定义了一个名为Point
的类型别名,它表示一个具有x
和y
属性的点。我们定义了一个distance
函数,它接受两个Point
类型的参数,并返回它们之间的距离。我们创建了两个Point
对象,并计算它们之间的距离。
命名空间
TypeScript支持命名空间,它允许我们将相关的代码组织在一起,并避免名称冲突。下面是一个简单的示例:
typescriptCopy code
namespace Shapes {export class Rectangle {width: number;height: number;constructor(width: number, height: number) {this.width = width;this.height = height;}getArea() {return this.width * this.height;}}
}let rectangle = new Shapes.Rectangle(10, 20);
console.log(rectangle.getArea()); // 200
在这个示例中,我们定义了一个名为Shapes
的命名空间,它包含一个名为Rectangle
的类。我们使用export
关键字将Rectangle
类暴露出去,以便其他地方可以访问它。注意,在使用命名空间时,我们需要使用namespace
关键字来定义命名空间,并使用.
运算符来访问其成员。
联合类型
联合类型表示一个值可以是多种类型之一。它使用|
符号将多个类型组合在一起。下面是一个简单的示例:
typescriptCopy code
function display(value: string | number) {console.log(value);
}display("Hello"); // "Hello"
display(42); // 42
在这个示例中,我们定义了一个名为display
的函数,它接受一个参数,类型可以是string
或number
。我们可以传递一个string
或number
类型的值来调用该函数。
交叉类型
交叉类型表示一个值具有多个类型的属性。它使用&
符号将多个类型组合在一起。下面是一个简单的示例:
typescriptCopy code
interface A {a: number;
}interface B {b: string;
}type AB = A & B;let ab: AB = {a: 42,b: "Hello"
};console.log(ab); // { a: 42, b: "Hello" }
在这个示例中,我们定义了两个接口A
和B
,它们分别定义了a
和b
属性。我们使用交叉类型A & B
创建了一个新类型AB
,它具有a
和b
属性。我们创建了一个对象ab
,它具有a
和b
属性,并将其打印到控制台。
索引类型
索引类型允许我们使用字符串或数字类型的索引来访问对象的属性。它使用[]
符号表示。下面是一个简单的示例:
typescriptCopy code
interface Person {name: string;age: number;[key: string]: any;
}let person: Person = {name: "Alice",age: 30,address: "123 Main St."
};console.log(person.address); // "123 Main St."
在这个示例中,我们定义了一个名为Person
的接口,它具有name
和age
属性,并使用字符串类型的索引来允许其他任意属性。我们创建了一个名为person
的对象,并为其添加了一个address
属性。我们可以使用person.address
来访问该属性的值。
类型断言
类型断言是 TypeScript 中一种强制类型转换的机制,可以使我们的代码更加灵活、精确和安全。在 TypeScript 中,我们可以使用as
关键字来进行类型断言。
下面是一个简单的示例:
typescriptCopy code
const value: unknown = "hello";
const message = (value as string).toUpperCase();console.log(message); // "HELLO"
在这个示例中,我们定义了一个名为value
的变量,并给它赋值一个字符串。我们使用as
关键字将value
断言为string
类型,并调用toUpperCase
方法,并把它的结果赋值给message
变量。我们输出了message
的值。
可选链操作符
在 JavaScript 中,如果我们访问一个对象的属性,而这个属性不存在,就会返回 undefined
。例如:
javascriptCopy code
const person = { name: 'John', age: 30 }
console.log(person.job.title) // Uncaught TypeError: Cannot read property 'title' of undefined
在这个例子中,由于 person
对象中没有 job
属性,所以访问 person.job.title
时就会出现错误。
为了避免这种错误,TypeScript 3.7 引入了可选链操作符 ?.
。它可以让我们在访问一个对象的属性时,避免因为属性不存在而导致的错误。例如:
typescriptCopy code
const person = { name: 'John', age: 30 }
console.log(person.job?.title) // undefinedconst job = { title: 'Software Engineer' }
person.job = job
console.log(person.job?.title) // Software Engineer
在第一次使用 person.job?.title
时,由于 person
对象中没有 job
属性,所以直接返回 undefined
,不会报错。
keyof 操作符
keyof
操作符用于获取一个类型的所有属性名称组成的联合类型,它可以使我们的代码更加灵活和可维护。在 TypeScript 中,我们可以使用keyof
操作符来定义泛型类型和访问对象属性。
下面是一个简单的示例:
typescriptCopy code
interface Person {name: string;age: number;address: string;
}type PersonKeys = keyof Person; // "name" | "age" | "address"function getPropertyValue<T, K extends keyof T>(obj: T, key: K) {return obj[key];
}const person: Person = {name: "Tom",age: 18,address: "Beijing",
};console.log(getPropertyValue(person, "name")); // "Tom"
console.log(getPropertyValue(person, "age")); // 18
console.log(getPropertyValue(person, "address")); // "Beijing"
在这个示例中,我们定义了一个Person
接口,它包含了name
、age
和address
三个属性。我们使用keyof
操作符定义了一个名为PersonKeys
的类型,它是Person
接口的所有属性名称组成的联合类型。我们定义了一个名为getPropertyValue
的函数,它接受一个泛型类型参数T
和一个名为K
的属性名称参数。在函数内部,我们使用泛型类型参数和keyof
操作符来访问对象的属性,并返回属性的值。
装饰器
装饰器是一种特殊的声明,可以附加到类声明、方法、属性或参数上,用来描述类的行为。它们为我们提供了一种简洁明了的方式,以声明式的方式添加或修改类的行为。
装饰器在 TypeScript 中是一个实验性的功能,需要启用experimentalDecorators
编译选项。
下面是一个简单的示例:
typescriptCopy code
function log(target: any, key: string, descriptor: PropertyDescriptor) {const originalMethod = descriptor.value;descriptor.value = function (...args: any[]) {console.log(`Calling ${key} with args ${args}`);const result = originalMethod.apply(this, args);console.log(`Returned value: ${result}`);return result;};return descriptor;
}class Calculator {@logadd(x: number, y: number) {return x + y;}
}const calculator = new Calculator();console.log(calculator.add(2, 3)); // "Calling add with args [2, 3]", "Returned value: 5", 5
在这个示例中,我们定义了一个名为log
的装饰器函数,它接受三个参数:目标类、方法名和方法描述符。我们使用装饰器修饰了Calculator
类中的add
方法,使其在调用时输出日志。我们创建了一个Calculator
实例,并调用了add
方法。
字面量类型
字面量类型是一种特殊的类型,它表示一个确定的值,可以用于增强代码的类型安全性。在 TypeScript 中,我们可以使用字面量类型来定义字符串、数字和布尔值等类型。
下面是一个简单的示例:
typescriptCopy code
type Gender = "male" | "female";interface Person {name: string;age: number;gender: Gender;
}const person: Person = { name: "Alice", age: 30, gender: "female" };console.log(person); // { name: "Alice", age: 30, gender: "female" }
在这个示例中,我们定义了一个名为Gender
的字面量类型,它只允许取值"male"
或"female"
。我们定义了一个名为Person
的接口,它具有name
、age
和gender
三个属性,其中gender
的类型为Gender
。我们创建了一个Person
对象,并输出它的值。
类型推断
类型推断是 TypeScript 中一种自动推断类型的机制,可以使我们的代码更加简洁、易读和可维护。在 TypeScript 中,编译器会根据上下文自动推断表达式的类型,并把它们作为类型注解。
下面是一个简单的示例:
typescriptCopy code
const message = "hello";
console.log(message.toUpperCase()); // "HELLO"
在这个示例中,我们定义了一个名为message
的常量,并给它赋值一个字符串。我们调用了toUpperCase
方法,并输出了它的结果。TypeScript 编译器会自动推断message
的类型为string
,并把它作为类型注解。
空值和未定义值
在 JavaScript 中,有两种特殊的值,分别是null
和undefined
。在 TypeScript 中,它们分别对应了null
和undefined
两种类型。
下面是一个简单的示例:
typescriptCopy code
let x: null = null;
let y: undefined = undefined;
在这个示例中,我们定义了两个变量x
和y
,分别赋值为null
和undefined
。
never 类型
never
类型表示那些永远不会发生的值,它可以用于增强代码的类型安全性和可维护性。在 TypeScript 中,never
类型通常用于以下两种情况:
- 当一个函数抛出异常或无限循环时,它的返回类型就是
never
类型。 - 当一个函数返回类型是一个永远不会实现的类型,它的返回类型也是
never
类型。
下面是一个简单的示例:
typescriptCopy code
function throwError(message: string): never {throw new Error(message);
}function infiniteLoop(): never {while (true) {}
}
在这个示例中,我们定义了两个函数,一个是throwError
函数,它接受一个字符串参数message
,并抛出一个错误。另一个是infiniteLoop
函数,它会无限循环。这两个函数的返回类型都是never
类型。
条件类型
条件类型是一种根据一个条件来选择类型的方式,它可以在 TypeScript 中实现一些高级类型操作。在 TypeScript 中,我们可以使用extends
关键字和条件语句来定义条件类型。
下面是一个简单的示例:
typescriptCopy code
type IsString<T> = T extends string ? true : false;type Result1 = IsString<string>; // true
type Result2 = IsString<number>; // false
在这个示例中,我们定义了一个名为IsString
的条件类型,它接受一个泛型类型参数T
。如果T
类型是字符串类型,则条件类型的结果为true
,否则为false
。我们还定义了两个变量Result1
和Result2
,它们分别是IsString<string>
和IsString<number>
类型的结果。
相关文章:
精讲typescript从入门到入土
前言 TypeScript是一种由Microsoft开发的编程语言,它是JavaScript的超集,意味着它可以编写与JavaScript完全兼容的代码,并且可以扩展其功能。TypeScript的主要目标是提供类型安全性和更好的可维护性,使得开发大型复杂应用程序更加…...
typora-beta-0.11.18版本又提示过期的解决方案
很实用,所以照搬一下下面的作者的回答,省得以后再找~~~ 知乎的作者来源如下: 作者:吴小皓 链接:typora打开报错:This beta version of Typora is expired, please download and install a newer version …...
WebUI自动化测试框架搭建(二十)-优化:测试对象无法连接或出现异常时,请更新本文作为测试对象
(二十)-测试对象无法连接或出现异常时,请更新本文作为测试对象 1 测试对象说明2 源代码下载3 学生管理系统配置安装3.1 解压打开3.2 安装依赖3.3 安装mysql数据库3.4 修改项目数据库配置3.4 安装数据库连接工具Navicat3.5 导入数据库脚本4 运行学生管理系统5 系统查看1 测试…...
【FATE联邦学习】standalone版Fateboard修改配置
背景&做法 很多其他程序(比如vscode的code server)也会使用这个 127 0 0 1:8080 socket进行通信,这样就没办法远程用vscode去开发了,所以需要修改下Fateboard的socket配置。官方文档中也给出了如何修改配置 The default data…...
分享一个应急响应web日志:access.log文件分析小工具
有时做应急响应的时候,需要提取web日志如access.log日志文件来分析系统遭受攻击的具体原因,由于开源的工具并不是很好用,所以自己用Python3写了一个简单的日志分析工具。先介绍一下access.log日志access.log日志文件记录了所有目标对Web服务器…...
windows注册服务非常实用
方式一:使用Windows自带的sc命令 1、使用管理员权限打开cmd窗口 2、注册服务命令: sc create 服务名 binpath 程序所在路径 type own start auto displayname 服务显示名称 sc create redis binpath d:\tools\redis-x64-5.0.14\redis-server.exe type …...
蓝桥dfs专题
1、dfs 路径打印 小明冒充X星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 n x n 个方格。【如图1.png】所示。 按习俗,骑士要从西北角走到东南角。 可以横向或纵向移动,但不能…...
[ 网络 ] 应用层协议——HTTPS协议原理
目录 1.HTTPS是什么 2.加密技术 2.1什么是加密 2.2为什么要加密 2.3加密处理防止被窃听 3.常见的加密方式 对称加密 非对称加密 4.数据摘要&&数据指纹 5.数字签名 6.HTTPS的工作过程探究 方案1——只是用对称加密 方案2——只进行非对称加密 方案3——双方…...
http协议如何操作
、HTTP协议(超文本传输协议) 1.1、http协议是一个基于“请求与响应”模式的、无状态的应用层协议。 http协议采用URL作为定位网络资源的标识。 1.2、URL格式 http://host[:port][path] host:合法的Internet主机域名或IP地址 port:端口号…...
ESP Insights 系列文章
ESP Insights 系列 #1 | 远程查看设备信息,快速解决固件问题 ESP Insights 是一个可远程查看设备固件运行状态和日志的平台,能够帮助开发人员快速定位并解决固件问题。 ESP Insights 系列 #2 | 新增功能 最新版本优化了用户界面、修复了系统稳定性&am…...
如何提高爬虫工作效率
单进程单线程爬取目标网站太过缓慢,这个只是针对新手来说非常友好,只适合爬取小规模项目,如果遇到大型项目就不得不考虑多线程、线程池、进程池以及协程等问题。那么我们该如何提升工作效率降低成本? 学习之前首先要对线程&#…...
React结合Drag API实现拖拽示例详解
Drag API React中的Drag API是用于实现拖放功能的API。该API由React DnD库提供,可用于实现拖放操作,例如将元素从一个位置拖动到另一个位置。 React DnD库提供了两种Drag API:基于HTML5的拖放API和自定义实现的拖放API。 基于HTML5的拖放AP…...
【华为OD机试java、python、c++、jsNode】新学校选址(100%通过+复盘思路)
代码请进行一定修改后使用,本代码保证100%通过率。本文章提供java、python、c++、jsNode四种代码。复盘思路在文章的最后 题目描述 为了解新学期学生暴涨的问题,小乐村要建立所新学校, 考虑到学生上学安全问题,需要所有学生家到学校的距离最短。 假设学校和所有学生家都走在…...
Nacos配置中心,分组配置参考,以及python、go、bash客户端连接获取
Nacos使用说明 nacos官方网站 https://nacos.io/zh-cn/docs/v2/what-is-nacos.html 1、基本配置说明 nacosIP地址:http://xxxxx:8848/nacos/ 服务管理端登录账号:nacos XXX Java最小配置,其他客户端可参考,配置可对应到第三章…...
node-red中有关用户登录,鉴权,权限控制的流程解析
前言 默认地,node-red编辑器可以被任何访问的用户操作,包括修改节点,流数据,重新部署流。 这种默认的部署方式只适用于运行在可靠的网络中。下面我就给大家介绍一下,在公网上部署node-red后,如何对其进行安全加固和权限验证。 主要分为三部分 开启https权限保护编辑器和…...
MQTT协议-使用CONNECT报文连接阿里云
使用网络调试助手发送CONNECT报文连接阿里云 参考:https://blog.csdn.net/daniaoxp/article/details/103039296 在前面文章介绍了如何组装CONNECT报文,以及如何计算剩余长度 CONNECT报文:https://blog.csdn.net/weixin_46251230/article/d…...
每日学术速递3.8
CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Unleashing Text-to-Image Diffusion Models for Visual Perception 标题:释放用于视觉感知的文本到图像扩散模型 作者:Wenliang Zhao, Yongming Rao, Zuya…...
测牛学堂:软件测试之接口测试理论基础总结
接口概念 接口:系统之间数据交互的通道。 这个系统,可以是外部和内部,也可以是两个内部系统之间的通道。 比如我们前端的登录信息,主要是用户名和密码,它通过接口传递给后端,后端校验以后,把结…...
基于土壤数据与机器学习算法的农作物推荐算法代码实现
1.摘要 近年来,机器学习方法在农业领域的应用取得巨大成功,广泛应用于科 学施肥、产量预测和经济效益预估等领域。根据土壤信息进行数据挖掘,并在此基础上提出区域性作物的种植建议,不仅可以促进农作物生长从而带来经济效益&#…...
python中html必备基础知识
<!DOCTYPE html>此标签表示这是一个html文件<heml lang"en">向搜索引擎表示该页面是html语言,并且语言为英文网站,其"lang"的意思就是“language”,语言的意思,而“en”即表示English<head>…...
【专项训练】前言:刻意练习,不断的过遍数才是王道
如何精通一个领域? 拆分知识点刻意练习:每个区域的基础动作分解训练和反复刻意练习反馈(主动反馈、被动反馈、及时反馈)任何知识体系都是一颗树,一定要梳理成思维导图,明确知识与知识之间的关系! 通过7-8周密集训练,练好基本功,彻底攻克LeetCode! 严格执行五毒神掌!…...
【Leetcode】反转链表 合并链表 相交链表 链表的回文结构
目录 一.【Leetcode206】反转链表 1.链接 2.题目再现 3.解法A:三指针法 二.【Leetcode21】合并两个有序链表 1.链接 2.题目再现 3.三指针尾插法 三.【Leetcode160】相交链表 1.链接 2.题目再现 3.解法 四.链表的回文结构 1.链接 2.题目再现 3.解法 一.…...
M1、M2芯片Mac安装虚拟机
目录前言一、安装二、网络设置三、连接SSH客户端前言 一直想着给M1 Mac上安装虚拟机,奈何PD收费,找的破解也不稳定,安装上镜像就起不来。 注:挂长久的分享莫名其妙被封,需要安装包请私信我。 一、安装 虚拟机选择&a…...
算法刷题-只出现一次的数字、输出每天是应该学习还是休息还是锻炼、将有序数组转换为二叉搜索树
只出现一次的数字(位运算、数组) 给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 说明: 你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗&…...
详解专利对学生、老师和企业员工、创业者、积分落户、地方补助的好处
大家好,我是英子老师。作为一名知识产权专家,深耕于专利行业十余年,具有丰富的专利工作经验:曾在大型专利代理机构从事专利代理工作、专利质检工作(抽查代理机构的专利代理人的撰写质量并评分);之后在知名上市企业、行业龙头企业担任高级专利工程师的职位,主要工作内容…...
Python图像处理:频域滤波降噪和图像增强
图像处理已经成为我们日常生活中不可或缺的一部分,涉及到社交媒体和医学成像等各个领域。通过数码相机或卫星照片和医学扫描等其他来源获得的图像可能需要预处理以消除或增强噪声。频域滤波是一种可行的解决方案,它可以在增强图像锐化的同时消除噪声。 …...
智能手机高端“酣战”,转机在何方?
经过多年发展,如今全世界有七成手机由中国制造,但在利润最丰厚的高端市场,国产厂商在很长一段时间之内都是形单影只,曾经一度跻身高端的“华为”因为封禁成了“绝唱”。 华为“失声”高端之后,其他一众国产厂商或主动…...
K8s pod 动态弹性扩缩容 HPA
一、概述Horizontal Pod Autoscaler(HPA,Pod水平自动伸缩),根据平均 CPU 利用率、平均内存利用率或你指定的任何其他自定义指标自动调整 Deployment 、ReplicaSet 或 StatefulSet 或其他类似资源,实现部署的自动扩展和…...
C++中的类简要介绍
文章目录前言一、什么是类什么是对象1.类的概述2.对象的概述二、如何创建使用类三、class和struct创建类时的区别1.访问级别2.继承方式总结前言 本篇文章讲给大家介绍一个C中重要的概念,了解了这个概念大家就明白了为什么C会叫做面向对象编程了。 一、什么是类什么…...
项目管理工具DHTMLX Gantt灯箱元素配置教程:只读模式
DHTMLX Gantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表。可满足项目管理应用程序的大部分开发需求,具备完善的甘特图图表库,功能强大,价格便宜,提供丰富而灵活的JavaScript API接口,与各种服务器端技术&am…...
Hdi做指数网站/网络整合营销4i原则是指
今天我们来画折线图 效果图以下为模拟数据[{"time":19,"text":"入\n院\n19\n时\n11\n分","position":42,"cellMin":29.0,"cellSplit":0.2,"type":"text","color":"red",…...
济南市建设监理有限公司网站/搜索引擎优化内容包括哪些方面
转载自:http://blog.csdn.net/cheny_com/article/details/6592493 各种思路和顺序都试过。 最开始时先编写Model,毕竟Model是所有一切的基础,再说没有Model,Controller里边用到该怎么办。 后来改成先编写View,View才是…...
dede后台网站主页/广州seo优化费用
程序员 需要什么ssd固态Solid State Drives (SSDs) are the lighting fast counterpart to the traditional hard drive with moving parts. But are they a good match for you? Read on as we demystify SSDs. 固态驱动器(SSD)是具有移动部件的传统硬盘驱动器的快速照明替代…...
网站建设能/什么叫seo网络推广
1:java中比较对象有所不同,因为比较的通常都是句柄,所以 Integer in1 new Integer(1);Integer in2 new Integer(1);System.out.println(in1 in2); // compares the handle not the value这样打代码返回的是false,因为对象的句…...
wordpress技术cms主题/企业网站seo公司
目录 Codeforces 1114A.Got Any Grapes?B.Yet Another Array Partitioning TaskC.Trailing Loves (or Loeufs?)D.Flood Fill(区间DP)E.Arithmetic Progression(交互 二分 随机化)F.Please, another Queries on Array?(线段树 欧拉函数)Codeforces 1114比赛链接 貌似最近平均…...
上海百姓网/seo公司 上海
360浏览器for mac下载官方最新版360浏览器mac版是360官方专门为mac os平台用户推出的一款高速浏览器,全新正式版来袭,安全、爽快,全面保护Mac用户上网安全;本站提供360浏览器mac版下载新版加速来袭,8级加速,…...