本文最初发布于http://szhshp.org/tech/2017/02/18/JavaSprite.html
转载请注明
原始表达式分为三种:
1.23 //数字直接量
"hello" //字符串直接量
/pattern/ //正则表达式直接量
true //返回一个布尔值:真
false //返回一个布尔值:假
null //返回一个值:空
this //返回“当前”对象
i //返回变量i的值
sum //返回sum的值
undefined //undefined是全局变量,和null不同,它不是一个关键字
对象和数组初始化表达式实际上是一个创建新的对象和数组。
因为数组本身就是一个对象
[] //一个空数组:[]内留空即表示该数组没有任何元素
[1+2,3+4] //拥有两个元素的数组,第一个是3,第二个是7
var matrix =[[1,2,3],[4,5,6],[7,8,9]];//数组的初始化可以嵌套
var a = new Array(1,2,3)
a = [1,2,3]
var a = new Array(1,,2,3)//报错
a = [1,,2,3]//index=1的元素是undefined
var a = new Array(10)//创建一个长度为10的数组并且值全部为undefined
a = [10]//创建了一个长度为1的数组并且值为10
一个典型的函数定义表达式包含关键字function,跟随其后的是一对圆括号,括号内是一个以逗号分隔的列表,列表含有0个或多个标识符(参数名),然后再跟随一个由花括号包裹的JS代码段(函数体),如:
var o = {x:1,y:{z:3}}; //一个示例对象
var a = [o,4,[5,6]]; //一个包含这个对象的示例数组
o.x //=>1:表达式o的x属性
o.y.z //=>3:表达式o.y的z属性
o["x"] //=>1:对象o的x属性
a[1] //=>4:表达式a中索引为1的元素
a[2]["1"] //=>6:表达式a[2]中索引为1的元素
a[1+1][0+1] //=>6:表达式a[2]中索引为1的元素,大括号里的数据运算后并且转换为了字符串
a[0].x //1:表达式a[0]的x属性
相关运算逻辑:
null
或者undefined
,表达式会抛出一个类型错误异常,因为这两个值都不能包含任意属性。undefined
。如果属性名称是一个保留字或者包含空格和标志点符号,或是一个数字(对于数组来说),则必须使用方括号的写法。
当属性名是通过运算得出的而不是固定值的时候,这时必须使用方括号写法。
调用表达式以一个函数表达式开始,这个函数表达式指代了要调用的函数。函数表达式后跟随一对圆括号,括号内是一个以逗号隔开的参数列表,如:
f(0) //f是一个函数表达式;0是一个参数表达式
Math.max(x,y,z) //Math.max是一个函数;x,y和z是参数
a.sort() //a.sort是一个函数,它没有参数
return
语句给出一个返回值,那么这个返回值就是整个调用表达式的值。否则,调用表达式的值就是undefined
。方法调用
。在方法调用中,执行函数体的时候,作为属性访问主体的对象和数组便是其调用方法内this的指向。这部分this的描述很模糊,不过后面会有详细的介绍
对象创建表达式(object creation expression)创建一个对象并调用构造函数来初始化对象的属性。对象创建表达式和函数调用表达式非常类似,只是对象创建表达式之前多了一个关键字new:
new Object()
new Point(2,3)
如果对象创建表达式不需要传入任何参数给构造函数的话,那么这对圆括号是可以省略掉的
new Object
new Point
+
运算符toString()
方法执行转换,其他对象如果valueOf()
方法返回一个原始值的话,则通过valueOf()
方法执行转换。valueOf()
方法,因此他们会通过toString()
方法来执行抓换总结归纳:
- 如果是日期那么就使用
toString()
- 如果不是日期那么看看
valueOf()
能否返回一个原始值
- 如果可以,那么就使用这个原始值
- 如果不行或者当前对象的
valueOf()
不可用,那么就使用toString()
- 以上运算之后
- 如果一个操作数是字符串,另一个操作数也会转为字符串
- 如果没有字符串参与运算,那么就将操作数转换为数字然后进行加法操作.这儿不合法的数字都会转成
NaN
1 + 2 //=>3 加法
"1" + "2" //=>"12" 字符串连接
"1" + 2 //=>"12"数字转换为字符串后进行字符串连接
1 + {} //=>"1[object object]":对象转换为字符串后进行字符串连接
true + true //=>2 布尔值转换为数字后做加法
2 + null //=>2 null转换为0后做加法
2 + undefined //=>NaN undefined转换为NaN做加法
因此,加法符号类型混用时需要注意其优先级:
1 + 2 + "bmice" //=> "3 bmice"
1 + (2 + "bmice") => "12bmice"
先来看段代码
var a=1;
a++;//输出2
var a="1";
a++;//输出2,首先将1转换为数字然后自增
var a="abc";
a++;//输出Nan,因为abc无法转换为数字
"a"+1; //输出a1
"a"++; //Uncaught ReferenceError: Invalid left-hand side expression in postfix operation,因为左操作数无法转换为数字
==
运算符用于检测两个操作数是否相等,这里的比较很宽松因为允许了类型转换,检测室会通过如下逻辑:
null
另一个是undefined
,则相等true
则转换成1,false
转换成0===
的检测就比较严格,会通过如下逻辑:
null/undefined
,则不相等true
或者都是布尔值false
,则相等NaN
或者都是NaN
,则不相等(NaN
与任何值都不相等)包含各种>
,<
,>=
,<=
等比较运算符的运算逻辑:
NaN
那么一定返回false
typeof也是一个运算符!
delete: 没想到吧, 我也是运算符~
undefined
的值,实际这个属性将不再存在。undefined
var o={x:1,y:2};
delete o.x;//true
typeof o.x;//undefined
delete o.x;//true
delete o;//false, var定义的变量无法删除
delete 1;//...闹哪样?
this.x=1;//重新赋值,注意没有var
delete x;//非严格模式下返回true
//严格模式下会抛出异常,应该用delete this.x代替
x;//运行错误
原文:http://www.cnblogs.com/szhshp/p/6415674.html