3.基本概念
3.4.数据类型
3.4.1.typeof操作符
typeof {未初始化 || 未声明的变量}: undefined
typeof {object || null}: object
(null被认为是一个空的对象引用)typeof function: function
3.4.2.Undefined
var message = undefined; alert(message == undefined): true
typeof {未初始化 || 未声明的变量}: undefined
3.4.3.Null
- 表示一个空对象指针
- 如果定义的变量准备在将来用于保存对象,那么最好将该变量初始化为null,这样只需要检查null值就可以知道相应的变量是否已经保存了一个对象的引用
null == undefined: true
3.4.4.Boolean
-
Boolean( )函数
数据类型 true false Boolean true false String 任何非空字符串 空字符串 Number 任何非零数字 0 和 NaN Object 任何对象 null Undefined N/A undefined
3.4.5.Number
-
进制
var num1 = 070; // 八进制的56 var num2 = 079; // 无效的八进制数字 —— 解析为79 var num3 = 08; // 无效的八进制数字 —— 解析为8 var num4 = 0xA; // 十六进制的10 var num5 = 0x1f; // 十六进制的31
- 八进制字面量在严格模式下无效
- 算术运算中,所以的八进制和十六进制都被转换成十进数值
-
浮点数值
var floatNum1 = 1.1; var floatNum2 = 1.; var floatNum3 = .1; var floatNum4 = 3.125e7;
- 浮点数值的最高精度是17位小数,算术计算时精度远远不如整数
0.1 + 0.2 = 0.30000000000000004
if(0.1 + 0.2 == 0.3) 不要做这样的测试
if(0.05 + 0.25 == 0.3) 可以
- 浮点数值的最高精度是17位小数,算术计算时精度远远不如整数
-
数值范围
-
Number.MAX_VALUE —— Number.MIN_VALUE, 超出的话会自动转换为 Infinity and -Infinity
-
判断是否无穷:
isFinite()
-
-
NaN
-
任何涉及NaN的操作,都会返回NaN
-
NaN与任何值都不相等,包括NaN本身
-
判断某个值是否 不是数值
isNaN(NaN); // true isNaN(10); // false isNaN("10"); // false, 可以被转换为数值 isNaN("blue"); // true, 不能转换成数值 isNaN(true); // false, 可以被转换为数值1
-
-
数值转换
-
有三个函数可以把非数值转换为数值:Number(), parseInt(), parseFloat()
-
Number( ) 函数的转换规则
类型 转换结果 Boolean true : 1 & false : 0 Number 简单的传入和返回 null 0 undefined NaN String 如果字符串中只包含数字:转换为十进制数值(忽略前导0);字符串为空:转换为0;其他字符串:转换为NaN Object 先调用valueOf ( )方法,依次执行上面;如果结果是NaN,再接着调用toString ( )方法,依次执行上面 - 一元加操作和Number( )函数相同
-
Number( )函数转换字符串比较复杂,parseInt( )
-
忽略字符串前面的空格,直到找到第一个非空空字符串
-
如果第一个非空字符不是数字字符或者正负号,parseInt( )会返回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"); // ES3:56, ES5:70, ES5中parseInt不会解析八进制 var num6 = parseInt("0xf"); // 15
-
消除进制疑惑,可以为parseInt( )方法提供第二个参数,指定进制
var num1 = parseInt("0xAF", 16); // 175 var num2 = parseInt("AF", 16); // 175 var num3 = parseInt("AF"); // NaN var num4 = parseInt("070", 8); // 56
-
-
parseFloat( )
-
parseFloat与parseInt的第一个区别是字符串中的第一个小数点是有效的
-
第二个区别是始终会忽略前导0
-
parseFloat只解析十进制
var num1 = parseFloat(" 1234blue"); // 1234 var num2 = parseFloat("0xA"); // 0 var num3 = parseFloat("070"); // 70 var num4 = parseFloat("22.5"); // 22.5 var num5 = parseFloat("22.34.5"); // 22.34 var num6 = parseFloat("0908.5"); // 908.5 var num7 = parseFloat("3.125e7"); // 31250000 var num8 = parseFloat("3.1415000"); // 3.1415 var num9 = parseFloat("3.00"); // 3
-
-
3.4.6.String
-
字符串字面量
字面量 含义 \xnn 以十六进制代码nn表示的一个字符 eg: \x41表示"A" \unnnn 以十六进制代码nnnn表示一个Unicode字符 eg: \u03a3表示欧米茄 -
字符串编译
- 字符串一旦创建,值是不可以改变的,要改变某个变量保存的字符串,首先要销毁原来的字符串,然后再用另外一个包含新值的字符串填充这个变量
-
转换为字符串
-
几乎每种值都有的方法(null 和 undefined没有):toString( )
var num = 10; var str1 = num.toString(); // "10" var str2 = num.toString(2); // "1010" var str3 = num.toString(8); // "12" var str4 = num.toString(16); // "a" var str5 = num.toString(10); // "10"
-
在不知道要转换的值是不是null或undefined的情况下:String( )
- 如果值有toString( ),则调用该方法
- 如果值是null,返回"null"
- 如果值是undefined,返回"undefined"
-
3.4.7.Object
3.5.操作符
3.5.1.一元操作符
-
前置后置递增,前置后置递减
-
不仅适用于整数,还可以用于其他非null和undefined的值
类型 操作结果 包含数字的String 先将其转换为数值,再加减1 不包含数字的String 将变量值设置为NaN,字符串变量变为数值变量 boolean 先转换为0/1再进行加减1,布尔变量变为数值变量 Object 先调用valueOf ( )方法,依次执行上面;如果结果是NaN,再接着调用toString ( )方法,依次执行上面,对象变量变为数值变量
-
-
一元加和减操作符
- 对于非数值类型来说,相当于Number( )方法,当然如果是一元减还有结果取负
3.5.2.位操作符*
-
按位非:NOT
- 本质:操作数的负值 - 1
var num1 = 25; var num2 = ~num1; // -26 var num3 = 25; var num2 = -num1 - 1; // 按位非的本质
-
按位与:AND
var result = 25 & 3;
-
按位或:OR
var result = 25 | 3;
-
按位异或:XOR
var result = 25 ^ 3;
-
左移
var oldValue = 2; // 10(2) var newValue = oldValue << 5; // 1000000(2)
3.5.3.布尔操作符
-
逻辑非:!
类型 返回值 !对象 false !"" true ! “非空字符串” false ! 0 true ! 任意非零 false ! null true !NaN true ! undefined true !!
相当于Boolean()方法
-
逻辑与:&&
- 逻辑与可以应用于任何类型的操作数,而不仅仅是布尔值,而且在有一个操作数不是布尔值的情况下,逻辑与操作就不一定返回布尔值
类型 返回值 第一个操作数是对象 返回第二个操作数 第二个操作数是对象 只有在第一个操作数的求值结果为true的时候,才会返回该对象 两个操作数都是对象 返回第二个操作数 有一个操作数是NaN 返回NaN 有一个操作数是undefined 返回undefined -
// eg1 var found = true; var result = (found && someUndefinedVariable); //发生错误 // eg2 var found = false; var result = (found && someUndefinedVariable); //正常执行,返回false
3.5.4.乘性操作符
-
乘法 *
类型 返回值 Infinity * 0 NaN 有一个操作数是NaN NaN 如果操作数不是数值,则使用Number( )方法转换再操作 -
除法 /
类型 返回值 有一个操作数是NaN NaN Infinity / Infinity NaN 0 / 0 NaN 非零有限数 / 0 Infinity / -Infinity 如果操作数不是数值,则使用Number( )方法转换再操作 -
求模 %
类型 返回值 Infinity % 有限大的数值 NaN 有限大的数值 % 0 NaN Infinity % Infinity NaN 有限大的数值 % Infinity 有限大的数值 0 % 任何数值 0 如果操作数不是数值,则使用Number( )方法转换再操作
3.5.5.加性操作
-
加法 +
类型 返回值 如果一个操作数是NaN NaN Infinity - infinity NaN 如果只有一个操作数是字符串,则将另一个操作数转换为字符串,然后再将两个字符串拼接起来 如果两个操作数都是字符串,那么直接拼接起来 如果一个操作数是对象,数值或布尔值,则调用他们的toString( )方法取得相应的字符串,然后再应用前面关于字符串的原则 对于undefined和null,分别调用String( )方法获得"undefined"和"null" // eg1 var num1 = 5; var num2 = 10; var message = "The sum of 5 and 10 is " + num1 + num2; alert(message); // The sum of 5 and 10 is 510 // eg2 var num1 = 5; var num2 = 10; var message = "The sum of 5 and 10 is " + (num1 + num2); alert(message); // The sum of 5 and 10 is 15
-
减法 -
类型 返回值 数字类型 规律同加法 如果有一个操作数是String,boolean,null,undefined,则先调用Number( )将其转换为数值,再根据前面的规则进行计算 如果有一个操作数是对象,则调用对象的valueOf( )方法以取得表示该对象的数值,如果没有这个方法,则调用其toString( )方法
3.5.6.关系操作符
类型 | 返回值 |
---|---|
如果两个数都是数值,则执行数值比较 | |
如果两个操作数都是字符串,则比较两个字符串的字符编码值 | |
如果一个操作数是数值,则将另一个操作数转换为一个数值,然后执行数值比较 | |
如果一个操作数是布尔,则先将其转换为数值,然后再执行比较 | |
如果一个操作数是对象,则调用这个对象的valueOf( )方法,得到的结果按照前面的规则进行比较;如果没有这个方法,则调用toString( )方法,并根据规则比较 |
3.5.7.相等操作符
-
==:先转换再比较
规则 如果一个操作数是布尔值,则先将其转换为数值 如果一个操作数是字符串,另一个操作数是数值,则比较想等性之前先将字符串转为数值 如果一个操作数是对象,另一个操作数不是,则调用对象的valueOf( )方法,再按照前面的规则比较 null和undefined是相等的 NaN不与任何数相等 如果两个操作数都是对象,则比较他们是不是同一个对象(两个操作数指向的对象值相同) -
===:仅比较不转换
规则 null 和 undefined 不全等 如果两个操作数都是对象,则比较他们是不是指向同一块地址
3.5.8.条件操作符
var max = (num1 > num2) ? num1 : num2;
3.5.9.赋值操作符
%=
3.5.10.逗号操作符
var num = (5,1,4,8,0); // num的值为0
3.6.语句
3.6.1.if
3.6.2.do-while
3.6.3.while
3.6.4.for
for(;;){ } // 相当于while(true)
for(; i<count; ){ } // 相当于while(i<count)
3.6.5.for-in
- 枚举对象的属性
- ES5 中枚举到null 或者 undefined会停止执行循环体
- 顺序不确定
3.6.6.label
- 多层循环配合 continue 和 break 使用
3.6.7.beak & continue
3.6.8.with
- 严格模式不允许使用
- 开发时不建议使用,性能低
var qs = location.search.substring(1);
var hostName = location.hostname;
var url.= location.href;
with(location){
var qs = location.search.substring(1);
var hostName = location.hostname;
var url.= location.href;
}
3.6.9.switch
3.7.函数
3.7.1.参数
- 命名的参数只提供便利,但不是必需的(通过arguments数组获得参数)
- 非严格模式下arguments数组与命名参数双向绑定(但不共享同一块内存空间)
- 严格模式下arguments重写无效
- 如果只传递一个参数,那么arguments[1]为undefined
3.7.2.没有重载
- 两个相同名字的函数,该名字只属于后定义的函数