当前位置: 首页 > backend >正文

JAVAscript的发展及八大数据类型

JAVA的又由来及发展

什么是JavaScript?

JavaScript一种直译式脚本语言,是一种动态类型、弱类型、基于原型的语言,内置支持类型。它的解释器被称为JavaScript引擎,为浏览器的一部分,广泛用于客户端的脚本语言,最早是在 HTML(标准通用标记语言下的一个应用)网页上使用,用来给HTML网页增加动态功能。

JavaScript的组成部分?

ECMAScript,描述了该语言的语法和基本对象。
文档对象模型(DOM),描述处理网页内容的方法和接口。
浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口。

JavaScript的历史

它最初由Netscape的Brendan Eich设计。JavaScript是甲骨文公司的注册商标。Ecma国际以JavaScript为基础制定了ECMAScript标准。JavaScript也可以用于其他场合,如服务器端编程。完整的JavaScript实现包含三个部分:ECMAScript,文档对象模型,浏览器对象模型。

Netscape在最初将其脚本语言命名为LiveScript,后来Netscape在与Sun合作之后将其改名为JavaScript。JavaScript最初受Java启发而开始设计的,目的之一就是“看上去像Java”,因此语法上有类似之处,一些名称和命名规范也借自Java。但JavaScript的主要设计原则源自Self和Scheme。JavaScript与Java名称上的近似,是当时Netscape为了营销考虑与Sun微系统达成协议的结果。为了取得技术优势,微软推出了JScript来迎战JavaScript的脚本语言。为了互用性,Ecma国际(前身为欧洲计算机制造商协会)创建了ECMA-262标准(ECMAScript)。两者都属于ECMAScript的实现。尽管JavaScript作为给非程序人员的脚本语言,而非作为给程序人员的脚本语言来推广和宣传,但是JavaScript具有非常丰富的特性。

发展初期,JavaScript的标准并未确定,同期有Netscape的JavaScript,微软的JScript和CEnvi的ScriptEase三足鼎立。1997年,在ECMA(欧洲计算机制造商协会)的协调下,由Netscape、Sun、微软、Borland组成的工作组确定统一标准:ECMA-262。
JavaScript诞生
1994年,网景公司(Netscape)发布了Navigator浏览器0.9版。这个版本的浏览器只能用来浏览,不具备与访问者互动的能力。……网景公司急需一种网页脚本语言,使得浏览器可以与网页互动。

网页脚本语言到底是什么语言?网景公司当时有两个选择:一个是采用现有的语言,比如Perl、Python、Tcl、Scheme等等,允许它们直接嵌入网页;另一个是发明一种全新的语言。

这两个选择各有利弊。第一个选择,有利于充分利用现有代码和程序员资源,推广起来比较容易;第二个选择,有利于开发出完全适用的语言,实现起来比较容易。

到底采用哪一个选择,网景公司内部争执不下,管理层一时难以下定决心。

就在这时,发生了另外一件大事:1995年Sun公司将Oak语言改名为Java,正式向市场推出。

Sun公司大肆宣传,许诺这种语言可以”一次编写,到处运行”(Write Once, Run Anywhere),它看上去很可能成为未来的主宰。

网景公司动了心,决定与Sun公司结成联盟。它不仅允许Java程序以applet(小程序)的形式,直接在浏览器中运行;甚至还考虑直接将Java作为脚本语言嵌入网页,只是因为这样会使HTML网页过于复杂,后来才不得不放弃。

总之,当时的形势就是,网景公司的整个管理层,都是Java语言的信徒,Sun公司完全介入网页脚本语言的决策。因此,Javascript后来就是网景和Sun两家公司一起携手推向市场的,这种语言被命名为”Java+script”并不是偶然的。

发明者
Brendan Eich。1995年4月,网景公司录用了他。

Brendan Eich的主要方向和兴趣是函数式编程,网景公司招聘他的目的,是研究将Scheme语言作为网页脚本语言的可能性。

仅仅一个月之后,1995年5月,网景公司做出决策,未来的网页脚本语言必须”看上去与Java足够相似”,但是比Java简单,使得非专业的网页作者也能很快上手。这个决策实际上将Perl、Python、Tcl、Scheme等非面向对象编程的语言都排除在外了。

Brendan Eich被指定为这种”简化版Java语言”的设计师。

但是,他对Java一点兴趣也没有。为了应付公司安排的任务,他只用10天时就把JAVAscript制作了出来。

javascript的八大数据类型

