1.表达式
表达式:表达式是一种JS短语,可使JS解释器用来产生一个值。
1.原始表达式
1,常量,直接量 3,14 "test"
2,关键字 null this true
3,变量 i,j,k
2.复合表达式(通过原始表达式和运算符)
10*20
3.数组,对象的初始化表达式
[1,2,3]
[1, ,,4]
{x:1,y:2}
3.函数表达式
var a=function(){};
(function(){console.log("hello world")})();//立即调用
4.属性访问表达式
var o={x:1};
o.x
o["x"]
5.调用表达式
fun();
6.对象创建表达式
new Func(1,2);
new Object;
2.运算符
运算符:
一元:++ –
二元:+ - * /=
三元:c?a : b
普通运算符:赋值、比较、位、逻辑、字符串拼接、算术
特殊运算符:条件运算符、逗号运算符、delete、in、instanceof、new、this、typeof、void
,运算符:
var val = (1,2,3); // val=3
,操作符就是从左到右依次计算表达式,最后返回最右边的操作数。所以这里(1, 2, 3)返回3.
delete运算符:
var obj = {x:1};
obj.x //1
delete obj.x;
obj.x; //undefined
in运算符:
window.x = 1;
'x' in window; /true
instanceof、typeof运算符:
{} instance Object //true
typeof 100 === "number" //true
注意:
{} instanceof Object //语法错误
//下面这样写才行
var x={};
x instanceof Object; //true
因为解析的原因。如果直接以{}开头会直接被误认为是一个块语句而不是一个空对象。那么instanceof的左操作数就不对了。所以才有语法错误。类似的如果直接用function(){}也是不行的因为会被解析成函数声明。不过就算不先定义给他们加个括号也可以解决了。因为括号里先计算了语法上就解释通了。
function(){} instanceof Object //语法错误
(function(){}) instanceof Object //true
a=function(){}
a instanceof Object //true
new运算符:
function Foo(){}
Foo.prototype.x = 1;
var obj = new Foo();
obj.x; //1
//是对象上还是对象原型链上的
obj.hasOwnProperty('x'); //false
obj._proto_.hasOwnProperty('x'); //true
new运算符原型链中问题进一步可以查看:https://www.imooc.com/qadetail/66320
this运算符:
this; //window(浏览器)
var obj = {
func:function(){return this};
}
obj.func(); //obj
this应该算是表达式,this是JS解释器生成的一个值。
void运算符:
//void 是一个运算符,无论后面的是什么都返回undefined
void 0 //undefined
void (0) //undefined
运算符优先级:
+!{}[true] //1
在此页 按F12,在console输入“+!{}”、“+”、“+!”结果都是0;“+!{}[true]”、“+!{}[1]”、“+[1]”、“+!{}[false]”结果都是1."!{}"是false,“!{}[true]”是true,“+!{}[true]”相当于“+true”结果是1.
我认为这个表达式的求值过程分解如下:(1){}[true];//undefined (2)!{}[true];//true (3)+!{}[true];//1。
!{}得到的是false,+是用来转换为数字的,false为0,[]数组内只要不为空都为true,所以结果为1。
后面会写一篇关于这方面介绍文章。