表达式和运算符
原始表达式
直接量(1.23 hello )、保留字(true false null this)、变量(undefined,i sum)
对象和数组的初始表达式
实际上是新创建的对象和数组,所说的 对象直接量、数组直接量
(1)数组表达式
[] //一个空数组
[1+2,3+4] //通过逗号分隔的表达式的值
(2) 对象表达式
var p :{ x:2.3,y:-1.2};
var q = {};
q.x = 2.3; q.y = -1.2;
(3) 函数定义表达式(函数直接量)
var square = function(x) {
return x*x
}
属性访问表达式
var book = {
topic:"javascript",
fat:"true"
}
通过 . 或者 [] 来访问对象属性
book.topic ==> javascript
如果命名的属性不存在,那么整个属性访问表达式的值就是undefiend
调用表达式
f(0) // f 是一个函数表达式,0 是一个参数表达式
Math.max(x,y,x) Math.max 是一个函数;x,y,z是参数
a.sort() //是一个函数,它没有参数
对象创建表达式
创建一个对象并调用一个函数===》构造函数 初始化新对象的属性。
new Object()
new Point(2,3)
当计算一个对象创建表达式的值时,首先创建一个新的空对象,然后通过传入指定的参数并将这个新对象当做this来调用一个指定函数。可以用this初始化这个新创建对象的属性。
运算符
算术表达式
+
‘1’+‘2’ // 12
1+{} // 1[object,object]
true + true // 2
2 + null // 2 null 转换0
2 + undefinend // NaN
1+1 +'hello' // 2hello
++
var i = 1 j = ++i // j i 都是 2
var j = 2 j = i++ // i 为2 j 为 1
位运算符
& | ^ !
关系表达式
(1)相等和不等运算符
=== 严格相等运算符 检查两个操作数是否严格相等
== 相等运算符 检查两个操作数是否相等
严格相等运算符
首先计算其操作数的值,然后比较两个值,比较过程没有任何类型转换。
不相等/不严格相等
!=
!==
(2)比较运算符
< > >= <=
(3) in 和 instanceof运算符
in 左操作数是一个字符串(可以转换字符串)右操作数是一个对象
var point = {x:1,y:2}
'x' in point //true
'z' in point // false
'toString()' in point //true 对象继承了toString()方法
instanceof
左操作数是一个对象 右操作数标识对象的类。
var d = new Date();
d instanceof Date; //true
d instanceof Object; //true
d instanceof Number //false
逻辑表达式
&& || !进行布尔算术运算
赋值表达式
i = 0 将变量i 设置为0
o.x = 1 将对象o属性x设置 为1
= 给变量或者属性赋值
左操作数是一个左值 (变量、对象属性)
右操作数可以是任意类型的任意值。
赋值操作符的结合性是从右至左
i = j = k = 0; //把三个变量初始化0
表达式计算
eval()
eval本是个函数,但常被当做运算符来对待
直接eval:在调用它的上下文作用域内执行
间接eval(起别名):使用全局对象作为其上下文作用域
其他运算符
(1)条件运算符(?:)
三元操作符
第一个操作数在?之前 第二个在?:中间 第三个在:之后
x > 0 ? x : -x 求x绝对值
(2) typeof 运算符
typeof null //object
(3) delete 删除对象属性或者数组元素
副作用:用来删除操作,不是用来返回一个值的
var a = [1,2,3]
delete a[2]
2 in a //false
a.length //3 给删除元素设置一个undefiend的值
删除数组元素,不改变数组长度(相当于是打了个洞)
不能删var声明的变量,不能删function定义的函数和函数参数
关于对象:只能删除自有属性,不能删除继承属性
(4)void运算符 一元运算符
不经常使用,操作数可以是任意类型,但忽略计算结果并返回undefiend
常用在客户端url
<a href = "javascript:void window.open()";>打开新窗口</a>
(5) 逗号运算符 二元运算符
,
i = 0, j = 1, k = 2;