ECMAScript有5种简单数据类型:Undefined、Null、Boolean、Number、String和一种复杂数据类型:Object。html
Undefined类型只有一只值,即undefined。声明但未进行初始化的变量的值是undefined。具体请看下面的例子:es6
// 声明但未进行初始化的变量的值是undefined
var message;
alert(message == undefined); //true
// 可使用undefined显式初始化变量,ECMA-262第三版引入undefined这个值,主要用于区分空对象指针(null)与未初始化的变量。
var message = undefined;
alert(typeof age); // true
// 未声明的变量,直接使用会报错
var message;
alert(message); // "undefined"
alert(age); // 报错!
// 未声明的变量,使用typeof操做符检测不会报错
var message;
alert(typeof message);// "undefined"
alert(typeof age); // "undefined" ,
复制代码
Null类型与Undefined类型同样也只有一个值,这个特殊值是null
。null表示一个空对象指针,而这也正是typeof null === 'object'
的缘由。浏览器
var person = null;
alert(typeof person); // "object"
复制代码
通常而言,若是定义的变量准备用于保存对象,那么最好将改变量初始化为null
,这样只要检测是否为null
就能够知道该对象是否为空。bash
if(person != null){
// do something...
}
复制代码
实际上undefined
值是由null
派生出来的,由于ECMA-262规定,对它们进行相等性测试时,要返回true
app
alert(null == undefined); // true,注意这里是“==”,不是“===”
复制代码
注意:不管在何时都没有必要将一个变量初始化为undefined
,可是颇有必要将一个空对象初始化成null
。函数
Boolean类型只有两个值true
和false
,须要注意的是true
不必定等于1,而false
也不必定等于0。另外这两个值区分大小写,True
和False
(以及其余的混合大小写)都不是Boolean值。测试
虽然Boolean只要两个值,可是全部类型的值都有与这两个值等价的值。能够调用转型函数Boolean()
,将其余类型的值转化成Boolean值。ui
各类数据类型转成Boolean值的规则:this
数据类型 | 准换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任意非空字符 | “” (空字符串) |
Number | 任意非零数值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | n/a(N/A)是not applicable的缩写,意思是“不适用” | undefined |
ECMAScript使用IEEE754格式来表示整数和浮点数(也叫双精度数值)。ECMAScript中,整数可使用十进制、十六进制以及八进制来表示。spa
八进制第一位必须是0,而后是八进制的数字序列(0-7),若是字面数值超出范围,第一位的0将被忽略,当成十进制数值解析。
var octalNum1 = 070; // 有效的八进制,解析为十进制的56
var octalNum2 = 079; // 无效的八进制,解析为十进制的79
var octalNum3 = 08; // 无效的八进制,解析为十进制的8
// 注意:八进制字面量在严格模式下是无效的,会致使支持JavaScript引擎抛出错误
复制代码
十进制字面量前两位必须是0x,后面跟任意十六进制的字符(0-9及A-F)。其中A-F能够大写,也能够小写。
var hexNum1 = 0xa; // 十六进制的表示的10(十进制)
var hexNum2 = 0x1f; // 十六进制表示的31 (十进制)
复制代码
注意:在进行算数运算时,全部八进制、十六进制表示的数值最终都将被转换成十进制的数值
所谓浮点数,就是有小数点的数。保存浮点数所需的空间是保存整数的两倍,所以ECMAScript会适当的将浮点数值转化成整数值。例如,当小数点后面没有跟任何数字时。更多浮点数的转换及表示请看下面的例子:
var floatNum1 = 1.1;
var floatNum2 = 1.0; // 存储时,会被智能转化成整数
var floatNum3 = .1;// 有效,可是不推荐!
var floatNum4 = 3.125e7 // 等于3125000。科学计数法表示浮点数,用e表示的数值等于e前面的数值乘以10的指数次幂,e能够大写也能够小写。
var floatNum5 = 0.0000006; // 会被转化成6e-7。默认状况下ECMAscript会将后面带有6个零以上的浮点转化成科学计数法。
复制代码
浮点数值的最高精度是17位小数,可是在进行算数计算时,其精度远远不如整数,例如:0.1加0.2的结果不等于0.3,而是0.30000000000000004。这个舍入偏差会致使没法测试特定的浮点数值。
if(a+b==0.3){ // 不要作这样的测试!
alert('你得到了0.3')
}
复制代码
提示:关于浮点数的偏差,是基于IEEE754数值的浮点计算的通病,ECMAScript并不是独此一家,其余相同数值格式的语言也存在这个问题
Number.MIN_VALUE
中,这个值是5e-324
Number.MAX_VALUE
中,这个值是1.7976931348623157e+308
Infinity
(无穷大),负数会转换成-Infinity
,正数会转换成Infinity
-Infinity
没法再进行计算isFinite()
函数来检测某个数值是不是又穷的var result = Number.MAX_VALUE + Number.MAX_VALUE;
alert(isFinite(result)); // false
复制代码
提示:访问Number.POSITIVE_INFINITY
和Number.NEGATIVE_INFINITY
也能够获得正负的Infinty值
NaN即非数值(not a Number),是一个特殊的数值,这个数值表示一个原本要返回数值可是未返回数值的状况(这样就不会报错了)。例如:在其余语言中,任何数值除以0都会报错,但在ECMAScript中,会返回NaN。NaN有以下要注意的点:
isNaN()
函数肯定一个值是否”不是数值“alert(NaN == NaN); // false
alert(isNaN(NaN)); // true
alert(isNaN(10)); // false(10是一个数值)
alert(isNaN("10")); // false("10"能够被转化成数值)
alert(isNaN("blue")); // true ("blue"不能被转化成数值)
alert(isNaN(true)); // false (true能够被转化成数值1)
alert(0/0); // NaN
alert(10/0); // Infinity
alert(-10/0); // -Infinity
复制代码
提示:有意思的是isNaN()
一样适用于对象。对象调用isNaN()
首先会调用对象的valueOf()
方法,而后肯定该方法是否能够转化为数值,如不能,会调用对象的toString()
方法,再测试返回值。而这个过程也是ECMAScript中内置很熟和操做符的通常执行流程
有三个函数能够将非数值转换为数值:Number()
、parseInt()
、parseFloat()
。
Number()
能够用于任何数据类型parseInt()
用于将字符串转化成整型parseFloat()
用于将字符串转化成浮点型// 布尔类型
Number(Boolean); // true 和 false将分别转换成1和0
// 数值类型
Number(123); // 返回 123。不转换,只作简单的传入和返回
// Null类型
Number(null); // 返回 0
// Undefined类型
Number(undefined); // 返回NaN
// 字符串——只有整数:
Number("100"); // 返回 100。
Number("012"); // 返回 12。注意:前导零被忽略了
// 字符串——只有浮点数
Number("0.123"); // 返回 0.123
Number("01.23");// 返回 1.23。注意:前导零被忽略了
// 字符串——只有十六进制的数值
Number("0xf"); // 返回 15。16进制被转换成十进制
// 空字符串
Number(""); // 返回 0。空字符串被转换成0
// 包含除了上述格式以外的字符
Number("abdc%&3023"); // 返回 NaN
// 对象
Number({}); // 返回 NaN。首先调用valueOf()方法,而后依照前面的规则转换,若是结果是NAN,则调用toString()方法,而后再次依照前面的规则转换返回的字符串。
复制代码
“123blue45”
会被解析为123
。22.5
会被解析为22
。var num1 = parseInt("1234blue"); // 1234
var num2 = parseInt(""); // NaN
var num3 = parseInt("0xA"); // 10
var num4 = parseInt(22.5); // 22
var num5 = parseInt("070"); // 70
var num6 = parseInt("70"); // 70
var num7 = parseInt("0xf"); // 15
复制代码
parseFloat()只解析十进制,所以它没有用第二个参数指定基数的用法。须要注意的是:若是一个字符串包含的是一个可解析为整数的数(没有小数点,或小数点后都是零),parseFloat()会返回整数。
var num1 = parseFloat("1234blue"); // 1234(整数)
var num2 = parseFloat("0xA"); // 0
var num3 = parseFloat("22.5"); // 22.5
var num4 = parseFloat("22.34.5"); // 22.34
var num5 = parseFloat("0908.5"); // 908.5
var num6 = parseFloat("3.125e7"); // 31250000
复制代码
""
和''
表示。字符串中包含一些特殊的字符字面量,也叫转义字符,或者具备其余用途的字符。这些字符字面量以下表所示:
字面量 | 含义 |
---|---|
\n | 换行 |
\t | 制表 |
\b | 空格 |
\r | 回车 |
\f | 换页符 |
\\ | 反斜杠 |
\' | 单引号('),使用单引号表示字符串时。例如:'He said,'hey.'' |
\" | 双引号("),使用双引号表示字符串时。例如:"He said,\"hey.\"" |
\xnn | 以十六进制代码nn表示的一个字符(其中n为0-F)。例如:\x41 表示 “A” |
\unnnn | 以十六进制代码nnnn表示的一个Unicode字符(其中n为0-F)。例如:\u03a3表示希腊字符中的Σ |
以上字符能够出如今字符串任意位置,并且也将做为一个单独的字符来解析。例如:
var text = "This is : \u03a3"; // \u03a3 这6个转义序列会被当作一个字符
alert("This is : \u03a3".length);//输出10
复制代码
var num = 10;
alert(num.toString()); // "10"
alert(num.toString(2)); // "1010"
alert(num.toString(8)); // "12"
alert(num.toString(10)); // "10"
alert(num.toString(16)); // "a"
复制代码
一、若是有toString()方法,调用该方法(没有参数)并返回结果
二、若是值是null,返回“null”
三、若是是undefined(未初始化或初始化为undefined的变量),返回“undefined”
复制代码
123+“”
会获得“123”
提示:复杂的数据建议使用toString()
或String()
,简单的推荐使用加号连接的方式。
在ECMAScript中,对象其实就是一组数据和功能的组合。建立对象的方式有两种,一种是经过new关键字,另外一种是字面量的方式。
var obj = new Object();
var obj = {}
复制代码
var Person = function(){this.name='linlif'}
var person = new Person()
person.hasOwnProperty("name") // true
复制代码
function Parent() {this.name = "linlif";}
Parent.prototype.alertP = function() {
alert("Parent");
}
function Child() {this.age = 25;}
Child.prototype.alertC = function() {
alert("Child");
}
function F() {}
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
var child = new Child();
Parent.prototype.isPrototypeOf(child); // true
Child.prototype.isPrototypeOf(child); // true
复制代码
function Person (){ this.name = 'linlif' };
Person.prototype.age = 25;
var obj = new Person()
for (var key in obj) {
if (obj.hasOwnProperty(key)){
console.log(key) // name
}else{
console.log(key) // age
}
}
复制代码
最后,附上一张脑图,方便你们理解和记忆!
本文没有涉及ES6新增Symbol数据类型,有兴趣的请自行查阅读阮一峰老师的在线书籍。地址:es6.ruanyifeng.com/#docs/symbo…
本文是JavaScript基础系列的第一篇文章,后续会继续补上剩下的,欢迎持续关注!写总结真不容易,但坚持就是胜利,为本身加油!(๑•̀ㅂ•́)و✧