基本概念ECMAScript中有5种简单数据类型(也称基本数据类型,存储在栈中):Undefined、Null、Boolean、Number和String。还有一种复杂的数据类型——Object(存放在堆内存中)。ES6的Symbol暂时忽略。简要粗略地描述一下这些类型:Undefined类型只有一个值,特殊的undefined。当用var声明一个变量但不初始化它时,这个变量的值是未定义的,例如:varmessage;警报(消息==未定义);//trueNull类型是第二种只有一个值的数据类型,这个特殊的值为null。从逻辑上看,空值代表一个空对象指针。布尔类型:true和false。数字类型:阿拉伯数字(八进制、十进制、十六进制、整数、浮点数、5e-324~1.7976931348623157e+308、NaN...)。字符串类型:引号,包括单引号和双引号(字符串),以及一些特殊的字符字面量(\n之类)varfirstName="Nicholas";varlastName='Zakas';对象类型:ECMAScript中的对象实际上是数据和函数的集合(一切都是对象?)。可以通过执行new运算符后跟要创建的对象类型的名称来创建对象。通过创建Object类型的实例并向其添加属性和/或方法,您可以创建自定义对象,如下所示:varo=newObject();typeof运算符由于ECMAScript是松散类型的,因此需要一种方法来检测给定变量的数据类型-typeof是负责提供此信息的运算符。对值使用typeof运算符可能会返回以下字符串之一:“undefined”-如果该值未定义;"boolean"-如果值为布尔值;"string"-如果值是一个字符串;"number"-如果这个值是一个数字;"object"-如果此值为对象或为null;"function"-如果这个值是一个函数。有几点需要注意:有时typeof运算符会返回令人困惑但技术上正确的值。例如,调用typeofnull返回“object”,因为特殊值null被认为是空对象引用。从逻辑上看,一个空值代表一个空的对象指针,这就是为什么typeof运算符在检测到一个空值时返回“object”的原因。首先,任何涉及NaN的运算(例如NaN/10)都将返回NaN,这一特性可能会导致多步计算出现问题。其次,NaN不等于任何值,包括NaN本身。例如,以下代码将返回false:alert(NaN==NaN);//false另外,NaN其实是一个特殊的numbertypeofNaN“number”《JavaScript高级程序设计》原书上说:“任何值除以0都将返回NaN”,但实际上只有0除以0才会返回NaN,一个正数数除以0返回无穷大,负数除以0返回-Infinity。ECMAScript定义了isNaN()函数来帮助我们判断这个参数是否“不是数字”。isNaN(),在接收到一个值后,尝试将该值转换为一个数字。某些不是数字的值直接转换为数字。这里有几个例子:alert(isNaN(NaN));//真正的警报(isNaN(10));//false(10是一个值)alert(isNaN("10"));//false(可以转换为10的值)alert(isNaN("blue"));//true(不能转换为值)alert(isNaN(true));//false(可以转为1的值)再看一张图:如果你被这个男人猥琐的笑容吓到的话,可以先看下《JavaScript高级程序设计》原则。我们来分析一下图上的内容>typeofNaN<·"number"上面说了,在其他编程语言中,任何一个值除以0都会出错,导致代码停止执行。但是在ECMAScript中,任何值除以0都会返回NaN(原书是这样的,但实际上只有0除以0才会返回NaN,正数除以0返回Infinity,负数除以0返回-Infinity),other被定义为数字类型。>9999999999999999<·10000000000000000>0.5+0.1==0.6<·true>0.1+0.2==0.3<·false这是JavaScript的一个陷阱。如果非要追究原因,可以看看这篇文章:为什么0.1+0.2在js中不等于0.3。PS:当后面的幂大于20时,会显示为科学计数法:>999999999999999990000<·1e+21上部实际结果:>0.5+0.1<·0.6>0.1+0.2<·0.30000000000000004>Math.max()<·-Infinity>Math.min()<·InfinityMath.max()函数返回一组数字中的最大值。没有参数,结果是-Infinity。如果任何参数不能转换为数字,则结果为NaN。引用自MDN。我的理解是当没有参数时,要比较的值集合为空,空中的最大值为-Infinity,与Math.min()相同(个人理解,如有请指正有任何错误)。>[]+[]<·"">[]+{}<·"[objectObject]">{}+[]<·0>true+true+true===3<·true>true-true<·0>真==1<·真>真===1<·假>(!+[]+[]+![]).length<·9>9+“1”<·“91”>91-"1"<·90>[]==0<·true这里大部分计算结果涉及的类型转换可以参考《JavaScript高级程序设计》,文末也有摘录。>true+true+true===3<·true>true-true<·0>true==1<·true>true===1<·false这些操作可能和书上写的有些出入,"如果其中一个操作数是一个对象,一个值,或者一个布尔值,调用它们的toString()方法获取对应的字符串值,然后套用前面关于字符串的规则"-如果是布尔值加法和减法运算,真为1,假为0。>true+false<·1再看一遍>[]+{}<·"[objectObject]">{}+[]<·0[]+{}可以这样理解,调用各自的toString()方法后,再套用字符串相加的规则。>[].toString()<·"">varobj={}<·undefined>obj.toString()<·"[objectObject]”加法结果为“[objectObject]”{}+[]为什么结果为0?实际上,控制台把{}当作一个空白表达式,实际上是在计算+[]。一元加运算符先把右边的参数转换成数字,得到0。如果是上面的obj+[],得到的结果就是[]+{}之类的“[objectObject]”。关注这个例子:(!+[]+[]+![]).length首先,逻辑非!具有极高的优先级,所以!+[]和![]首先计算。+[]:+运算符将[]转换为数字结果为0,![]的结果为false。公式变为(true+[]+false).length[].toString()is"",true+""is"true","true"+falseis"truefalse"。“truefalse”的长度是9。《JavaScript高级程序设计》:加法运算符加法加法运算符(+)的用法如下:varresult=1+2;如果两个运算符都是数值,则进行正则加法计算,并按照以下规则返回结果:如果任一操作数为NaN,则结果为NaN;如果Infinity加Infinity,结果是Infinity;如果-Infinity加上-Infinity,结果是-Infinity;如果Infinity加上-Infinity,则结果为NaN;如果是+0加+0,结果是+0;如果是+0加-0,结果就是+0。但是,如果任一操作数是字符串,则适用以下规则:如果两个操作数都是字符串,则第二个操作数与第一个操作数连接;如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后将两个字符串连接起来。如果其中一个操作数是对象、数字或布尔值,则调用它们的toString()方法获取相应的字符串值,然后对字符串应用前面的规则。对于undefined和null,调用String()函数,分别得到字符串“undefined”和“null”。减法减法运算符(-)是另一个非常常用的运算符,其用法如下:varresult=2-1;与加法运算符类似,ECMAScript中的减法运算符处理各种数据类型转换,也需要遵循一些特殊的规则,如下:如果两个运算符都是数字,则执行正常的算术减法运算并返回结果;如果任一操作数为NaN,则结果为NaN;如果Infinity减去Infinity,结果是NaN;如果是-Infinity减去-Infinity,则结果为NaN;如果是Infinityminus-Infinity,结果是Infinity;如果是-Infinity减去Infinity,结果就是-Infinity;如果是+0减+0,结果是+0;如果是+0减去-0,结果就是-0;如果是-0减去-0,结果是+0;如果其中一个操作数是字符串、Boolean、null或undefined,则在后台调用Number()函数将其转换为值,然后按照前面的规则进行减法计算。如果转换的结果为NaN,则减法的结果为NaN;如果其中一个操作数是一个对象,则调用该对象的valueOf()方法来获取表示该对象的值。如果结果值为NaN,则减法结果为NaN。如果对象没有valueOf()方法,则调用其toString()方法并将生成的字符串转换为数字。相等和不相等ECMAScript中的相等运算符由两个等号(==)表示,如果两个操作数相等则返回true。不等于运算符由感叹号后跟等号(!=)表示,如果两个操作数不相等,则返回真。在比较它们是否相等之前,两个运算符都转换操作数(通常称为强制转换)。在不同数据类型之间进行转换时,相等和不等运算符遵循以下基本规则:如果其中一个操作数是布尔值,则在比较相等之前将其转换为数值——false转换为0,true转换为is1;如果一个操作数是字符串而另一个是值,则在比较相等之前将字符串转换为值;如果一个操作数是对象,另一个不是,则调用对象的valueOf()方法,使用得到的基本类型值按照前面的规则进行比较;这两个运算符在比较时必须遵循以下规则:null和undefined相等。null和undefined在比较相等之前不能转换为任何其他值。PS:简单介绍一下undefined和null的区别。如果想深入了解,可以自行查看。这样的文章很多。null和undefined都表示“值空缺”。您可以将undefined视为表示系统级、意外或类似错误的值,将null视为表示程序级、正常或预期值。空缺。可以认为undefined表示应该有但是没有,null表示没有。undefined是一个未初始化的变量,null是一个空指针对象。佛家有云:“色即空,空即色”,“色”欲有而无,“空”即空,指针空,物空。不过,“形即空,空即形”,undefined==null亦是如此,非风非旗,忍者之心。如果其中一个操作数是NaN,则相等运算符返回false,不等运算符返回true。重要说明:即使两个操作数都是NaN,相等运算符也会返回false;因为根据规则,NaN不等于NaN。如果两个操作数都是对象,则比较它们是否是同一个对象。如果两个操作数指向同一个对象,则相等运算符返回真;否则,它返回false。下表列出了一些特例和对比结果:参考:《JavaScript高级程序设计》JavaScript神奇之旅本人是差生,如有发现错误,请批评指正!
