在看jQuery的ajax源码时,遇到操作符“&&”一脸懵圈,发现自己对Javascript的基础知识掌握的还不好,所以又重新回来看看。
*ECMAScript和Javascript的关系
Javascript是一种专为与网页交互而设计的脚本语言,由三个不同的部分组成:
- ECMAScript,由ECMA-262定义,提供核心语言功能。
- 文档对象模型(DOM),提供访问和操作网页内容的方法与接口。
- 浏览器对象模型(BOM),提供与浏览器交互的方法与接口。
总的来说呢,ECMAScript幷不是Javascript,而是负责Javascript中语法的那一部分。
ECMAScript中有5个简单的数据类型和一个复杂的数据类型:
(简单的数据类型)
- Undefined
- Null
- Boolean
- Number
- String
(复杂的数据类型)
- Object
1.Undefined
Undefined类型只有一个值,在使用var声明变量但却未对其初始化时,这个变量的值就是Undefined。第三版引入这个值就是为了正式区分空对象指针和未初始化的变量。
栗子:
var message; console.log(message);
结果:
当变量声明却未初始化时,该变量自动取得Undefined值。但变量未声明时呢?
console.log(message);
此时就会报错。对于未声明过的变量,只能执行typeof操作符检测其数据类型。那再看下使用typeof操作符的结果:(typeof只是一个操作符,幷不是一个函数)
这个结果与typeof 已声明却未初始化的变量结果是一样的。
2.Null
Null类型也是只有一个值:Null,主要用于表示一个空对象指针。typeof Null类型的对象显示结果是:(因为Null表示一个空的对象的引用)
关于Null和Undefined的区别可以看一下阮一峰大神的博客:
http://www.ruanyifeng.com/blog/2014/03/undefined-vs-null.html
3.Boolean
布尔类型只有两个字面值:true和false,true和false与数字值不是一回事,true幷不代表1,false幷不代表0。
ECMAScript中所有类型的值都有与这两个Boolean值等价的值。要将一个值转换为其虽有的Boolean值,可以调用转型函数Boolean()。
那各个类型的数据在什么情况下才与ture或false等价呢?
- boolean
var found = true; var lost = false; console.log("Boolean(found):"+Boolean(found)); console.log("Boolean(lost):"+Boolean(lost));
结果:
所以当boolean类型的值为ture时,使用Boolean()方法才会转换为true,反之成立。
- String
var found = "niulina"; var lost = ""; console.log("Boolean(found):"+Boolean(found)); console.log("Boolean(lost):"+Boolean(lost));
结果:
所以当String类型的值为非空字符串时,使用Boolean()方法才会转换为true,反之,当String类型的值为空(“”)时,使用Boolean()方法会转换为false。
- Number
var one = 1; var positiveNum = 10; var negativeNum = -10; var maxValue = Number.MAX_VALUE; var minValue = Number.MIN_VALUE; var zero = 0; var nan = NaN; console.log("Boolean(one):"+Boolean(one)); console.log("Boolean(positiveNum):"+Boolean(positiveNum)); console.log("Boolean(negativeNum):"+Boolean(negativeNum)); console.log("Boolean(maxValue):"+Boolean(maxValue)); console.log("Boolean(minValue):"+Boolean(minValue)); console.log("Boolean(zero):"+Boolean(zero)); console.log("Boolean(nan):"+Boolean(nan));
结果:
所以从中可知:任何非零数字值(包括无穷大无穷小)都会被Boolean()方法转换为true,反之0和NAN被Boolean()方法转换为false。
- Object
var object1 = {}; var object2 = new Object(); var nullObject = null; console.log("Boolean(object1):"+Boolean(object1)); console.log("Boolean(object2):"+Boolean(object2)); console.log("Boolean(nullObject):"+Boolean(nullObject));
结果:
由结果可知:任何对象都会被Boolean()方法转换为true,null则被转换为false。
- Undefined
var un; console.log("Boolean(un):"+Boolean(un));
结果:
从结果可知,undenfined类型的值可被转换为false;
4.Number
- Number类型用来表示整数和浮点数值,其中,整数可以通过十进制、八进制和十六进制的字面值来表示,虽然在算数计算时,都会被转换为十进制数。
- 虽然Javascript是个弱类型脚本语言,但是Number类型的数值也存在范围,能够表示的最大值保存为:Number.MAX_VALUE(这个数值在大多数浏览器中为1.7976931348623157e+308),能够表示的最小值保存为:Number.MIN_VALUE(这个数值在大多数浏览器中为5e-324)。
- 当某次计算时得到了超出Javascript数值范围的数,那么这个数值将被自动转换成特殊的Infinity值,若是负数,则为-Infinity。
- Number类型有一个特殊的数值,即NaN(中间这个a是小写),此数用于表示一个本来要返回数值的操作数未返回数值的情况,以避免抛出错误。NaN有两个特点:(1)任何涉及NaN的操作都会返回NaN;(2)NaN与任何值都不相同,包括它本身。
- 针对NaN的特点,ECMAScript定义了isNaN()方法,用于判断参数是不是一个数值。在判断之前,isNaN()会将各个类型的数值转换为Number类型。
- 栗子:
var nan = NaN; var ten = 10; var tenString = "10"; var aString = "niulina"; var yes = true; var no = false; var object = {}; var un = undefined; var kong = null; console.log("isNaN(nan):"+isNaN(nan)); console.log("isNaN(ten):"+isNaN(ten)); console.log("isNaN(tenString):"+isNaN(tenString)); console.log("isNaN(aString):"+isNaN(aString)); console.log("isNaN(yes):"+isNaN(yes)); console.log("isNaN(no):"+isNaN(no)); console.log("isNaN(object):"+isNaN(object)); console.log("isNaN(un):"+isNaN(un)); console.log("isNaN(kong):"+isNaN(kong));
结果:
为什么是这个结果呢?isNaN()方法可以被看作为:
isNaN = function(value) { Number.isNaN(Number(value)); }
所以在判断之前需先将这个参数转换为数值,所以接下来还得看Number方法。
- 有三个函数可以把非数值转换为数值,分别为:Number()、parseInt()、parseFloat。Number()用于任何数据类型,后两个函数只是用于将字符串转换为数值。
- Number()方法的栗子:
var nan = NaN; var ten = 10; var tenString = "10"; var aString = "niulina"; var yes = true; var no = false; var object = {}; var un = undefined; var kong = null; console.log("Number(nan):"+Number(nan)); console.log("Number(ten):"+Number(ten)); console.log("Number(tenString):"+Number(tenString)); console.log("Number(aString):"+Number(aString)); console.log("Number(yes):"+Number(yes)); console.log("Number(no):"+Number(no)); console.log("Number(object):"+Number(object)); console.log("Number(un):"+Number(un)); console.log("Number(kong):"+Number(kong));
结果:
从结果中可知Number()函数的转换规则如下:
(1)如果是boolean值,true和false将被转换为1和0。
(2)如果是数字值,只是简单的传入和返回。
(3)如果是null值,返回0。
(4)如果是undefined值,返回NaN。
(5)如果是字符串,遵循下列规则:
1)如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转换为十进制数值,即“1”会变成1,“123”会变成123,而“011”会变成“11”;
2)如果字符串中包含有效的浮点格式,如“1.1”,则将其转换为对应的浮点数值;
3)如果字符串中包含有效的十六进制格式,例如“0xf”,则将其转换为相同大小的十进制整数值;
4)如果字符串是空的,则将其转换为0;
5)如果字符串包含除上述格式之外的字符,则将其转换为NaN。
(6)如果是对象,则调用对象的value()方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调动对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。
由于Number()函数在转换字符串时比较复杂而且不够合理,因此在处理整数的时候更常用的是parseInt()函数。parseInt()函数在转换字符串时,会忽略字符串前面的空格,直到找到第一个非空格字符串。如果第一个字符不是数字字符或者负号,parseInt()则会返回NaN,如果第一个是数字字符,parseInt()会继续解析第二个字符,直到解析完所有后续字符或者遇到了一个非数字字符。例如parseInt(“1234niulina”)得出的是1234。
parseInt()函数有一个特殊的地方,ECMAScript 3 与ECMAScript 5引擎在解析八进制字面量的字符串时会出现分歧,ECMAScript 3引擎会解析八进制字面量字符串,幷将其转换为十进制,而ECMAScript 3引擎则会忽略代表八进制的前面的符号“0”,例如“070”则被转为70,为了解决这个分析,parseInt()函数又增加了个参数,以作为转换时使用的基数(即多少进制)。
parseFloat()函数与parseInt()函数相似。在解析过程中,只有第一个小数点是有效的。
5.String
String类型用于表示由零或多个16为Unicode字符组成的字符序列,即字符串。
- String类型的值是不可变的。字符串一旦创建,它们的值就不能改变。
- 可以通过length属性获取其长度。
- 转换为字符串(这里当时面试阿里的时候没有答好,着重记忆下)。要把一个值转换为一个字符串有两种方式,第一种就是使用每个值都有的toString()方法。第二种就是String()方法。这两种方式的区别就是toString()适用于数值、布尔型、对象和字符串,而在不确定要转换的值是不是null或undefined的情况下,可以使用String()方法,该方法适用于任何类型。
- String()方法遵循规则:1)如果值有toString()方法,则调用该方法返回结果。2)如果值为null,则返回“null”。3)如果值是undefined,则返回“undefined”。
6.object
ECMAScript对象就是一组数据和功能的集合。可以通过执行new操作符后跟要创建的对象类型的名称来创建。
后边专门学学对象。