javascript=计算。

javascript=计算。
你知道,Javascript = =是一个复杂的操作,它的操作规则非常奇怪,很容易出错,这已经成为Javascript中最糟糕的性能之一。

在仔细阅读ECMAscript规范,我画了一幅画,我想让你理解这幅画,可以彻底了解一切关于= =运算符。同时,我试图证明政府没有通过这篇文章对你不好的东西,很容易掌握,甚至似乎是合理的,是不是那么坏。

第一张照片:
的操作规则的精确描述:抽象=等式比较alrithm。但是,这样一个复杂的描述,你一定看了之后头不晕一匹马能带它去指导练习是肯定的吗

当然不是。规范毕竟是Javascript运行环境的开发人员(与V8引擎开发人员相比),而不是语言的用户。

在详细介绍图1的每一部分之前,让我们回顾一下js中的类型知识:

js中有两种类型的值:基本类型、对象类型。

基本类型包括五种类型:未定义的、空的、布尔的、数字的和字符串的。

对于未定义类型和null类型,只有一个值,即未定义的和空的;布尔类型有两个值:真和假;数字类型有许多值,String类型有许多值。

所有的物体都有价值和toString()()方法,从对象和可能,当然,是由子类重写。

现在考虑表达式:

x=y

x和y是六种类型之一的值。

当x和y是相同的时,y可以转换成x==y==y,后者很简单(只需注意可能是南),所以我们只考虑x和y在不同情况下的类型。

一个。没有也没有
在图1中,六种类型的Javascript值用蓝色背景的矩形表示:

字符串,数字,布尔和对象(左边的大矩形框)

未定义的和空的(右边的矩形框)

分组的依据是什么让我们看看右边的定义和空是用来表示不确定,无或空的,和权利四种类型都是明确的,我们可以说,空的:

左边是一个存在的世界,右边是一个空的世界。

要做到这一点,在任何值的世界中,大约两个的比较结果为false是合理的(即图1中连接两个矩形的水平线的false)。

两。空气和空气
Javascript中的未定义和空是我们经常崩溃的另一个地方,通常被认为是一个设计缺陷,我们不打算研究这一点,但我听说Javascript的作者首先想到的是:

如果你要给一个Object类型的变量的值,但没有任务,那么你可以用零和状态(证据是一个空typeof'object的结果);相反,如果你打算把一个变量给定的原始类型的值,但没有分配,然后你可以定义说这种状况。

这句话是否可信的结果,他们两个做的也是真的也是很合理的。(也就是说,在图1右垂直线的右边)。

在下一步之前,让我们从图1中的两个符号开始:大写字母n和p。这两个符号不是pn节中的正、负含义:

N代表数字的操作,而操作数传送到数。它是在ES规范抽象的操作,但是我们可以使用数字()函数在JS来等效替代。

P代表toprimitive操作的操作数转化为原始类型的值。在ES规范也是一个抽象的操作,它也可以转化为等效的js代码,但它是更复杂一点,在一个简单的方法,一个对象:

toprimitive(obj)相当于:首先计算obj.valueof(),如果结果是原来的值,然后返回结果;否则,计算obj.tostring(),如果结果是原来的值,然后返回这个结果;否则,抛出一个异常。

注:有一个例外,日期类型的对象,它首先调用toString()方法。

在图1中,与N或P线说,当这两种连接类型数据的操作,对操作数的另一侧标有N或P为数字或toprimitive变换。

三。真与假
如图1所示,当布尔值与其他类型的值进行比较时,布尔值被转换为一个数字,特别是

真的> 1

错误> 0

它不需要浪费太多的舌头,在C语言中,根本就没有布尔型,它是用来表示真和假逻辑的整数1和0。

四。字符序列
在图1中,我们将字符串和数字分成一组。为什么在这六种类型中,字符串和数字都是字符序列(至少是字面上的)。字符串是所有合法字符的序列,数字可以看作是符合特定条件的字符序列。因此,一个数字可以看作是字符串的子集。

根据图1,= =字符串和数字做手术,你需要使用的数字运算,字符串转换成数字。如果X是一个字符串,和Y是一个数,然后:

x y(x)-

那么,字符串转换成数字的规则是什么呢规范是用复杂的方式描述的,但总的来说,它是去掉字符串两边的引号,看看它是否能构成一个合法的数字。如果是这样,转换结果就是这个数字;否则,结果就是楠:

数('123 ') / 123

数('1.2e3 ') / 1200

数('123abc ') / /南

当然也有例外,例如,将空字符串转换为数字的结果是0。

编号() 0
五。简单的和复杂的
原始类型是简单类型,他们是直接和容易理解的。但是,缺点是表达能力有限,难以扩大,因此有一个对象,一个对象是一个集合的属性,和属性本身可以是一个对象,对象可以被构造为任意复杂的足以代表各种各样的东西。

但有时它是不复杂的一件好事。例如,一个很长的文章,是不是每个人都有时间,耐心或需要从头读到尾,通常只了解其中心思想,所以本文关键字和概述。在Javascript中的对象是相同的,我们需要有一种手段来了解其主要特点,所以对象的toString()和()方法的价值。

toString()方法来获得一个对象的文本描述;以及价值()方法来得到对象的特征值。

当然,这只是我自己的理解。此外,顾名思义,toString()方法会返回一个字符串,值()方法是什么根据规范中的规范,它会返回一个数字虽然内置类型的值()方法返回的数字号码和日期。

根据图1,当对象与非对象进行比较时,它需要将对象转换为原始类型。虽然布尔型和布尔型相比,它需要变换的布尔型数值型,但随后的对象类型更改为原始类型。这是合理的,毕竟,不严格等于= =,我们只需要把对象参与计算主要特点,边上的次要特征。

六。万物皆数
我们回头看一下图1,里面有n或p的线是没有方向的。如果我们在这些线上标出箭头,那就是从n或p的一端到另一端的连接,然后得到(未定义的和空的):
你发现了什么是的,在计算过程中,所有类型的数值都有转换成数字类型的倾向。毕竟,有一位名人说过:

一切都是。
七。板栗勉强
前面有太多的废话,下面是一个例子来证明图1是非常方便和有效的指导实践。

例如,以下:

{

首先,两个操作数分别是Object类型和布尔类型,如图1所示,您需要将布尔类型转换为数字类型,而false转为数字的结果为0,因此表达式被更改为:

{ = } = 0

这两个操作数成为对象类型和数字类型。如图1所示,您需要将对象类型转换为原始类型:

第一个电话{ }。值(),因为:()方法返回的数组本身,这样的结果是不是原来的类型,并继续调用toString(){ }。

对于数组,toString()算法的算法是将每个元素的字符串类型,然后将其连接顺序的,所以最终的结果是一个空字符串,这是一个价值的原始类型。

此时,表达式被更改为:

= = 0

两个操作数成为字符串类型和数字类型。根据图1,我们需要将字符串类型转换为数字类型。在数字为0之前的空字符串。因此表达式被更改为:

0 = 0

到目前为止,两个操作数的类型终于相同了,结果显然是真的。

从这个例子我们可以看到,掌握=操作规则,除了在图1中,还需要记住的内置对象的toString(值)和()的规则,包括对象、数组、日期、数字、字符串、布尔等。

八。总结
前面是非常混乱的,然后在图1中总结了操作规则在这里的表达式= =:

结果是真的未定义的= NULL。

=字符串编号,字符串为数字。

布尔值=其他类型,布尔值到数字。

对象=数字字符串,对象为基本类型。

最后,改变图片,只供娱乐:)
好了,结束了。如果你觉得这篇文章对你有用,请多表扬,让更多的人看到。

此外,文章中的谬论,请不要犹豫指出。

tag:计算电脑软件Javascript

相关内容