JavaScript 目前包含八种数据类型,其中可以分成两大类。

基本数据类型(原始值):

Number(数值,包含NaN)
String(字符串)
Boolean(布尔值)
Undefined(未定义/未初始化)
Null(空对象)
Symbol(独一无二的值,ES6 新增)
BigInt (大整数,能够表示超过 Number 类型大小限制的整数,ES 2020新增)
引用数据类型(引用值):

Object(对象。Array/数组 和 function/函数 也属于对象的一种)

Number

Number 类型包括整数和浮点数值。也支持不同进制的表示方式。

String

字符串可以用双引号( " )、单引号( ’ )或反引号(`)标识。

Boolean

Boolean 类型只有两个字面值:true 和 false。这两个值与数字值不是一回事,因此 true 不一定等于 1,而 false 也不一定等于 0。

Undefined

Undefined 类型只有一个值,即undefined。在声明变量但是没有初始化时,这个变量的值就是undefined。

Null

Null 类型也是只有一个值,即null。null表示一个空对象指针,因此使用 typeof 操作符检测 null 值时会返回"object"。

Symbol

Symbol 是 ES6 中引入的新基本类型,表示独一无二的值。Symbol 值通过 Symbol() 函数生成。
该函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,使得在控制台显示,或者转换为字符串进行判断时容易区分。

Object

对象是一组数据和方法的无序集合,所有实例的基础是Object 类型。

JavaScript 数据类型和数据结构

编程语言都具有内建的数据结构,但各种编程语言的数据结构常有不同之处。本文试图列出 JavaScript 语言中内建的数据结构及其属性,它们可以用来构建其他的数据结构。同时尽可能地描述与其他语言的不同之处。

JavaScript 语言概述提供了对常见数据类型的类似总结,但是和其他的语言有着更多的比较。

动态和弱类型

JavaScript 是一种有着动态类型的动态语言。JavaScript 中的变量与任何特定值类型没有任何关联,并且任何变量都可以分配(重新分配)所有类型的值:

let foo = 42; // foo 现在是一个数值
foo = "bar"; // foo 现在是一个字符串
foo = true; // foo 现在是一个布尔值

JavaScript 也是一个弱类型语言,这意味着当操作涉及不匹配的类型是否,它将允许隐式类型转换,而不是抛出一个错误。

const foo = 42; // foo is a number
const result = foo + "1"; // JavaScript coerces foo to a string, so it can be concatenated with the other operand
console.log(result); // 421

强制隐式转换是非常方便的,但是如果开发者不打算转换,或者打算向另一个方向转换(例如,字符串转数值而不是数值到字符串),则会存在潜在的隐患。对于 symbol 和 BigInt,JavaScript 总是不允许某些隐式类型转换。

原始值

除了 Object 以外,所有类型都定义了表示在语言最低层面的不可变值。我们将这些值称为原始值。

除了 null,所有原始类型都可以使用 typeof 运算符测试。typeof null 返回 “object”,因此必须使用 === null 来测试 null。

除了 null 和 undefined,所有原始类型都有它们相应的对象包装类型,这为处理原始值提供可用的方法。例如,Number 对象提供向 toExponential() 这样的方法。当在原始值上访问属性时,JavaScript 会自动将值包装到相应的包装对象中,并访问对象上的属性。然而,在 null 或 undefined 上访问属性时,会抛出 TypeError 异常,这需要采用可选链运算符。

类型 typeof 返回值 对象包装器

Undefined	"undefined"	N/A
Boolean	"boolean"	Boolean
Number	"number"	Number
BigInt	"bigint"	BigInt
String	"string"	String
Symbol	"symbol"	Symbol

对象包装器类的参考页面包含关于每个类型可用方法和属性类型的更多用法,以及原始类型本身的详细描述。

Null 类型

Null 类型只有一个值:null。

undefined 类型
Undefined 类型只有一个值:undefined。

从概念上讲,undefined 表示没有任何值,null 表示没有任何对象(这也可以构成 typeof null === “object” 的接口)。当某些东西没有值时,该语言通常默认为 undefined:

没有值(return;)的 return 语句,隐式返回 undefined。
访问不存在的对象属性(obj.iDontExist),返回 undefined。
变量声明时没有初始化(let x;),隐式初始化为 undefined。
许多如 Array.prototype.find() 和 Map.prototype.get() 的方法,当没有发现元素时,返回 undefined。
null 在核心语言中使用频率少得多。最重要的地方是原型链的末端——其次是与原型交互的方法,如 Object.getPrototypeOf()、Object.create() 等,接受或返回 null 而不是 undefined。

null 是一个关键字,但是 undefined 是一个普通的标识符,恰好是一个全局属性。在实践中,这两个差异很小,因为 undefined 不应该被重新定义或者遮蔽。

Boolean 类型

Boolean 类型表示一个逻辑实体并且包括两个值:true 和 false。

布尔值通常用于条件运算,包括三元运算符、if…else、while 等。

Number 类型

Number 类型是一种基于 IEEE 754 标准的双精度 64 位二进制格式的值。它能够存储 2-1074(Number.MIN_VALUE)和 21024(Number.MAX_VALUE)之间的正浮点数,以及 -2-1074 和 -21024 之间的负浮点数,但是它仅能安全地存储在 -(253 − 1)(Number.MIN_SAFE_INTEGER)到 253 − 1(Number.MAX_SAFE_INTEGER)范围内的整数。超出这个范围,JavaScript 将不能安全地表示整数;相反,它们将由双精度浮点近似表示。你可以使用 Number.isSafeInteger() 检查一个数是否在安全的整数范围内。

±(2-1074 到 21024) 范围之外的值会自动转换:

大于 Number.MAX_VALUE 的正值被转换为 +Infinity。
小于 Number.MIN_VALUE 的正值被转换为 +0。
小于 -Number.MAX_VALUE 的负值被转换为 -Infinity。
大于 -Number.MIN_VALUE 的负值被转换为 -0。
+Infinity 和 -Infinity 行为类似于数学上的无穷大,但是有一些细微的区别;更多细节,参见 Number.POSITIVE_INFINITY 和 Number.NEGATIVE_INFINITY。

Number 类型仅有一个具有多个表现形式的值:0 同时表示为 -0 和 +0(其中 0 是 +0 的别名)。实际上,这两者之间几乎没有区别;例如,+0 === -0 是 true。然而,当你除以 0 的时候,你要注意到这一点:

Copy to Clipboardconsole.log(42 / +0); // Infinity
console.log(42 / -0); // -Infinit

NaN数值

(“Not a Number”)是一个特殊种类的数值,当算术运算的结果不表示数值时,通常会遇到它。它也是 JavaScript 中唯一不等于自身的值。

虽然 number 在概念上是一个“数学的值”,并且总是隐式的编码为浮点类型,但是 JavaScript 提供了位运算符。当应用位运算符时,number 首先转换为 32 位整数。

备注: 尽管位运算符可以使用位掩码来表示单个数值中的几个布尔值,但通常这不是一个好的做法。JavaScript 提供了表示一组布尔值的其他方法(如布尔数组,或将布尔值分配给命名属性的对象)。位掩码也往往会使代码更难读取、理解和维护。

可能有必要在非常受限的环境中使用此类技术,例如在试图应对本地存储的限制时,或在极端情况下(例如当网络上的每个位计数时)。只有当这项技术是优化尺寸的最后一项措施时,才应考虑这项技术。

BigInt 类型
BigInt 类型在 Javascript 中是一个数字的原始值,它可以表示任意大小的整数。使用 BigInt,你可以安全地存储和操作巨大的整数,甚至超过 Number 的安全整数限制(Number.MAX_SAFE_INTEGER)。

BigInt 是通过将 n 附加到整数末尾或调用 BigInt() 函数来创建的。

此示例演示了增加 Number.MAX_SAFE_INTEGER 返回预期结果的位置:

J

BigInt

const x = BigInt(Number.MAX_SAFE_INTEGER); // 9007199254740991n
x + 1n === x + 2n; // false because 9007199254740992n and 9007199254740993n are unequal// Number
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true because both are 9007199254740992

你可以使用大多数运算符为 BigInt 工作,包括 +、*、-、** 和 %——唯一被禁止的是 >>>。BigInt 并不是严格等于有着相同数学值的 Number,但是它是宽松的。

BigInt 值并不总是更精确的,也不总是比 number 精确,因为 BigInt 不能表示分数,但是可以表示更准确的大整数。这两种类型都包含各自的类型,并且它们不能相互替代。如果 BigInt 值在算术表达式中与正则数值混合,或者它们相互隐式转换,则抛出 TypeError。

String 类型
String 类型表示文本数据并编码为 UTF-16 代码单位的 16 位无符号整数值序列。字符串中的每个元素在字符串中占据一个位置。第一个元素的索引为 0,下一个是索引 1,依此类推。字符串的长度是它的元素的数量。字符串的长度是其中的 UTF-16 代码单元的数量,这可能与 Unicode 字符的实际数量不符;更多细节参见 String 参考页面。

JavaScript 字符串是不可变的。这意味着一旦字符串被创建,就不可能修改它。字符串方法基于当前字符串的内容创建一个新的字符串——例如:

使用 substring() 获取原始的子字符串。
使用串联运算符(+)或 concat() 将两个字符串串联。
注意代码中的“字符串类型”!
使用字符串来表示复杂的数据可能很诱人。这样做会带来短期的好处:

容易通过字符串拼接来构造复杂的字串符。
字符串容易被调试(你看到的打印的内容始终是字符串)。
字符串通常是许多 API 的常见标准(input 字段、local storage 中的值,以及 XMLHttpRequest 使用 responseText 等作为响应)而且这些 API 可能只能与字符串一同使用。
使用约定,字符串一般可以用来表示任何数据结构。但这并不总是一个好主意。例如,使用一个分隔符,可以模拟一个列表(而 JavaScript 数组可能更适合)。不幸的是,当分隔符用于列表中的元素时,列表就会被破坏。这时可以选择转义字符,等等。所有这些都需要约定,并造成不必要的维护负担。

表示文本数据时候推荐使用字符串。当需要表示复杂的数据时,使用字符串解析并使用适当的抽象。

Symbol 类型

Symbol 是唯一并且不可变的原始值并且可以用来作为对象属性的键(如下)。在某些程序语言当中,Symbol 也被称作“原子类型”(atom)。symbol 的目的是去创建一个唯一属性键,保证不会与其他代码中的键产生冲突。

Object

在计算机科学中,对象(object)是指内存中的可以被标识符引用的一块区域。在 JavaScript 中,对象是唯一可变的值。事实上,函数也是具有额外可调用能力的对象

属性
在 JavaScript 中,对象可以被看作是一组属性的集合。用对象字面量语法来定义一个对象时,会自动初始化一组有限的属性;然后,这些属性还可以被添加和移除。对象属性等价于键值对。属性键要么是字符串类型,要么是 symbol。属性值可以是任何类型的值,包括其他对象,从而可以构建复杂的数据结构。

有两种对象属性的类型:数据属性和访问器属性。每个属性都有对应的特性(attribute)。JavaScript 引擎在内部内置了访问性,但是你可以通过 Object.defineProperty() 设置它们,或者通过 Object.getOwnPropertyDescriptor() 读取它们。你可以在 Object.defineProperty() 页面上读取更多有关信息。

数据属性

数据属性将键与值相关联。它可以通过以下属性来描述:

value

通过属性访问器获取值。可以是任意的 JavaScript 值。

writable

一个布尔值,表示是否可以通过赋值来改变属性。

enumerable

一个布尔值,表示是否可以通过 for…in 循环来枚举属性。另请参阅枚举性和属性所有权,以了解枚举属性如何与其他函数和语法交互。

configurable

一个布尔值,表示该属性是否可以删除,是否可以更改为访问器属性,并可以更改其特性。

访问器属性
将键与两个访问器函数(get 和 set)像关联,以获取或者存储值。

备注: 重要的是,意识到它是访问器属性——而不是访问器方法。我们可以将函数作为值来提供给 JavaScript 对象的访问器,使得对象表现得像一个类——但这并不能使该对象成为类。

一个访问器属性有着以下的特性:

get

该函数使用一个空的参数列表,以便有权对值执行访问时,获取属性值。参见 getter。可能是 undefined。

set

使用包含分配值的参数调用的函数。每当尝试更改指定属性时执行。参见 setter。可能是 undefined。

enumerable

一个布尔值,表示是否可以通过 for…in 循环来枚举属性。另请参阅枚举性和属性所有权,以了解枚举属性如何与其他函数和语法交互。

configurable

一个布尔值,表示该属性是否可以删除,是否可以更改为访问器属性,并可以更改其特性。

对象的原型(prototype)指向另一个对象或者 null——从概念上讲,它是对象的隐藏属性,通常表示为 [[Prototype]]。对象的 [[Prototype]] 属性也可以在对象自身访问。

对象是临时的键值对,因此它们通常当作映射使用。然而,这可能涉及人类工程学、安全以及性能的问题。然而,可以使用 Map 来存储任意的数据。Map 引用更详细地讨论了使用普通对象和使用 map 存储键值之间的利弊。

Date

当表示日期时,最好的选择是使用在 JavaScript 内置的 Date 工具类。

索引类集合:数组和类型化数组
数组是一种以整数为键(integer-keyed)的属性并与长度(length)属性关联的常规对象。

此外,数组对象还继承了 Array.prototype 的一些操作数组的便捷方法。例如,indexOf()(搜索数组中的一个值)或 push()(向数组中添加一个元素),等等。这使得数组是表示列表或集合的最优选择。

类型化数组表示底层二进制缓冲区的类数组视图,并且提供了与数组相对应的类似语义的方法。“类型化数组”是一系列数据结构的总话术语,包括 Int8Array、Float32Array 等等。获取更多细节,请查看类型化数组页。类型化数组通常与 ArrayBuffer 和 DataView 一起使用。

带键的集合:Map、Set、WeakMap、WeakSet
这些数据结构把对象的引用当作键。Set 和 WeakSet 表示唯一值的集合,而 Map 和 WeakMap 表示键值相关联的集合。

你也可以自己实现 Map 和 Set。然而,因为对象不能被比较(例如,在 <“小于”的意义上),另一方面,引擎也没有暴露出它的哈希函数,因此查找性能必定是线性的。它们的原始实现(包括 WeakMap)的查找性能大致为对数到相对恒定的时间。

通常,可以通过直接在对象上设置属性或使用 data-* 属性,将绑定数据到 DOM 节点。然而缺陷是在任何的脚本内,数据都运行在同样的上下文中。Map 和 WeakMap 能够方便地将数据私密地绑定到一个对象。

WeakMap 和 WeakSet 仅允许对象键,即使这些键留在集合中,也允许这些键被垃圾回收。它们专门用于内存使用优化。

结构化数据:JSON
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,来源于 JavaScript,同时也被多种语言所使用。JSON 构建了通用数据结构,可以在不同环境之间传输,甚至可以跨语言传输。更多细节,请参见 JSON。

标准库中的更多对象
JavaScript 有一个内置对象的标准库。发现更多关于内置对象,请阅读参考。

强制类型转换
如上所述,JavaScript 是一个弱类型语言。这意味着你经常可以使用与预期类型不同类型的值,并且该语言将为你转换它为正确的类型。为此,JavaScript 定义了少数强制规则。

http://www.xdnf.cn/news/11841.html

相关文章:

  • win10系统魔兽世界无法连接服务器地址,win10系统无法更新魔兽世界提示正在等待另一项安...
  • 罗马音平假字复制_罗马音平假名和片假名大全ID,罗马音平假名和片假名大全复制中文[多图]...
  • index of 的高级搜索命令
  • 对ROS局部运动规划器Teb的理解
  • 弘辽科技:淘宝怎么增加手淘访客?有什么技巧?
  • 153:vue+openlayers 设定修改图层的透明度
  • 【转】ACM竞赛和算法相关
  • Android版xx助手之天天酷跑外挂具体分析
  • VC++ 各个版本(2005 2008 2010 2012 2013 2015 2017 2019 2022)的运行库 VC_redist下载
  • 无线局域网安全(四)————身份认证之4路握手
  • 本站GOUGOU订阅地址
  • 快门(Shutter)
  • 网络安全等级保护测评——主机安全(三级)详解
  • CDMA、CDMA2000、WCDMA、TD-SCDMA的区别
  • SSL证书与域名证书有什么区别
  • 英特尔MeeGo: Intel开放软件平台MeeGo 应用总数过万
  • 硬币的组合方案
  • 程序员必备的五大算法解析与实践
  • 点胶机及其视觉点胶系统
  • 第一章:软件测试基础入门
  • 软件开发规范文档汇总(规格说明书、详细设计、测试计划、验收报告)
  • 一个超全的数学资源网站(转贴)
  • 【RPA之家BluePrism手把手教程】BluePrism下载与安装
  • Flash钢琴
  • pscc2019滤镜抽出_ps抽出滤镜(Extractplus.8bf)下载_ps抽出滤镜(Extractplus.8bf)官方下载-太平洋下载中心...
  • Eclipse最新版下载_Eclipse3.4.1下载_Eclipse3.3下载_Eclipse3.2下载_Eclipse全部版本下载_Eclipse下载
  • 学业水平考试网登录_学业水平报名网址:http://www.eeagd.edu.cn/xyspbm/
  • 收集到的若干测速网站
  • 网站都变成灰色了,它是怎么实现的?
  • HTML简单入门教程