新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
1.对
网站的建设创新互联专注网站定制,经验丰富,不做模板,主营网站定制开发.小程序定制开发,H5页面制作!给你焕然一新的设计体验!已为成都iso认证等企业提供专业服务。
2.对
3.对
4.计算机语言数值型数据都是二进制表达的,所以在进行浮点计算时候是很难精确的,Math.sin(Math.PI)是通过微积分计算公式计算出来的,会存在精度上面的误差结果是:1.2246063538223772e-16
运算符就是完成操作的一系列符号,它有七类: 赋值运算符(=,+=,-=,*=,/=,%=,=,=,|=,=)、算术运算符(+,-,*,/,++,--,%)、比较运算符(,,=,=,==,===,!=,!==)、逻辑运算符(||,,!)、条件运算(?:)、位移运算符(|,,,,~,^)和字符串运算符( + )。
所以,~是位移运算符。
~~true == 1
~~false == 0
~~"" == 0
~~[] == 0
~~undefined ==0
~~!undefined == 1
~~null == 0
~~!null == 1
一、算术运算符:
1、运算符:
“+”:功能:对数字进行代数求和;对字符串进行连接操作;将一个数值转换为字符串(数值+空字符串)。
“-”:功能:对操作数进行取反操作;对数字进行减法操作;将字符串转换成数值 (数值型型字符串-0)。
“*”:功能:对两个运算数进行乘法运算;同号得正,异号得负。
“/”:功能:对两个运算数进行除法运算;同号得正,异号得负。
“%”:功能:返回两个除数的余数;和第一个运算数的符号相同。
2、复合赋值运算符: +=、-=、*=、/=、%=
3、自增与自减:
功能相反:++ 对唯一的运算数进行递增操作(每次加1);-- 对唯一的运算数进行递减操作(每次减1);
规则相同:运算数必须是一个变量、数组的一个元素或者对象的属性;如果运算数是非数值的,运算符会将它转成数值;
符号位置决定运算结果:符号位于运算数之前(先进行递增火递减操作,再进行求值);符号位于运算数之后(先求值,再进行递增或者递减操作)
二、关系运算符:
1、大小关系检测:
运算符:、=、=、;
操作规则:数值与数值的比较——比较他们的带数值;仅一个运算数是数值——将另一个运算数转换成数值,并比较他们的代数值;字符串间的比较——逐字符比较他们的Unicode数值;字符串与非数值的比较——将运算数转换成字符串并进行比较;运算数即非数字也非字符串——转换为数值或者字符串进行比较;运算数无法被转换成数值或者字符串——返回值false;与NaN的比较——返回值为false。
2、等值关系检测:
相等比较:操作符有== 和!= ;类型转换(布尔值——true为1,false为0;对象——调用valueOf() 得到基本类型;字符串与数值的比较——字符串转换为数值);比较原则(null与undefined——相等;NaN ——与任何数值都不相等包括其自身;对象——是否属于同一对象 是为== 否为!=)。
相同比较:操作符有===和!== 比较两个运算数的返回值及数据类型是否相同;比较的原则(值类型间比较——只有数据类型相同,且数值相等时才能够相同;值类型与引用类型比较——肯定不相同;引用类型间比较——比较它们的引用值即内存地址)
三、对象运算符:
in:判断左侧运算数是否为右侧运算数的成员。
instancesof:判断对象实例是否属于某个类或者构造函数。
new:根据构造函数创建一个新的对象,并初始化该对象。
delete:删除指定对象的属性、数组元素或者变量。
.及[]:存取对象和数组元素。
():函数调用,改变运算运算符优先等级。
四、逻辑运算符:
1、!逻辑非:
返回值:true(空字符串、0、null、NaN、undefined),false(对象、非空字符串、非0数值);
特性:如果运算数的值为false则返回true,否则返回false;联系2次!,可将任意类型转为布尔型值。
2、逻辑与:
规则:第一个操作数是对象——返回第二个操作数;第二个操作数是对象——第一个操作数值为true时返回该对象;两个操作数都是对象——返回第二个操作数;一个操作数是null——返回null;一个操作数是NaN——返回NaN;一个操作数是undefined——返回undefined。
特性:当且仅当两个运算数的值都是true时,才返回true,否则返回false;短路操作——当地一个操作数的值是false则不在对第二个操作数进行求值。
3、||逻辑或:
规则:第一个操作数是对象——返回第一个操作数;第一个操作数值为false——返回第二个操作数;两个操作数都是对象——返回第一个操作数;两个操作数都是null——返回null;两个操作数都是NaN——返回NaN;两个操作数都是undefined——返回undefined。
特性:当且仅当两个运算数的值都是false时,才返回false,否则返回true;如果第一个操作数值为true,则不会对第二个操作数进行求值。
五、位运算符:
1、基础知识:
类型——有符号(数值位31位,符号位第32位 0为正1为负),无符号(只能正数,第32为表示数值,数值范围可加大);数值范围——-2147483648~2147483648;存储方式——正(纯2进制存储,31位中每一位表示2的幂,用0补存无用位),负(2进制补码存储,补码计算步骤确定该数字的非负版本的二进制表示求得二进制反码,即要把0替换为1,把1替换为0,在二进制反码上加1);当0来处理的特殊值——NaN和Infinity。
2、逻辑位运算:
返回值为1——按位非~(0) ;按位与(对应位全为1);按位或|(任何一位是1);按位异或^(既不同时为0,也不同时为1)。
返回值为0——按位非~(1);按位与(任何一位是0);按位或|(对应位全是0);按位异或^(对应位全为0或全为1)。
3、位移操作:
左移——将数值的所有位左移指定的位数;所有空位用0补存;左移1位对其乘以2,左移2位对其乘以4,以此类推。
有符号右移——将数值的所有位右移指定的位数;移除的味被舍弃;保留符号位;右移1位对其除2,右移2位对其除4,以此类推。
无符号右移——正数(与有符号右移结果相同);负数(会出现无限大的数值)
4、复合赋值运算符:位操作符与等号结合,复合赋值不会有性能方面的提升。
六、其它运算符:
?: ——条件运算符,简介的if else。
typeof——类型判断运算符。
,——逗号,在一行语句中执行多个不同的操作。
void——舍弃运算数的值,返回undefined作为表达式的值。
javascript具有下列种类的运算符:算术运算符;等同运算符与全同运算符;比较运算符; 2、目的分类:字符串运算符;逻辑运算符;逐位运
1、javascript具有下列种类的运算符:算术运算符;等同运算符与全同运算符;比较运算符;2、目的分类:字符串运算符;逻辑运算符;逐位运算符;赋值运算符;3、特殊运算符:条件运算符;typeof运算符;创建对象运算符new;delete运算符;void运算符号;逗号运算符;算术运算符:+ 、 - 、* 、 / 、 % 、 -(一元取反) 、 ++ 、等同运算符与全同运算符:== 、 ===、 !== 、 !===比较运算符: 、 、 = 、 =字符串运算符:: 、 、 = 、 = 、 = 、 +逻辑运算符: 、 、 !、赋值运算符:=、 +=、 *=、 -=、 /=规则:一、一定要注意传递给运算符的数据类型和返回的数据类型!不同的运算符都期望它的运算数表达式计算出的结果符合某种数据类型。例如:对字符串是不能进行乘法运算的,"a" * "b" 是不合法的,但是,在可能的情况下,javascript会把表达式转换成正确的类型,因此,表达式 "3" * "5" 是合法的,javascript将字符串转换成数字执行运算,结果返回的是数字15,而不是字符串"15"。二、+ 根据运算数的不同,具有不同的表现:字符串 + 字符串 = 字符串(被连接);"a" + "b" = "ab" "5" + "6" = "11"字符串 + 数字 = (字符串转换成数字)字符串(被连接);"a" + 5 = "a5" 5被转换成字符串 "1" + 0 = "10"数字 + 数字 = 数字(相加)5 + 5 = 10。三、注意运算符的结合性,有些运算符从左到右的结合性;有些从右到左结合性。例如:w = a + b + c 等同于 w = (a + b) + c;w = -b 等同于 w = - ( - ( -b ) ); w = a = b = c 等同于 w= ( a = ( b = c ))一元运算符、赋值运算符、三元运算符的结合性是从右到左的;四、算术运算符规则:“+”:可以进行“加法”与“连接”运算;如果2个运算符中的一个是字符串,javascript就将另一个转换成字符串,然后将2个运算数连接起来。“+”:如果一个运算数是对象,javascript就会将对象转换成数字做加法运算或者字符串做连接运算;“-”“*”“/” 如果2个运算数中的一个是是非数字,则将它转化成数字执行数学运算。“/” 在javascript中,由于所有的数都是浮点数,除法的结果都是浮点数,5 / 2 = 2.5 ;除数为0的结果为正负无穷;0/0为NaN;“%”模运算符:计算第一个运算数对第二个运算数的模,就是第一个运算数被第二个运算数除时,返回余数。如果运算数是非数字的,则转换成数字。“-”一元取反:将运算数取反,如果运算数不是数字,则转化成数字。“++”“”增量运算符/减量运算符号:运算数必须是一个变量、树组的一个元素或对象的一个属性。如果运算数不是数字,则转换成数字。注意:如果“++”位于运算数之前,先对运算数进行增量,然后计算运算数增长后的值。如果“”位于运算数之后,先计算运算数未增长之前的值,然后对运算数增量。例如:i = 1; //赋值给i值1j = ++i; //先将i增量为2,然后将2赋值给j,i的值是2,j的值也是2。i = 1; //赋值给i值1j = i++; //先将i赋值给j,然后对将i值增量到2,i的值是2,j的值是1。减量运算符“”与“++”相同。五、等同运算符与全同运算符:(一)“==”“!==”等同运算符与非等同运算符:比较2个运算数,返回一个不布尔值。比较数值、字符串、布尔值使用的都是量值。当且仅当两个变量存放的值相等的时候,他们才相等。比较对象、数组、函数的时候,使用的是引用,只有2个变量引用的是同一个对象时,他们才是相等的。两个不同的数组是完全不同的,即使他们具有完全相同的元素。对于存放对象、数组、函数的引用的变量来说,只有当他们引用的是同一个对象、数组、函数的时候,他们才相等。
注意!应遵循的原则:当两个运算数的类型不同时:将他们转换成相同的类型,1)一个数字与一个字符串,字符串转换成数字之后,进行比较。2)true转换为1、false转换为0,进行比较。3)一个对象、数组、函数 与 一个数字或字符串,对象、数组、函数转换为原始类型的值,然后进行比较。(先使用valueOf,如果不行就使用toString)4)其他类型的组合不星等。想两个运算数类型相同,或转换成相同类型后:1)2个字符串:同一位置上的字符相等,2个字符串就相同。2)2个数字:2个数字相同,就相同。如果一个是NaN,或两个都是NaN,则不相同。3)2个都是true,或者2个都是false,则想同。4)2个引用的是同一个对象、函数、数组,则他们相等,如果引用的不是同一个对象、函数、数组,则不相同,即使这2个对象、函数、数组可以转换成完全相等的原始值。5)2个null,或者2个都是未定义的,那么他们相等。“!=”非等同运算符:与等同运算符检测的结果相反。(二)“===”“!===”全同运算符与非全同运算符号:全同运算符遵循等同运算符的比较规则,但是它不对运算数进行类型转换,当两个运算数的类型不同时,返回false;只有当两个运算数的类型相同的时候,才遵循等同运算符的比较规则进行比较。“!==”非全同运算符与全同运算符比较的结果相反。如果两个运算数的类型或者值不同的时候,返回true。六、比较运算符:这些比较运算符用于比较不同类型的值,结果返回一个布尔值。“”“”“=”“=”注意规则:比较的运算数可以是任意类型的,但是只能在数字和运算数上执行。不是数字和字符串的运算数将被转换成数字或字符串。1)如果两个运算数都是数字,或者都可以转换成数字,则按照数字的大小进行比较;2)如果两个运算数都是字符串,或者都可以转换成字符串,则将按照字母顺序进行比较;3)如果字符串遇到数字,则将字符串转换成数字进行比较。4)如果运算数既不能转换成数字,也不能转换成字符串,则返回结果false。七、字符串运算符:并没有专用的字符串运算符,只是有些运算符在遇到字符串运算数的时候,表现不同。(一)“+”连接2个字符串;1)当2个运算数都是字符串的时候,连接起来;2)当其中有一个是数字的时候,将数字转换成字符串,连接起来;(二)“”这样的比较运算符通过比较确认两个字符串的顺序,比较采用字符的顺序,较小的位于教大的前面,大写字母位于小写字母之前。(三)“+”的作用方法取决于计算顺序,如:s = 1 + 2 +"var" 则:返回结果3var; 因为先计算1+2,然后将结果3转换成字符串与"var"连接;如:s = "var" + 1 + 2 则:返回结果var12; 因为先计算var与1的连接,在将结果var1与转换成字符串的2连接起来。八、逻辑运算符:用于执行布尔运算,常常和比较运算符一起使用,来表示复杂的比较运算。“” 逻辑与运算、“”逻辑或运算符、“!”逻辑非运算符(一)“”当两个运算数都是布尔值的时候,逻辑与对他们进行and操作,即:当且仅当两个布尔值都是true的时候,返回结果true,否则返回false。注意:实际表现“”将检测第一个表达式运算数布尔值,如果第一个运算数表达式返回false,则返回左边第一个运算数表达式的值:false;否则将继续检测第二个即右边的运算数表达式,然后返回第二个运算数表达式的值;例如:if (a = b) stop(); 与 (a = b) stop(); 等价不赞成使用这个方法,因为运算符右边的代码不能保证会被执行,例如:if ((a b) (b++ 10) ) stop();如果运算符右边的增量必须的话,却有可能由于前面的返回值而不被执行,一般反对在的右边使用具有其他作用的表达式(赋值、函数调用、增减量);将“”看作是一个布尔代数的运算符,会更简单与安全。(二)“”当两个运算数都是布尔值的时候,逻辑或对他们进行or操作,即:当两个布尔值有一个是true的时候,返回结果true,否则返回false。注意:实际表现“”将检测第一个表达式运算数布尔值,如果第一个运算数表达式返回true,则返回左边第一个运算数表达式的值:true;否则将继续检测第二个即右边的运算数表达式,然后返回第二个运算数表达式的值;同样不赞成使用这个方法,因为运算符右边的代码不能保证会被执行,一般反对在的右边使用具有其他作用的表达式(赋值、函数调用、增减量);将“”看作是一个布尔代数的运算符,会更简单与安全。(三)“!”逻辑非是一个一元运算符,放在运算数之前,它的目的是对运算数取反。九、赋值运算符:(一)“=”是赋值运算符;他总是期望左边的运算数是一个变量、数组的一个元素或对象的一个属性;期望右边是一个任意类型的任意的值;从右到左的结合性,如果一个表达式中有多个赋值运算符,则从最右边开始计算。注意:每一个赋值表达式都有一个值,就是运算符右边的值;(二)可以使用带操作的赋值运算“+=” 左边的值加上右边的值后,赋值于左边的值。“-=”“/=”“*=”方法一样;十、其他运算符:“?:”条件运算符是唯一的一个三元运算符;一个表达式的布尔结果?表达式1(任意类型的任意值):表达式2(任意类型的任意值);根据第一个运算数的布尔值结果,如果为true,则执行第二个运算数表达式,返回第二个运算数表达式的值;如果第一个运算数的布尔值结果是false,则执行第三个运算数表达式,返回第三个运算数表达式的值。
移位运算符面向的运算对象也是二进制的“位”。可单独用它们处理整数类型(主类型的一种)。左移位运算符()能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。“有符号”右移位运算符()则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(),它使用了“零扩展”:无论正负,都在高位插入0。这一运算符是C或C++没有的。
若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java 1.0和Java 1.1特别突出)。它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。可用下面这个例子检测自己的实现方案:
//: URShift.java
// Test of unsigned right shift
public class URShift {
public static void main(String[] args) {
int i = -1;
i = 10;
System.out.println(i);
long l = -1;
l = 10;
System.out.println(l);
short s = -1;
s = 10;
System.out.println(s);
byte b = -1;
b = 10;
System.out.println(b);
}
} ///:~
移位可与等号(=或=或=)组合使用。此时,运算符左边的值会移动由右边的值指定的位数,再将得到的结果赋回左边的值。
下面这个例子向大家阐示了如何应用涉及“按位”操作的所有运算符,以及它们的效果:
//: BitManipulation.java
// Using the bitwise operators
import java.util.*;
public class BitManipulation {
public static void main(String[] args) {
Random rand = new Random();
int i = rand.nextInt();
int j = rand.nextInt();
pBinInt("-1", -1);
pBinInt("+1", +1);
int maxpos = 2147483647;
pBinInt("maxpos", maxpos);
int maxneg = -2147483648;
pBinInt("maxneg", maxneg);
pBinInt("i", i);
pBinInt("~i", ~i);
pBinInt("-i", -i);
pBinInt("j", j);
pBinInt("i j", i j);
pBinInt("i | j", i | j);
pBinInt("i ^ j", i ^ j);
pBinInt("i 5", i 5);
pBinInt("i 5", i 5);
pBinInt("(~i) 5", (~i) 5);
pBinInt("i 5", i 5);
pBinInt("(~i) 5", (~i) 5);
long l = rand.nextLong();
long m = rand.nextLong();
pBinLong("-1L", -1L);
pBinLong("+1L", +1L);
long ll = 9223372036854775807L;
pBinLong("maxpos", ll);
long lln = -9223372036854775808L;
pBinLong("maxneg", lln);
pBinLong("l", l);
pBinLong("~l", ~l);
pBinLong("-l", -l);
pBinLong("m", m);
pBinLong("l m", l m);
pBinLong("l | m", l | m);
pBinLong("l ^ m", l ^ m);
pBinLong("l 5", l 5);
pBinLong("l 5", l 5);
pBinLong("(~l) 5", (~l) 5);
pBinLong("l 5", l 5);
pBinLong("(~l) 5", (~l) 5);
}
static void pBinInt(String s, int i) {
System.out.println(
s + ", int: " + i + ", binary: ");
System.out.print(" ");
for(int j = 31; j =0; j--)
if(((1 j) i) != 0)
System.out.print("1");
else
System.out.print("0");
System.out.println();
}
static void pBinLong(String s, long l) {
System.out.println(
s + ", long: " + l + ", binary: ");
System.out.print(" ");
for(int i = 63; i =0; i--)
if(((1L i) l) != 0)
System.out.print("1");
else
System.out.print("0");
System.out.println();
}
} ///:~
程序末尾调用了两个方法:pBinInt()和pBinLong()。它们分别操作一个int和long值,并用一种二进制格式输出,同时附有简要的说明文字。目前,可暂时忽略它们具体的实现方案。
大家要注意的是System.out.print()的使用,而不是System.out.println()。print()方法不会产生一个新行,以便在同一行里罗列多种信息。
除展示所有按位运算符针对int和long的效果之外,本例也展示了int和long的最小值、最大值、+1和-1值,使大家能体会它们的情况。注意高位代表正负号:0为正,1为负。下面列出int部分的输出:
-1, int: -1, binary:
11111111111111111111111111111111
+1, int: 1, binary:
00000000000000000000000000000001
maxpos, int: 2147483647, binary:
01111111111111111111111111111111
maxneg, int: -2147483648, binary:
10000000000000000000000000000000
i, int: 59081716, binary:
00000011100001011000001111110100
~i, int: -59081717, binary:
11111100011110100111110000001011
-i, int: -59081716, binary:
11111100011110100111110000001100
j, int: 198850956, binary:
00001011110110100011100110001100
i j, int: 58720644, binary:
00000011100000000000000110000100
i | j, int: 199212028, binary:
00001011110111111011101111111100
i ^ j, int: 140491384, binary:
00001000010111111011101001111000
i 5, int: 1890614912, binary:
01110000101100000111111010000000
i 5, int: 1846303, binary:
00000000000111000010110000011111
(~i) 5, int: -1846304, binary:
11111111111000111101001111100000
i 5, int: 1846303, binary:
00000000000111000010110000011111
(~i) 5, int: 132371424, binary:
00000111111000111101001111100000
数字的二进制形式表现为“有符号2的补值”。
答案选B 2numb。
JavaScript变量命名规则如下:
一、变量名区分大小写,允许包含字母、数字、美元符号($)和下划线,但【第一个字符不允许是数字】,不允许包含空格和其他标点符号
二、变量命名长度应该尽可能的短,并抓住要点,尽量在变量名中体现出值的类型
三、尽量避免使用没有意义的命名
四、禁止使用JavaScript关键词、保留字全名
五、变量名命名方法常见的有匈牙利命名法、驼峰命名法和帕斯卡命名法
可以在浏览器中直接测试:
1、Math.sin() 的参数,必须是一个以弧度表示的角,角度数×Math.PI/180即为当前角度数的弧度值。30度角的sin()的写法为:Math.sin(30*Math.PI/180)
2、180度转换成弧度理论上等于Math.PI,但由于cpu在运算的时候,会进行近似处理,所以并不相等。
3、常规代数里,是等于0,但是cpu运算的时候,只是近似与0
4、因为程序处理浮点数的时候,每一次运算都会取一次近似值,所以最终的结果,总是近似值,而不是我们通过代数得出的结果。
综上,浮点数的运算,往往并不是我们期望的结果,可以通过Math.round() 函数来解决。
例如,对比下面的两个结果,你会看明白的:
document.write(Math.sin(Math.PI) + "br /");
document.write(Math.round(Math.sin(Math.PI)*1000000)/1000000);