手机版

深入讨论javascript中的数据类型

时间:2021-10-13 来源:互联网 编辑:宝哥软件园 浏览:

学习一门编程语言,只有两个方面:语法和数据类型。C语言的语法无非是if、while、for、function、算术运算等。对象被添加到面向对象语言中。只是语言设计师事先制定的一套规则。不同的语言有不同的语法,但它们都有一些共同点。对于熟悉一两种编程语言的人来说,在学习其他编程语言的时候,语法往往不是问题(当然,如果你一直在学习类似C语言的语言,那么第一次接触lisp肯定需要一段时间)。学习的重点往往是数据类型和相关操作,而不是一句老话:“数据结构算法=程序”。其次,有些语言的语法存在设计问题(javascript更糟糕),这些点我们不需要深究。当然,如果你称自己为极客,你可以玩它。

本文将详细介绍javascript中的数据类型。

弱型vs强型。

鉴于javascript的设计理念,javascript被设计为弱类型语言。在这里,不可避免地要谈到弱型和强型的区别。有些人错误地认为两者的区别在于“强类型语言在声明变量时需要指明其类型,而弱类型语言则不需要”。其实这种观点是错误的。例如,下面的Java代码片段:

复制的代码如下:String s=' helloint l=s.getBytes()。长度;

编译器是怎么知道的。长度是合法的表达吗?这是因为编译器知道s的数据类型是String,调用String的getBytes方法时,返回值的数据类型是byte[],所以。长度是一个合法的表达。两者的真正区别在于:

在强类型语言中,每个表达式的类型可以在编译时确定,并且只允许适用于该类型的操作。弱类型语言允许任何操作应用于任何类型,但该操作可能会在运行时报告错误。数据类型

根据ECMAScript 5.1的规范,javascript中有六种数据类型,分别是未定义、null、boolean、number、string和Object。前五个属于基本类型,最后一个属于对象类型。

基本数据类型

未定义的类型只有一个值,这意味着“没有值”,适用于所有数据类型。空类型只有一个值,这意味着“没有对象”,并且只适用于对象类型。布尔类型有两个值,真和假。number类型的值是符合IEEE 754标准的64位浮点数的集合,类似于Java的double。没有整数数据结构。此外,还有三个特殊值:NaN、Infinity和-InfinityString,它们是Unicode字符的集合。必须包含在“或”中。

Null且未定义

null和undefined都表示“非值”的概念。如果严格区分:-null表示空;未定义意味着不存在。该值用于未初始化的变量、函数中缺少的参数以及没有显式返回值的函数。

在其他语言中,通常只使用一个null来表示null值。为什么javascript中有一个undefined?这是历史原因造成的:

Javascript采用Java的语法,将类型分为基本类型和对象类型。在Java中,null用于表示空对象,这是javascript理所当然继承的。在c语言中,null转换为数字时为0,javascript采用相同的方法:

复制代码如下: Number(null)0 5 null5。

在javascript1.0中,没有异常处理,有些异常(未初始化的变量、调用函数时丢失的参数等。)需要标记为特殊值。null是一个不错的选择,但是Brendan Eich希望同时避免以下两件事:-这个特殊值不应该有引用特征。因为它是特定于对象的-这个特殊的值不应该转换为0,因为在程序中不容易发现错误。基于这两个原因,Brendan Eich选择了undefined,可以强转换为NaN。

复制代码如下:号(未定义)nan5未定义nan。

当他们处理JSON对象时,结果非常不同:

复制代码如下: JSON . parse(null)nulljson . parse(未定义)//Firefox syntaxerror : JSON . parse : JSON数据第1行第1列出现意外字符//Chrome SyntaxError:意外标记u JSON . stringify(null)“null”JSON . stringify(未定义)未定义

对象类型

作为一种脚本语言,javascript的功能非常简单,而且功能很多(文件读写、网络等)。)由主机环境提供。宿主环境和javascript语言之间的桥梁是对象,宿主环境通过提供一系列符合javascript语法的对象来提供各种功能。

在这篇关于javascript中面向对象编程的文章中(如果不知道什么是原型,强烈建议阅读这篇文章),我反复强调javascript中的对象是一系列键值对,就像Java中的HashMap一样。然而,javascript中对象的属性可以有一些属性描述符,这些在HashMap中是不可用的。

属性描述符

属性描述符分为两类:

一种数据描述符,包含一系列布尔值,用于解释是否允许修改或删除属性。访问器描述符,包括get和set函数。这两个描述符都是对象,它们都具有以下两个布尔属性:

可配置用于指定是否允许修改或删除描述符。默认值为false。可枚举用于指定是否访问对象的属性(使用.在循环或对象键方法中)。默认值为false。除了以上两个常见属性外,数据描述符还有以下两个属性:-value用于指定此属性的值,默认值为undefined-write用于指定是否允许更改此属性的值,默认值为false。

访问描述符还有以下两个属性:-get用于在访问这个属性时指定访问器(getter,本质上是一个函数),这个访问器的返回值就是这个属性的值。默认值是undefined- set,它指定了访问该属性时的赋值器(setter,本质上是一个函数)。计算器接受一个参数。默认值未定义。

我们可以使用对象定义属性来设置对象的属性描述符。例如:

复制的代码如下://使用_ _ proto _ _ object.define属性(obj,' key ',{_ _ proto _ _ : null,//无继承属性值: 'static' //不可枚举//不可配置//不可写//作为默认值});

从上面的例子中,我们可以看到描述符具有继承的特性。我们在这里将描述符对象的__proto__显式设置为null,从而避免从Object.prototype继承相应的属性。当然,我们也可以显式设置描述符的所有属性:

复制代码如下://为显式对象。定义属性(obj,' key ',{可枚举: false,可配置: false,可写: false,值: ' static ' });

这与第一个代码具有相同的效果。

下面是访问描述符的另一个例子:

复制代码如下://添加了define属性的对象属性示例,访问器属性描述符var bvalue=38object . defineperoperty(obj,' key ',{ get : function(){ return Bvalue;},set:函数(new value){ b value=new value;},enumerable: true,configuration ble : true });

需要注意的是,访问描述符和数据描述符不能混淆。这样写是不对的:

复制的代码如下://您不能尝试混合两个:对象。定义属性(obj,' conflict ',{value:0x9f91102,get : function(){ return0x deadlean;}});//引发类型错误:属性描述符不能指定值//,或者在指定了getter或setter时是可写的

类型

如果想在运行时知道变量的类型,可以使用运算符的类型。类型的返回值如下:

需要注意的一点是Null=='object '的类型。根据ECMAScript 5.1标准,null类型应该是一个基本类型。它为什么在这里返回对象?原因是这样的:

在javascript 1.0中,javascript中的值由类型标记和实际值表示。一个对象的类型标记为0,在C语言中null表示null指针(0x00),所以NULL的类型标记为0。

以上就是本文的全部内容。请有需要的小伙伴参考。

版权声明:深入讨论javascript中的数据类型是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。