JavaScript的基本概念
变量
ECMAScript的变量是松散类型的,即可以用来保存任何类型的数据。(可以在修改变量值的同时修改值的类型)
var message = "hi",
found = false,
age = 29;
基本类型 vs 引用类型
类别 | 基本类型 | 引用类型 |
---|---|---|
数据类型 | Undefined、Null、Boolean、Number、String | Object |
属性添加 | 不支持 | 支持 |
变量复制 var a = b; | a, b相互独立,值复制 | 值(指针)复制,引用同一个对象 |
数据类型
ECMAScript中有Undefined、Null、Boolean、Number、String和Object6种数据类型,不支持任何创建自定义类型的机制。typeof 操作符可以检测给定变量的数据类型。
Undefined类型
Undefined类型只有一个值,即Undefined。在使用var声明变量但未对其初始化或使用typeof检测尚未声明过的变量时,会获得Undefined。
Null类型
Null类型只有一个值,即null。从逻辑角度看,null值表示一个空对象指针,因此 typeof null == object。实际上,undefined值派生自null值,因此ECMA-262规定 null == undefined。
Boolean类型
该类型有true和false两个字面值(True和 False都不是 Boolean值,只是标识符),可以对任何数据类型的值调用Boolean()函数。
数据类型 | 转换为true的值 | 转换为false的值 |
---|---|---|
Boolean | true | false |
String | 任何非空字符串 | " " |
Number | 任何非零数字值(包括无穷大) | 0和NaN |
Object | 任何对象 | null |
Undefined | - | undefined |
Number类型
该类型使用IEEE754格式表示整数和浮点数值(浮点数值存在舍入误差)。
- 最基本的格式采用十进制整数,八进制字面值的首位必须是0(若后续数值超出范围,则前导零将被忽略,当作十进制数解析。严格模式下八进制无效),十六进制字面值的前两位必须是0x。
- 浮点数值必须包含一个小数点,且小数点后必须至少有一位非0数字,可用e表示法(即科学计数法),最高精度是17位小数。
- Number.MIN_VALUE(一般为5e-324)、Number.MAX_VALUE(一般为1.7976931348623157e+308),超出范围的值将自动转换为Infinity或-Infinity,使用isFinite()函数可判断一个数值是否有穷。
- NaN表示非数值情况。任何涉及NaN的操作都会返回NaN,且NaN与任何值都不相等(包括其自身)。
数值转换
- Number()适用于任何数据类型
var num1 = Number("Hello World!"); //NaN
var num2 = Number(" "); //0
var num3 = Number("0011.1"); //11.1
var num4 = Number("0011abc"); //NaN
var num5 = Number(true); //1
var num6 = Number(null); //0
var num7;
Number(num7); //NaN
- parseInt()用于把字符串换成整数
var num1 = parseInt("1234blue"); //1234
var num2 = parseInt(" "); //NaN
var num3 = parseInt("0xA"); //10
var num4 = parseInt("22.5"); //22
var num5 = parseInt("070"); //56
var num6 = parseInt("70"); //70
- parseFloat()用于把字符串换成浮点数格式,只解析十进制值
var num1 = parseFloat("1234blue"); //1234
var num2 = parseFloat("0xA"); //0
var num3 = parseFloat("22.34.5"); //22.34
var num4 = parseFloat("22.5"); //22.5
var num5 = parseFloat("3.125e7"); //31250000
String类型
该类型用于表示由0或多个16位Unicode字符组成的字符序列,即字符串。包含转义序列。任何字符串的长度都可通过访问其length属性取得(不包含双字节字符时),且字符串是不可变的。
转换为字符串
- toString()方法(数值、布尔值、对象和字符串值有,null和undefined值没有),可通过传递输出数值的基数输出以二进制、八进制、十进制、十六进制等格式表示的字符串值。
- 转型函数String()适用于所有类型的值,遵循以下规则:
– 如果值有toString()方法,则调用该方法(没有参数)并返回相应的结果
– 如果值为null,则返回"null"
– 如果值为undefined,则返回"undefined"
Object类型
ECMAScript中的对象是一组数据和功能的集合,可通过 var o = new Object(); 来创建。Object的每个实例都具有下列属性和方法:
- constructor:保存用于创建当前对象的函数
- hasOwnProperty(propertyName):用于检查给定的属性在当前对象实例中是否存在
- isPrototypeof(object):用于检查传入的对象是否是当前对象的原型
- propertyIsEnumerable(propertyName):用于检查给定的属性是否能用for-in语句来枚举
- toLocaleString():返回对象的字符串表示,与执行环境的地区对应
- toString():返回对象的字符串表示
- valueOf():返回对象的字符串、数值或布尔值表示。通常与toString()方法的返回值相同
操作符
ECMAScript有算术操作符、位操作符、关系操作符和相等操作符,能够适用于字符串、数字值、布尔值,甚至对象。
- 自增和自减
var s1 = "2";
var s2 = "z";
var b = false;
var f = 1.1;
var num1 = 2;
var num2 = 20;
var num3 = --num1 + num2; //21
var num4 = num1-- + num2; //22
var o = {
valueof: function() {
return -1;
}
};
s1++; //3
s2++; //NaN
b++; //1
f--; //0.10000000000000009
o--; //-2
- 一元加减操作符
var s1 = "01";
var s2 = "z";
var s3 = "1.1";
var f = 1.1;
var b = false;
var o = {
valueof: function() {
return -1;
}
};
s1 = +s1; //1
s2 = -s2; //NaN
s3 = +s3; //1.1
f = -f; //-1.1
b = +b; //0
o = -o; //1
- 位操作符
基本上与其他语言的位操作效果一样,但特殊的NaN和Infinity值会被当成0来处理。如果对非数值应用位操作符,会先使用Number()函数将该值转换为一个数值(自动完成),再应用位操作,得到一个数值。
位操作 | 符号 |
---|---|
按位非(NOT) | ~ |
按位与(AND) | & |
按位或(OR) | | |
按位异或(XOR) | ^ |
- 左移操作不会影响操作数的符号位
- >> 是有符号的右移,会用符号位的值来填充所有空位
- >>> 是无符号右移,会用0来填充所有空位
- 布尔操作符
- 逻辑非
条件 | 布尔值 |
---|---|
对象、非空字符串、非零数值 | false |
空字符串、0、null、NaN、undefined | true |
- 逻辑与
- 如果第一个操作数是对象,则返回第二个操作数;
- 如果第二个操作数是对象,则只有在第一个操作数的结果为true时才会返回该对象;
- 如果两个操作数都是对象,则返回第二个操作数;
- 如果第一个操作数是null、NaN、undefined,则返回其本身。
- 逻辑或
- 如果第一个操作数是对象,则返回第二个操作数;
- 如果第二个操作数是对象,则只有在第一个操作数的结果为false时才会返回该对象;
- 如果两个操作数都是对象,则返回第一个操作数;
- 如果第一个操作数是null、NaN、undefined,则返回其本身。
- 乘性操作符、加性操作符
操作数为非数值时会自动转换为数值(加法操作符会在操作数为字符串时进行字符串的拼接) - 关系操作符
NaN不能作比较(结果总是false),其余非数值操作数进行转换或比较得到一个布尔值。 - 相等操作符
- 相等和不相等
- null和undefined是相等的
- 如果有一个操作数是NaN,则不相等
- 如果两个操作数都是对象,则比较它们是不是同一个对象 - 全等和不全等
只在两个操作数未经转换就相等的情况下返回true(null !== undefined)
- 相等和不相等
- 条件操作符
variable = boolean_expression ? true_value : false_value; - 赋值操作符
复合赋值并不会带来任何性能的提升 - 逗号操作符
在用于赋值时,逗号操作符总会返回表达式中的最后一项。
语句
- if语句
会自动调用Boolean()将表达式结果转换为一个布尔值 - do-while语句
循环体内的代码至少会被执行一次 - while语句
循环体内的代码有可能永远不会被执行 - for语句
在循环内部定义的变量也可在外部访问到 - for-in语句
可以用来枚举对象的属性,但通过该语句循环输出的属性名顺序是不可预测的 - label语句
- break、continue语句
break语句会立即退出循环强制执行循环后面的语句,而continue退出循环后会从循环的顶部继续执行。
break和continue语句都可以与label语句联合使用,从而返回代码中特定的位置,多用于循环嵌套时。 - with语句
将代码的作用域设置到一个特定的对象中,严格模式下不准使用。大量使用with语句将导致性能下降。
with(location) {
var qs = search.substring(1);
var hostName = hostname;
var url = href;
}
- switch语句
在比较值时使用的是全等操作符,因此不会发生类型转换。
函数
- 可以向ECMAScript函数传递任意数量的参数,并且可以通过arguments对象来访问这些参数
- 由于不存在函数签名的特性,ECMAScript函数不能重载
- ECMAScript中所有参数传递的都是值,不可能通过引用传递参数。函数的参数是局部变量,会在执行完毕后立即被销毁。
function setName(obj) {
obj.name = "Leo";
obj = new Object();
obj.name = "Lou";
}
var person = new Object();
setName(person);
alert(person.name); //"Leo"