c语言和js数据类型的区别,JavaScript数据结构和数据类型

引言

JavaScript 是一种弱类型或者说动态语言。这意味着你不用提前声明变量的类型,在程序运行过程中,类型会被自动确定。这也意味着你可以使用同一个变量保存不同类型的数据,这会让大家写代码很飘逸,但也会造成数据类型错误的报错

var foo = 42; // foo is a Number now

foo = "bar"; // foo is a String now

foo = true; // foo is a Boolean now

数据类型

JavaScript定义了八种数据类型,其中七种数据类型为:Boolean,Null,Undefined,String,Number,BigInt,Symbol;另外一种为Object,函数其实也是对象。

除 Object 以外的所有类型都是不可变的(值本身无法被改变)。例如,与 C 语言不同,JavaScript 中字符串是不可变的(译注:如,JavaScript 中对字符串的操作一定返回了一个新字符串,原始字符串并没有被改变)。我们称这些类型的值为“原始值”。

1.Boolean

布尔表示一个逻辑实体,可以有两个值true和false

2.Null

Null 类型只有一个值:null

3.Undefined

一个没有被赋值的变量会有个默认值undefined

4.String

JavaScript的字符串类型用于表示文本数据。它是一组16位的无符号整数值的“元素”。在字符串中的每个元素占据了字符串的位置。第一个元素的索引为0,下一个是索引1,依此类推。字符串的长度是它的元素的数量。

5.Number

JavaScript 中只有一种数字类型:基于 IEEE 754 标准的双精度 64 位二进制格式的值(-(253 -1) 到 253 -1)。它并没有为整数给出一种特定的类型。除了能够表示浮点数外,还有一些带符号的值:+Infinity,-Infinity 和 NaN (非数值,Not-a-Number)。

6.BigInt

BigInt类型是 JavaScript 中的一个基础的数值类型,可以用任意精度表示整数。使用 BigInt,您可以安全地存储和操作大整数,甚至可以超过数字的安全整数限制。BigInt是通过在整数末尾附加 n 或调用构造函数来创建的。

BigInt 是一种内置对象,它提供了一种方法来表示大于 253 - 1 的整数。这原本是 Javascript中可以用 Number 表示的最大数字。BigInt 可以表示任意大的整数。

const x = 2n ** 53n;

9007199254740992n

const y = x + 1n;

9007199254740993n

以下操作符可以和 BigInt 一起使用: +、*、-、**、% 。除 >>> (无符号右移)之外的 位操作 也可以支持。因为 BigInt 都是有符号的, >>> (无符号右移)不能用于 BigInt。为了兼容 asm.js ,BigInt 不支持单目 (+) 运算符。

const previousMaxSafe = BigInt(Number.MAX_SAFE_INTEGER);

// ↪ 9007199254740991n

const maxPlusOne = previousMaxSafe + 1n;

// ↪ 9007199254740992n

const theFuture = previousMaxSafe + 2n;

// ↪ 9007199254740993n, this works now!

const multi = previousMaxSafe * 2n;

// ↪ 18014398509481982n

const subtr = multi – 10n;

// ↪ 18014398509481972n

const mod = multi % 10n;

// ↪ 2n

const bigN = 2n ** 54n;

// ↪ 18014398509481984n

bigN * -1n

// ↪ –18014398509481984n

math?formula=%5Ccolor%7Bred%7DBigInt%20%E5%92%8C%20Number%20%E4%B8%8D%E6%98%AF%E4%B8%A5%E6%A0%BC%E7%9B%B8%E7%AD%89%E7%9A%84%EF%BC%8C%E4%BD%86%E6%98%AF%E5%AE%BD%E6%9D%BE%E7%9B%B8%E7%AD%89%E7%9A%84%E3%80%82%E5%BD%93%E4%BD%BF%E7%94%A8%20BigInt%20%E6%97%B6%EF%BC%8C%E5%B8%A6%E5%B0%8F%E6%95%B0%E7%9A%84%E8%BF%90%E7%AE%97%E4%BC%9A%E8%A2%AB%E5%8F%96%E6%95%B4%E3%80%82

7.Symbol

symbol 是一种基本数据类型 (primitive data type)。Symbol()函数会返回symbol类型的值,该类型具有静态属性和静态方法。它的静态属性会暴露几个内建的成员对象;它的静态方法会暴露全局的symbol注册,且类似于内建对象类,但作为构造函数来说它并不完整,因为它不支持语法:"new Symbol()"。

每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。

const symbol1 = Symbol();

const symbol2 = Symbol(42);

const symbol3 = Symbol('foo');

console.log(typeof symbol1);

// expected output: "symbol"

console.log(symbol2 === 42);

// expected output: false

console.log(symbol3.toString());

// expected output: "Symbol(foo)"

console.log(Symbol('foo') === Symbol('foo'));

// expected output: false

8.Object

Object 构造函数为给定值创建一个对象包装器。如果给定值是 null 或 undefined,将会创建并返回一个空对象,否则,将返回一个与给定值对应类型的对象。

当以非构造函数形式被调用时,Object 等同于 new Object()。

Object 构造函数的属性

Object.length 值为 1。

Object.prototype 可以为所有 Object 类型的对象添加属性。

Object 构造函数的方法

Object.assign()

通过复制一个或多个对象来创建一个新的对象。

Object.create()

