javascript基础知识梳理-表达式和操作符 .

来源:互联网 发布:淘宝女童模特小苹果 编辑:程序博客网 时间:2024/04/30 04:59

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Expression Operator</title>
<script type="text/javascript">
 //数组初始化表达式,可以嵌套,其实就是java中的多维数组,如果两个逗号之间没有定义元素,则初始化为undefined
 //最后一个逗号后面不会创建元素
 var arr = [ [ 1, 2, 3, , ], [ 4, 5, 6 ], [ 7, 8, 9 ] ];
 console.log(arr[0].length)
 //对象初始化表达式
 var obj = {
  x : arr[0][0]++,
  y : arr[0][0]++,
  "1" : "xxx"
 };
 console.log(obj.x + "," + obj.y);
 //函数定义表达式
 var func = function(x) {
  return x * x;
 }
 //调用函数
 console.log(func(5));
 //属性访问表达式,可以通过obj.identifier访问或者通过obj[]访问,用方括号访问的时候,括号中必须是字符串或者字符串变量
 //如果属性是关键字或者非法的变量的话,只能使用方括号进行访问,而且如果属性名称是通过运算得出的值的时候,也只能使用方括号
 console.log(obj["1"]);
 //对象创建表达式,如果不需要传入参数的话,括号是可以省略的,构造函数是不需要返回值的,如果返回了,那this对象就废弃了
 var obj = new Object();
 var obj = new Object;
 function test() {
  this.age = 20;
  return {};
 }
 var obj = new test();
 console.log(obj.age);//这里会输出undefined
 //下面看看javascript的运算符吧,这个是通用的,各种语言几乎差不多,这次通过javascript将运算符的优先级结核性等等全面的学习一遍
 //首先看下除法运算符/,跟java的除法运算符不同,java中如果两个操作数都是整数,那么除法运算结果也是整数,而javascript中都是作为浮点数计算的
 //一个正数除以0将会得到正无穷,负数除以0会得到负无穷,而0/0将会得到NaN,除法运算也就这几种特殊情况了
 var num = 5 / 2;
 console.log("5 / 2 = " + num);//这里会输出2.5,而不是2
 num = 0 / 0;
 console.log("0 / 0 = " + num);
 //下面看下除法运算的一些特殊情况
 num = null / undefined;
 console.log("null / undefined = " + num);//结果是NaN
 num = true / true;
 console.log("true / true = " + num);//结果是1,true会转换成1去计算
 num = [ 10 ] / [ 20 ];
 console.log("[ 10 ] / [ 20 ] = " + num);//数组[10]转换成字符串"10",又转换成数字10,数组[20]同理
 num = [ 1, 2 ] / [ 3 ];
 console.log("[ 1, 2 ] / [ 3 ] = " + num);//数组[1,2]转换成字符串"1,2","1,2"又转换成数字NaN,所以结果是NaN
 //下一个是求余数的运算符%,js支持对浮点数求余,比如6.5%2.1=3...0.2,并且余数的符号和第一个操作数的符号保持一致(这句话有问题啊,只要有负数,余数必负的节奏啊)
 num = -5 % -2;
 console.log("-5 % -2 = " + num);
 num = -5 % 2;
 console.log("-5 % 2 = " + num);
 number = 5 % -2;
 console.log("5 % -2 = " + num);
 //除法(/),减法(-),乘法(*),求模(%)这几种算术运算符都会将操作数转换成数字进行计算,下面看下特殊的加法(+)运算符
 //加法(+)运算符可以将数字相加,也可以将字符串相加,如果两个操作数都是数字或者都是字符串,那么计算过程很清晰,如果操作数中包含对象,情况就比较复杂了。
 //如果两个操作数中有一个对象转换成了字符串原始值,那么另外一个操作数也会转换成字符串相加,对象转换原始值得方法:除了Date对象是先调用toString()再调用valueOf()外,其他对象都是先调用valueOf()再调用toString()
 //基本类型null,undefined,boolean,string,number,对象类型object,function,Date,Array,Regex
 //null,undefined,true,false这几个基本类型值会优先转换成数值进行计算,null->0,undefined->NaN,true->1,false->0
 num = [ 1 ] + 1;
 console.log("[ 1 ] + 1 = " + num);//结果是字符串"11"
 num = null + "0";
 console.log("'0' + null = " + num);//结果是"null0",因为null遇到的是字符串
 //下面看看简单的一元运算符,包括一元加法(+),一元减法(-),递增(++),递减(--),这几个运算符都会将操作数转换成数字,不行就转换成NaN
 num = +[];
 console.log("+[] = " + num);//结果为0,空数组[]首先会转换成空字符串,空字符串会转换成数字0
 num = -"-15";
 console.log("-'-15' = " + num)//字符串"-15"转换成数字-15,再取反
 //需要注意下x++和x=x+1并不完全一样,x++总会将x作为数字自增一,x=x+1还会出现x为字符串的情况。
 //下面看下javascript中的位运算符,位运算符包括按位与(&),按位或(|),按位异或(^),按位非(~),左移(<<),带符号右移(>>),无符号右移(>>>),位运算符没啥说的,操作数必须转换成32位数字
 //按位与就是对应位都是1,该位才是1,否则是0.按位或就是对应位只要有1,结果是1.按位异或就是当且仅当其中有一个是1结果为1,否则为0.
 //下面看下javascript中的关系表达式和关系运算符。以上所述都是讲的算术表达式和算术运算符。关系表达式总是返回bool值。
 //先看下两个相等运算符==和===,==一般叫做相等运算符,===一般叫做恒等运算符,==运算符在比较时允许类型转换,===不允许任何类型转换.
 //!=与==的结果正好相反,===与!==的结果正好相反。
 var result = (null === null);//除了NaN,任何操作数x总是和自身恒等,所以可以使用(x!==x)判断x是否是NaN
 console.log("(null === null) = " + result);
 //恒等运算符首先会比较两个操作数的类型,如果类型不同则肯定不恒等。
 //对于基础类型来说,null,undefined,string,boolean,number,类型相同值也相等则恒等,对于对象类型,则必须指向同一个对象,类型地址必须相同。
 result = ([] === []);
 console.log("([] === []) = " + result);
 //相等运算符比较时如果两个操作数的类型相同,则比较规则同恒等运算符相同,其实恒等运算符就是相等运算符的一种特殊情况,即类型必须相同。
 //如果操作数的类型不相同,则会做一些类型的转换操作。
 //如果一个操作数是null,一个操作数是undefined,则认为他们是相等的。
 //如果是字符串布尔值会转换成数字进行比较.相对于二元加号运算符更偏向于转换字符串来说,相等比较运算符更倾向于转换成数字.后面的大于小于等等都倾向于转换成数字.
 //除了相等和恒等,比较运算符还有小于(<),大于(>),小于等于(<=),大于等于(>=),这四个比较操作符的操作数也可以是任意类型,最后都会转换成数值或者字符串去比较,数值会比较大小,字符串会比较字母表的顺序。
 //当操作数中存在NaN时,所有比较均返回false,比较中null,undefined,true,false都会转换成数值
 result = "2" > null;//这里null会转换成数字0进行比较
 console.log('"2" > null = ' + result);
 result = "1" > undefined;//这里undefined会转换成NaN,所以怎么比都是false
 console.log('"1" > undefined = ' + result);
 result = "1" < undefined;
 console.log('"1" < undefined = ' + result);
 //下面看看两个字母比较运算符in和instanceof
 //in运算符希望它的左操作数是一个字符串或者可以转化成字符串的值,希望右操作数是一个对象,判断左操作数字符串是否是右边对象的属性,如果是则返回true
 var obj = {
  x : 1,
  y : 2,
  "1" : 3
 };
 result = 1 in obj;//1会转换成字符串,如果右边的obj不是对象会报错的
 console.log('1 in obj = ' + result);
 //最后看看判断一个对象是否是类的实例操作符instanceof,这个涉及到原型链的知识,比较重要,关于原型链后面会有详细的介绍,这里不赘述。
 //instanceof运算符希望左边是一个对象,右边是一个函数,如果左边不是对象,直接返回false,如果右边不是函数,会报错。
 result = "1" instanceof String;//这里会返回false,因为"1"只是一个基础类型的字符串值
 console.log('"1" instanceof String = ' + result);
 result = new String("1") instanceof String;//这里就是true了
 console.log('new String("1") instanceof String = ' + result);
 result = "1" instanceof Function;
 console.log('"1" instanceof "1" = ' + result);
 //下面看看比较难理解的逻辑表达式
 //&&并且操作符,这个操作符需要两个操作数,如果左边操作数转换成boolean值是false,那么不需要计算右边的操作数,直接返回左操作数;如果左操作数转换之后是true,那么计算右操作数并返回。
 //&&操作符不会直接返回true或false,而是返回操作数
 result = null && {};
 console.log("null && {} = " + result);//这里result其实变成了null,因为null计算出来是false,所以不会计算右边的,直接返回左边的null
 result = 1 && {};
 console.log("1 && {} = " + result);//结果是[object Object],其实现在result就是{},所以toString()返回[object Object]
 //从&&运算符不难看出||运算符的运行原理,如果左边操作数转换成boolean值是true,那么直接返回左操作数,如果左操作数是false,那么直接返回右操作数
 result = null || {};
 console.log("null || {} = " + result);//结果是[object Object],其实现在result就是{}
 result = {} || [];//cocos2d-html引擎就是这样定义cc的
 console.log("{} || [] = " + result);
 //但是逻辑非运算符!与逻辑与(&&)和逻辑或(||)都不同,逻辑非总是返回true或者false,可以使用!!(x),来得到等价的true或false,其中x可以包含逻辑与和逻辑或
 //最后是赋值运算符,就搞一些特殊的吧。
 var data = [ 1, 2, 3 ];
 var index = 0;
 //data[index++] *= 2;//等价于data[0] *= 2;
 data[index++] = data[index++] * 2;// 等价于data[0] = data[1] * 2;
 console.log(data.toString());
 //表达式计算,eval函数的使用,eval()函数在执行代码的时候拥有当前的作用域
</script>
</head>
<body>

</body>
</html>

0 0
原创粉丝点击