数据类型
JavaScript基本数据类型包括五类,分别是Null、Undefined、Number、String、Boolean。还包括一种复杂的数据类型Object,Object是由一组无序的键值对组成。
typeof 操作符
typeof操作符用于检测给定变量的数据类型,对一个值使用typeof操作符,返回结果分为以下六种情况:
1. "undefined" --- 该值未定义; eg: typeof undefined、var a; typeof a、typeof b、 typeof Undefined、typeof Null(Undefined与Null和变量b一样,表示未定义的变量,并不是代表数据类型)
2. "number" --- 该值是数字; eg: typeof 11、typeof -1314、typeof 13.55
3. "string" --- 该值是字符串; eg: typeof "persistent"、typeof 'persistent'
4. "boolean" --- 该值是布尔值; eg: typeof true、typeof false
5. "Object" --- 该值是对象或null;eg: type of null、typeof {1:a}、typeof [1,2,3](数组也是对象)
6. "function" --- 该值是函数; eg: typeof Number、typeof String、typeof Boolean、typeof Object、typeof Array、typeof Function
Undefined类型
该类型仅有一个特殊的值,即undefined(它不是js的关键字,而是全局变量,即Global的一个属性。),它表示“缺少值”,此处应该有个值。典型用法:
1. 用var关键字申明一个变量并未初始化,该变量的值为undefined。 eg: var i; console.log( i== undefined);
2. 对象没有赋值的属性,该属性的值为undefined eg: var o = {}; console.log(o.p); /* typeof o.p == null和typeof o.p == undefined都返回true,why???*/
3. 调用函数时,该提供的参数并未提供,该参数值为undefined eg: function f(x) {console.log(x);} f();
4. 函数没有返回值时, 默认返回undefined eg: var x = f(); console.log(x);
undefined是脚本引擎定义的一个常量,它在脚本引擎初始化完毕后存在。它的实际作用是用来表示一个已定义变量的未初始化状态(uninitialized),比如var i,i的值是undefined,因为i定义l了但未被初始化。如果从未在代码中出现过的变量被使用,这样的未定义就不是undefined所描述的未初始化,而是说明该变量完全未被登记到脚本引擎的上下文中。因此如下代码的输出结果为:
var mess; console.log(mess == undefined); //trueconsole.log(message == undefined); //报错,提示ReferenceError: messages is not defined
在实际使用中,使用typeof操作符来判断变量是否未定义,是完全可以兼容未定义(undefined)和未初始化(uninitialized)两种状态的,因此如下代码的输出结果为:
console.log(typeof message) //undefined
var mess; console.log(typeof mess) //undefined
Null类型
该类型也仅有一个值,即null(它是js的关键字),表示对象不存在。典型用法:
1. 作为函数的参数,表示该函数的参数不是对象
2. 作为原型链的终点 (Object.getPrototypeOf(Object.prototype) //null)
3. 定义的变量将来用于保存对象,最好将变量初始化为null而非其它值。
null本身是Null类型,但typeof null === "object"并非是因为null是Object,而是历史遗留问题。JS创始人也曾尝试性修复typeof null === "null",但在v8引擎中实现后导致大量问题,因此该提案被拒绝。
null == undefined; //true undefined派生自null,因此ECMA-262规定对它们的相等性测试返回true。
null === undefined; //false 由于null是"object"类型,undefined是"undefined"类型,因此返回false。
Boolean类型
该类型只有两个值,即true和false。要将一个值值转化为对应的Boolean值,可以使用类型转换函数Boolean()。
Number类型
表示整数和浮点数值,以及一种特殊的数值NaN(Not a Number)。
NaN用于表示本该返回数值时未返回数值的情况。例如在其它编程语言中,任何数值除以0,会报错,代码停止运行。但在JavaScript中,任何数值除以0会返回NaN,因此不会影响代码的执行。
NaN本身有两个特点:一,任何涉及NaN的操作,返回NaN(NaN/10,返回NaN);二,NaN与任何值都不相等,包括它自身(NaN == NaN //false)
isNaN()函数,接收一个参数,用于判断传入的值是否不是数值。参数为数值,返回true,参数不为数值,尝试将参数转化为数值,字符串"10"和Boolean类型的值能自动转化为数值。eg:isNaN(NaN) //true、isNaN("10") //false、isNaN("blue") //true、isNaN(true) //false、isNaN(25) //false
将非数值转化为数值有3个函数:parseInt()、parseFloat()和Number() 。
parseInt():从第一个字符开始解析字符,直到解析完最后一个字符,除非遇到一个非数字字符。 它会忽略字符串前面的空格,直到遇到了第一个非空格字符,如果该字符不是数字或负号,则返回NaN。因此parseInt()转换空字符返回false。如果第一个字符为数字,继续解析下一字符,直到最后一个字符或是遇到非数字字符。另外如果第一字符为数字,parseInt能识别各种进制的数字。示例如下:
console.log(parseInt("1234")); //1234 parseInt(" 35 "); //35
parseInt("1234blue"); //1234 parseInt("22.5"); //22
parseInt(""); //NaN
parseInt(NaN); //NaN
parseInt("0xA"); // 10 parseInt("070"); //未定,70或56 parseInt("70"); //70
parseInt("10",2); //2 parseInt("10",8); //8 parseInt("10",10); //10 parseInt("10",16); //16 parseInt("AF",16); //175
parseFloat():从第一个字符开始解析,一直解析到最后一个字符或是遇到了无效的浮点数字符。字符串中第一小数点是有效的,第二个小数点是无效的。parseFloat()与parseInt()的区别在于,parseFloat会忽略前导的零值,parseFloat将值解析为十进制值,没有第二个参数指定基数的用法
console.log(parseFloat("22.45")); //22.45
parseFloat("22.22.33"); //22.33
parseFloat("022.3"); //22.3
parseFloat("1234blue"); //1234
parseFloat("0xA"); //0
String 类型
String类型用于表示由零个或多个16位Unicode字符组成的字符序列,即字符串。字符串可以由双引号""或单引号''表示。eg: var str = "hee";
length属性表示字符串的长度。 eg:var str = "leee"; str.length; //4
将一个值转化为字符串有2个函数:toString()和String()。
toString():数值、布尔值、对象和字符串都有toString()方法,但null和defined值没有toString()方法。调用数值的toString()方法时,可以传递参数,表示输出数值的基数。eg:
var num = 10;
num.toString(); //"10"
num.toString(2); //"1010"
num.toString(8); //"12"
num.toString(10); //"10"
num.toString(16); //"a"
在不确定待转型的值是否为null或undefined的情况下,可以使用String()函数,该函数遵循如下转型规则:
1. 如果值有toString()方法,调用该方法(不带参数),返回相应结果
2. 如果值为null,返回"null"
3. 如果值为undefined,返回"undefined"
Object类型
Object类型实际上就是一组数据和功能的集合。对象可以通过构造函数的方式创建。也可通过创建Object的实例,并添加自己的属性和方法,就可以创建自定义对象。eg: var o = new Object();
Object的每个实例都拥有下列的属性和方法:
1. constructor -- 保存创建当前对象的函数
2. hasOwnProperty(propertyName) -- 指定的属性是否是存在于当前对象的实例中,而不是存在于对象的原型中
3. isPrototypeOf(object) -- 传入的对象是否是另一个对象的原型
4. propertyIsEnumerable(propertyName) -- 检测指定的属性能否用for .. in语句枚举
5. toString() -- 返回对象的字符串表示
6. valueOf() -- 返回对象的字符串、数值、布尔值表示,通常与toString()的返回值相同