使用指定的原型对象和属性创建一个新对象。

Object.defineProperty()

给对象添加一个属性并指定该属性的配置。

Object.defineProperties()

给对象添加多个属性并分别指定它们的配置。

Object.entries()

返回给定对象自身可枚举属性的 [key, value] 数组。

Object.freeze()

冻结对象:其他代码不能删除或更改任何属性。

Object.getOwnPropertyDescriptor()

返回对象指定的属性配置。

Object.getOwnPropertyNames()

返回一个数组,它包含了指定对象所有的可枚举或不可枚举的属性名。

Object.getOwnPropertySymbols()

返回一个数组,它包含了指定对象自身所有的符号属性。

Object.getPrototypeOf()

返回指定对象的原型对象。

Object.is()

比较两个值是否相同。所有 NaN 值都相等(这与==和===不同)。

Object.isExtensible()

判断对象是否可扩展。

Object.isFrozen()

判断对象是否已经冻结。

Object.isSealed()

判断对象是否已经密封。

Object.keys()

返回一个包含所有给定对象自身可枚举属性名称的数组。

Object.preventExtensions()

防止对象的任何扩展。

Object.seal()

防止其他代码删除对象的属性。

Object.setPrototypeOf()

设置对象的原型(即内部 [[Prototype]] 属性)。

Object.values()

返回给定对象自身可枚举值的数组。

Object 实例和 Object 原型对象

JavaScript中的所有对象都来自 Object;所有对象从Object.prototype继承方法和属性,尽管它们可能被覆盖。例如,其他构造函数的原型将覆盖 constructor 属性并提供自己的 toString() 方法。Object 原型对象的更改将传播到所有对象,除非受到这些更改的属性和方法将沿原型链进一步覆盖。

Object属性

Object.prototype.constructor

特定的函数,用于创建一个对象的原型。

Object.prototype.proto

指向当对象被实例化的时候,用作原型的对象。

Object.prototype.noSuchMethod

当未定义的对象成员被调用作方法的时候,允许定义并执行的函数。

Object方法

Object.prototype.defineGetter()

关联一个函数到一个属性。访问该函数时,执行该函数并返回其返回值。

Object.prototype.defineSetter()

关联一个函数到一个属性。设置该函数时,执行该修改属性的函数。

Object.prototype.lookupGetter()

返回使用 defineGetter 定义的方法函数 。

Object.prototype.lookupSetter()

返回使用 defineSetter 定义的方法函数。

Object.prototype.hasOwnProperty()

返回一个布尔值 ,表示某个对象是否含有指定的属性,而且此属性非原型链继承的。

Object.prototype.isPrototypeOf()

返回一个布尔值,表示指定的对象是否在本对象的原型链中。

Object.prototype.propertyIsEnumerable()

判断指定属性是否可枚举,内部属性设置参见 ECMAScript [[Enumerable]] attribute 。

Object.prototype.toSource()

返回字符串表示此对象的源代码形式,可以使用此字符串生成一个新的相同的对象。

Object.prototype.toLocaleString()

直接调用 toString()方法。

Object.prototype.toString()

返回对象的字符串表示。

Object.prototype.unwatch()

移除对象某个属性的监听。

Object.prototype.valueOf()

返回指定对象的原始值。

Object.prototype.watch()

给对象的某个属性增加监听。

对象的数据属性

数据属性是键值对,并且每个数据属性拥有下列特性:

数据属性的特性(Attributes of a data property)

0d94cf39977d

数据属性的特性(Attributes of a data property).png

访问器属性

访问器属性有一个或两个访问器函数 (get 和 set) 来存取数值,并且有以下特性:

一个访问器属性的特性

0d94cf39977d

一个访问器属性的特性.png

"标准的" 对象, 和函数

一个 Javascript 对象就是键和值之间的映射.。键是一个字符串(或者 Symbol) ,值可以是任意类型的值。 这使得对象非常符合 哈希表。

函数是一个附带可被调用功能的常规对象。

日期

使用内建的 Date 对象。

有序集: 数组和类型数组

数组是一种使用整数作为键(integer-key-ed)属性和长度(length)属性之间关联的常规对象。此外,数组对象还继承了 Array.prototype 的一些操作数组的便捷方法。例如, indexOf (搜索数组中的一个值) or push (向数组中添加一个元素),等等。 这使得数组是表示列表或集合的最优选择。

类型数组(Typed Arrays)是ECMAScript Edition 6中新定义的 JavaScript 内建对象,提供了一个基本的二进制数据缓冲区的类数组视图。

键控集: Maps, Sets, WeakMaps, WeakSets

这些数据结构把对象的引用当作键,其在ECMAScript第6版中有介绍。当 Map 和 WeakMap 把一个值和对象关联起来的时候, Set 和 WeakSet 表示一组对象。 Map和WeakMaps之间的差别在于,在前者中,对象键是可枚举的。这允许垃圾收集器优化后面的枚举(This allows garbage collection optimizations in the latter case)。

在纯ECMAScript 5下可以实现Maps和Sets。然而,因为对象并不能进行比较(就对象“小于”示例来讲),所以查询必定是线性的。他们本地实现(包括WeakMaps)查询所花费的时间可能是对数增长。

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

结构化数据: JSON

JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式,来源于 JavaScript 同时也被多种语言所使用。 JSON 用于构建通用的数据结构。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值