- 针对原始类型数据,使用值传递方式;
- 针对引用类型数据,使用址传递方式。
一、Undefined类型
Undefined只有一个值,即undefined。在使用var声明变量,但没有对其初始化时,这个变量的值就是undefined。
因为没有初始化的变量会隐时的(自动的)赋值undefined,因此我们没有必要显示的给一个变量赋值为undefined。
未初始化的变量和未声明的(不存在的)变量也是不一样的:
var a;
alert(typeof a);
alert(typeof b); //都返回undefined,但从逻辑上思考,他们的值,一个是undefined,一个报错;他们的类型都是undefined。所以,我们在定义变量时尽可能的不要只声明,不不赋值。
二、Null类型
Null只有一个值,即null。表示一个空对象引用(指针),而typeof操作符会返回object。如果定义的变量准备在将来用于保存对象那么最好将变量初始化为null。这样,当检查null值就知道变量是否已经分配对象引用了。
var a = null;//表示还没有创建对象,但先声明了对象引用而必须初始化的结果(即还没来得及创建对象,先声明一个对象的变量放在那边,默认初始化为null)。
if(a != null) { //a != null 说明不是空对象
alert("对象已经创建成功!"); //打印不出来
}
例:
var a;
a = {
1:1
};
alert(a);
当我们之后需要用到变量但又不知道给它初始化什么值时:
var a = null; //对象初始化,一般用null;
var a = ""; //创建一个字符串变量,但一开始不知道初始化什么字符串,所以给他一个空字符串;
var a = 0; //数值初始化,一般用0;
var a = false; //布尔值初始化,一般一开始用false或者true;
需要注意的是:undefined是派生自null的,因此ECMA-262规定对他们的相等性测试返回true。
alert(undefined == null); //true undefined为未定义,null为空。都是为空,所以它们是相等的。
alert(undefined === null); //false 全等必须要数据类型也要相等才可以。
alert(typeof undefined == typeof null); //false
三、Boolean类型
Boolean类型有两个值(字面量):true和false。**true不一定等于1,false也不一定等于0。**JavaScript是区分大小写的,True和False或者其他都不是Boolean类型的值。
console.log( true === 1); //false
console.log(typeof true == typeof 1); //false
虽然Boolean类型的字面量只有true和false两种,但ECMAScript中所有类型的值都有雨这两个Boolean等价的值。要将一个值转换为其对应的Boolean值,可以使用转型函数Boolean()。
var a = "hi";
var a1 = Boolean(a);
console.log(a1); //true
console.log(typeof a1); //boolean
上面是一种显示转换,属于强制性转换。而实际应用中,还有一种隐式转换。比如,在if条件语句里面的条件判断,就存在隐式转换。
数据类型 | 转换为true | 转换为false |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | 空字符串 |
Number | 任何非零数字值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | undefined |
四、Number类型
Number类型包含两种数值:整型和浮点型(在某些语言中也称为双精度数值)。为了支持各种数值类型。ECMA-262定义了不同的数值字面量格式。
1、整型:
- 最基本的数值字面量是十进制整数。
八进制字面量,(以8为基数),前导必须是0,八进制数字序列(0~7)。八进制字面量在严格模式下是无效的。
var a = 074; //输出十进制数值60 var b = 079; //无效八进制,输出十进制数值79
- 十六进制字面量,前两位必须为0x,后跟任何十六进制数字(0~9及A~F)
在进行算术计算时,所有八进制和十六进制表示的数值最终都将被转换为十进制数值。
2、浮点型
数值中必须包含一个小数点。
var a = 0.7;
var a = .7; //有效,但不推荐
var b = 07.9;
由于保存浮点数值需要的内存空间比整型数值大两倍,因此ECMAScript会不失时机地将浮点数值转换为整数。
var a = 7.; //小数点后面没有值,转换为7
var a = 7.0; //小数点后面为0,转换为7
对于那些过大或过小的数值,可以用e表示法(即科学计数法)表示的浮点数值表示。
用e表示发表示的数值等于e(大小写都可)前面的数值乘以10的指数次幂。
var a = 4.12e9; //4120000000
var a = 0.00000421; //0.00000421
var a = 42.1e-10; //4.21e-9
虽然浮点数值的最高精度是17位小数,但算术运算中可能会不精确。(判断时最好使用整型判断)
3、数值范围
Number.MIN_VALUE; 最大数值。
Number.MAX_VALUE; 最小数值。
console.log(Number.MIN_VALUE); //5e-324
console.log(Number.MAX_VALUE); //1.7976931348623157e+308
超出数值范围时会返回:Infinity 和 -Infinity
console.log(100e10000000); //Infinity
console.log(-100e10000000); //-Infinity
查看正、负无穷Infinity 和 -Infinity值
Number.POSITIVE_INFINITY;
Number.NEGATIVE_INFINITY;
console.log(Number.POSITIVE_INFINITY); //Infinity
console.log(Number.NEGATIVE_INFINITY); //-Infinity
函数isFinite(),查看数值是否在范围内
4、NaN
NaN表示一个本来要返回数值的操作数未返回数值的情况。任何值除以0都会返回NaN。
NaN有两个特点:1、任何与NaN进行运算的结果都为NaN;2、NaN与任何值都不想等,包括NaN本身。
ECMAScript提供了isNaN()函数,判断是否是非数值。
isNaN()在接收到一个值后,会尝试将这个之转换为数值。(true转换为1,false转换为0,数值字符串转换为数值)
5、数值转换
非数值转换为数值(方法) | |
---|---|
Number() | 用于任何类型数据 |
parseInt() | 只能用与字符串,其他都返回NaN |
parseFloat() |
Number()转换规则:
- 如果是Boolean值,ture和false将分别转换为1和0;
- 如果是数字值,则只是简单的传入和返回。
- 如果是null值,则返回0;
- undefined,返回NaN;
如果是字符串:
只包含数字 —— 转换为十进制和十六进制(无八进制);
“”空字符串——0;// parseInt()和parseFloat()转换为NaN
其他——转换为NaN。parseInt(需判断的字符串,基数): console.log(parseInt("110",2)); //6 (按二进制解析) console.log(parseInt("110",8)); //72 (按八进制解析) console.log(parseInt("110",10)); //110 (按十进制解析) console.log(parseInt("110",16)); //272 (按十六进制解析)
不指定基数意味着让parseInt()决定如何解析输入的字符串,因此为了避免错误的解析,建议无论在什么情况下都明确指定基数。
五、String类型
1、字符字面量(又称转义序列)
字面量 | 含义 |
---|---|
\n | 换行 |
\t | 制表 |
\b | 退格 |
\r | 回车 |
\f | 进纸 |
\\ | 斜杠 |
\’ | 单引号,在单引号表示的字符串中使用。例如:’He said,\’hey.\” |
\” | 双引号,在双引号表示的字符串中使用。例如:”He said,\”hey.\”“ |
\xnn | 以十六进制代码nn表示的一个字符(其中n为0~F)。例如:\x41表示”A” |
\unnn | 以十六进制代码nn表示的一个Unicode字符(其中n为0~F),例如:\u03a3表示希腊字符Σ |
var a = "s\u03a3";
console.log(a); //返回sΣ
console.log(a.length); //返回2【其中\u03a3被转移为一个字符】
2、转换为字符串
两种方法:
1、toString()方法
几乎每个值(除了null和undefined)都有的toString()方法
使用此方法时,多不必传参。但是,在调用数值的toString()方法时,可以传数值输出的基数(默认一十进制输出)。var a = 456; console.log(a.toString(2)); //输出111001000
2、强制转换 String()
这个函数可以将任何类型的值转回为字符串。
六、Object类型
var foo = null;//表示还没有创建对象,但先声明了对象引用而必须初始化的结果(即还没来得及创建对象,先声明一个对象的变量放在那边,默认初始化为null)。
var foo = {};
属性和方法:
- constructor;保存用于创建当前对象的函数(原型对象都包含一个指向构造函数的指针(constructor属性));
- hasOwnProprety(prototypeName);用于检查给定的属性在当前对象实例中(而不是对象原型中)是否存在。(作为参数的属性名必须以字符串形式指定。)
- isPrototypeOf(object);用于检查传入的对象是否是传入对象的原型。
- propertyIsEnumerable(propertyName);用于检查给定的属性是否能够使用for-in语句来枚举。
- toLocaleString();返回对象的字符串表示,该字符串与执行环境的地区对应。
- toString();返回对象的字符串表示。
- valueOf();返回对象的字符串、数值、或布尔值表示。通常与toString()方法的返回值一样。
由于在ECMAScript中Object是所有对象的基础,因此所有对象都具有这些基本的属性和方法。