javascript基础知识梳理-表达式和操作符
2014-04-11 17:14
573 查看
<!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>
相关文章推荐
- JavaScript正则表达式基础知识汇总
- JavaScript基础之JavaScript表达式和操作符
- JavaScript正则表达式基础知识汇总
- javascript之正则表达式基础知识小结
- JavaScript基础知识梳理
- javascript基础知识梳理-数组
- 栋栋晓09:Javascript学习总结:基础知识1(语法、关键字和保留字、变量、数据类型、操作符)
- javascript基础知识梳理-显示类型转换
- javascript基础知识梳理-对象转换为初始值
- 【JavaScript基础知识】——数据类型与typeof操作符
- javascript之正则表达式基础知识小结
- javascript基础知识梳理-window全局对象
- javascript 正则表达式基础知识汇总
- Javascript 基础知识 - 操作符 - in
- Android知识体系梳理笔记五:Kotlin学习笔记二:空安全,操作符,Lambad表达式...
- JavaScript基础知识--逻辑表达式的另一个层面
- Javascript 基础知识 - 操作符 - typeof & instanceof
- javascript基础知识梳理-Number与String之间的互相转换【转】
- javascript基础知识梳理-Number与String之间的互相转换
- javascript基础知识梳理-对象