JavaScript高级程序设计(第3版)笔记(三)
来源:互联网 发布:淘宝特价秒杀二维码 编辑:程序博客网 时间:2024/05/01 15:55
一元操作符:递增递减操作符,一元加和减操作符
在应用于一个不包含有效数字字符的字符串时,将变量的值设置为NaN
不同类型使用‘+’,相当于Number()类型转换
位操作符:(1)按位非(NOT)由~(波浪线)表示,按位非的结果是返回数值的反码var num1 = 25; //00000000000000000000000000011001
var num2 = ~num1;//11111111111111111111111111100110
alert(num2);//-26 相当于操作数的负值减1
注:数字的反码相当与数字的负数减1;负数相当于反码加1
(2)按位与(AND)由&表示,第一个数值的位 第二个数值的位 结果
1 1 1
1 0 0
0 1 0
0 0 0
var result = 25 & 3; 25 == 11001
alert(result); //1 3 == 00011
00001
按位与操作只在两个数值的对应位都是1时,才返回1,其他返回0
(3)按位或(OR)由|表示
第一个数值的位 第二个数值的位 结果
1 1 1
1 0 1
0 1 1
0 0 0
var result = 25 | 3; 25 == 11001
alert(result);//27 3 == 00011
11011
按位或操作在有一位是1的情况下就返回1;只有都是0的情况下,返回0;
(4)按位异或(XOR),以^表示
第一个数值的位 第二个数值的位 结果
1 1 0
1 0 1
0 1 1
0 0 0
var result = 25 ^ 3; 25 == 11001
alert(result);//26 3 == 00011
11010
按位异或操作在只有一位是1的情况返回1,其他为0,比按位或少1
(5)左移 由<<表示,会将数值的所有为向左移动指定的位数
var oldValue = 2; //二进制的值为 10
var newValue = oldValue <<5; //1000000 64(十进制)
注:左移和有符号的右移不影响符号位,所以 -2 << 5 //-64
(6)有符号的右移,由>>表示,将数值向右移动,但保留符号位var oldValue = 64; //1000000
var newValue = oldValue >>5; //10 2(十进制)
(7)无符号右移,由>>>表示,无符号右移是以0来填充空位,而不像有符号右移是以符号位的值
填充空位,所以正数的无符号右移与有符号右移结果相同,但是负数的结果就很大不同了无符
号右移操作符会将负数的二进制码当成正数的二进制码,而且负数以其绝对值的二进制补码形
式表示,会使结果非常之大
var oldValue = -64; //等于二进制的11111111111111111111111111000000
var newValue = oldValue >>>5; //等于二进制的00000111111111111111111111111110
//十进制的134217726
注:左移是以0来填充空位,而有符号右移是以符号位的值来填充空位,无符号右移是以0来填充空位
布尔操作符:适用任何数据类型(1)逻辑非,!表示,先将它的操作数转换为布尔值,然后求反
如果操作数为一个对象,返回false;
如果操作数为一个空字符串,返回true;
如果操作数为一个非空字符串,返回false;
如果操作数为数值0,返回true;
如果操作数为非零数值(包括infinity),返回false;
如果操作数为null,返回true
如果操作数为NaN,返回true;
如果操作数为undefined,返回true
注:同时使用两个逻辑非操作符,相当于Boolean()
(2)逻辑且,&&表示
如果第一个操作数为true,则返回第二个操作数
如果第一个操作数为null/NaN/undefined,则返回null/NaN/undefined
(3)逻辑或,||表示
如果第一个操作数是对象,则返回第一个操作数
如果第一个操作数的求值为false,则返回第二个操作数
如果两个操作数都是对象,返回第一个操作数
如果两个操作数都是null/NaN/undefined,则返回null/NaN/undefined
(1)如果两个数值相乘超过范围,返回Infinity
(2)如果0乘Infinity,返回NaN
(3)如果Infinity与Infinity/非零数值相乘,按符号返回Infinity
(4)如果有一个为NaN,返回NaN
(5)如果操作数不是数值,先通过Number()转换再操作
除法:
(1)如果非零数值除以Infinity,返回0
(2)如果非零数值包括Infinity除以0,按符号返回Infinity
(3)如果有一个为NaN,返回NaN
(4)如果计算后超过范围,按符号返回Infinity
(5)如果0/0,返回NaN
(6)如果Infinity/Infinity,返回/NaN
(7)Infinity除以非零数,按符号返回Infinity
(8)如果操作数不是数值,先通过Number()转换再操作
求模:
(1)无穷大数值除以有限数值,返回NaN
(2)有限数值除以无穷大数值,返回有限数值(被除数)
(3)有限数值除以0,返回NaN
(4)Infinity除以Infinity,返回NaN
(5)被除数为零,返回零
(6)如果操作数不是数值先通过Number()转换再操作
加性操作符:
(1)有一个操作数为NaN,返回NaN
(2)Infinity加Infinity,返回Infinity
(3)-Infinity加-Infinity,返回-Infinity
(4)-Infinity加Infinity,返回NaN
(5)如果其中一个操作数为字符串,另一个操作数转换为字符串格式,进行拼接
(6)如果其中一个为对象,调用toString(),返回为null/undefined,继续调用valueOf(),根据以上规律操作
var result = "4" + 5;
alert(result) //45
减法:
(1)有一个操作数为NaN且另一个不为字符串,返回NaN
(2)Infinity减Infinity,返回NaN
(3)-Infinity减-Infinity,返回NaN
(4)Infinity减-Infinity,返回Infinity
(5)-Infinity减-Infinity,返回-Ininity
(6)其他类型操作,先转换为数值,再操作,如果转换结果为NaN,返回NaN
关系操作符:> < >= <=
(1)如果两个操作数为字符串,则比较字符编码值
(2)如果有一个为数值,则两个都转换成数值比较(即使是字符串)
(3)如果有一个操作数为boolean,转成数值进行比较
(4)如果是对象,先通过valueOf(),toString(),进行转化,再比较
相等操作符:相等和不相等--先转换,再比较 全等和不全等,先比较,不转换
相等与不相等:
(1)如果一个操作数为布尔,先转成数值,再比较
(2)如果一个操作数为数值,则转换成数值进行比较(即使是字符串)
(3)如果两个对象比较,比较两个是否为一个对象,判断是否指向一个对象,一个对象则为true,否则false
(4)如果一个操作数为NaN,相等比较返回false,不相等比较,返回true
(5)NaN != NaN //true null == undefined //true Infinity === Infinity //true
null == 0 //false undefined == 0 // false
条件操作符:var c = a > b ? a : b;
赋值操作符:+= , -=,*=,/=,\=,<<= , >>=,>>>=
逗号操作符:多用于声明多个变量 var a = 1, b = 2, c = 3;
逗号表达式(优先级低于所有操作符,甚至赋值):
一般形式:表达式1,表达式2,表达式3,...,表达式n;
表达式的值为表达式n的值
常用于for循环中
for(var i=0,j=0;i<2;i++,j++){
}
注:不是所有的逗号都可以看成是逗号表达式,逗号两边必须是表达才可以
如:var a = 1,10; //报错
因为逗号左侧是声明a的语句,不是表达式,所以被认为普通的逗号,常量10不能被声明,报错
alert(2,5) //2
alert((2,5)) //5
由于函数运算符优先级高于逗号运算符,因此第一个例子弹出2,在逗号两侧加上小括号,则优先逗号 运算符,如例2
18、语句
if语句 if(){}else{}
do-while语句 do{}while() 注:不论是否满足条件,先执行一次,for与while不满足条件不执行
while语句 while(){}
for语句 for(){} 注:初始化表达式,控制表达式,循环后表达式都是可选的,都省略,会变成无限循环 for(;;){}
var count = 3;
console.log(i+' '+j);//3 3 i j 为循环内定义的变量,循环外也可以访问到
for-in语句 如:for(var propName in window){console.log(propName)} //会输出window的所有属性 名,但顺序不一定
注:在此循环之前最好确定对象是否为null或undefined
label语句 label:statement,一般由break,continue引用,结合for循环使用
如:例1:var num = 0;
for (var i = 0 ; i < 10 ; i++){
for (var j = 0 ; j < 10 ; j++){
if( i == 5 && j == 5 ){
break;
}
num++;
}
}
alert(num); // 当i为5,j为5时,会跳出j循环继续执行i循环,返回95
例2:var num = 0;
outPoint:
for (var i = 0 ; i < 10 ; i++){
for (var j = 0 ; j < 10 ; j++){
if( i == 5 && j == 5 ){
break outPoint;
}
num++;
}
}
alert(num); // 当i为5,j为5时,会跳出到定义的outPint不再执行循环,返回55
例3:var num = 0;
outPoint:
for (var i = 0 ; i < 10 ; i++){
for (var j = 0 ; j < 10 ; j++){
if( i == 5 && j == 5 ){
continue outPoint;
}
num++;
}
}
alert(num); // 当i为5,j为5时,会跳出当前循环,再继续执行,返回9
break与continue语句
break 会强制跳出当前循环,执行循环外的代码
continue 会停止执行continue以下的代码,继续循环
with语句 严格模式下,不可使用
如 : var qs = location.search.substring(1);
var hostName = location.hostname;
var url = location.href;
可改写成:with(location){
var qs = search.substring(1);
var hostName = hostName;
var url = href;
}
重写的例子中,with关联了location对象,with语句的代码块中,每个变量首先认为是局部变量,
局部环境找不到变量的定义,再查找location中是否含有同名的属性,进行使用
switch语句 switch(expression){
case value: statement
break;
case value: statement
break;
default:statement
}
注:(1)case后的statement可不写
例: switch(i){
case 25:
case 26: alert("26");
default: alert("other");
}
注:严格模式下,不能把函数及参数命名为eval或arguments,不能出现命名参数同名的情况
理解参数
2、严格模式下,不可以对arguments进行修改从而对命名参数修改(会报错)
3、两个名称相同的函数被定义了两次,后定义的函数会覆盖之前定义的函数(不能重载)
- JavaScript高级程序设计(第3版)笔记(三)
- JavaScript高级程序设计(第3版)笔记(一)
- JavaScript高级程序设计(第3版)笔记(二)
- JavaScript高级程序设计(第3版)笔记(四)
- JavaScript高级程序设计(第3版)笔记(五)
- 1.1 JavaScript高级程序设计(第3版) 笔记---对象
- 《javascript高级程序设计(第3版)》阅读笔记
- 《JavaScript高级程序设计(第3版)》知识点笔记1
- 《JavaScript高级程序设计(第3版)》知识点笔记2
- javascript高级程序设计笔记(三)
- JavaScript高级程序设计笔记 (三)
- javascript高级程序设计--学习笔记3 (第5章)
- JavaScript高级程序设计(第3版)阅读笔记第01天-js简介
- JavaScript高级程序设计(第3版)阅读笔记第02天-js基本概念
- JavaScript高级程序设计(第3版)阅读笔记第03天-ajax和Comet
- 《Javascript高级程序设计(第3版)》阅读笔记(持续更新)
- JavaScript高级程序设计(第3版)笔记(五)下
- JavaScript高级程序设计(第3版)学习笔记——callee
- 类Object的所有方法
- 排序-1
- 最长递增子序列之我的第一个动态规划
- gdb调试 mac os
- css——居中(水平、垂直)
- JavaScript高级程序设计(第3版)笔记(三)
- c语言 关于数组 我们需要注意什么
- POJ 2586 贪心 最易理解的解释
- javax.servlet.http cannot be resolved to a type解决方法
- 二十、数串
- service mesh 数据平面nginmesh
- Activity笔记
- Bailian2681 求字符串长度【字符串】
- 2017年学习总结___生成器