这里主要讲解条件运算符(?:)、typeof运算符、delete运算符、void运算符和逗号运算符。
条件运算符(?:)
JavaScript中条件(三目)运算符(?:)是根据条件执行两个语句中的其中一个。使用方法:
test ? 语句1 : 语句2
其中test是任何 Boolean 表达式。
语句1是当 test 是 true 时执行的语句。可以是复合语句。
语句2是当 test 是 false 时执行的语句。可以是复合语句。
举例说明一下:
var answer=(3>4)?"hehe":"haha" //=> "haha"
typeof运算符
typeof是一个一元运算符(就像++,--,!,- 等一元运算符),不是一个函数,也不是一个语句。
typeof 是一个一元运算符,放在一个运算数之前,运算数可以是任意类型。
它返回值是一个字符串,该字符串说明运算数的类型。
typeof 运算符把类型信息当作字符串返回。typeof 返回值有六种可能: "number," "string," "boolean," "object," "function," 和 "undefined."
使用方法有两种:
1、 typeof "string"
2、 typeof("string")
举例说明: typeof(23) //=> "number"
delete运算符
Delete是Javascript语言中使用频率较低的操作之一,但是有些时候,当我们需要做delete或者清空动作时,就需要delete操作。在这篇文章中,我们将深入探讨如何使用它,以及它是如何工作的。
delete是一元操作符 它用来删除对象属性或者数组元素。就像赋值、递增、递减运算符一样,delete也是具有副作用的 他是用来做删除操作的,不是用来返回一个值的。
删除的目的,如你所想,就是要删除某些东西,更具体的说,它会删除对象的属性,如下例:
var winter = { |
2 | "name" : "winter" , |
3 | "url" : "http://www.baidu.com" |
4 | }; |
5 |
6 | delete Benjamin.name; |
7 |
8 | //Outputs: Object { url: "http://www.baidu.com" } |
9 | console.log(winter); |
var winter= "http://www.baidu.com" ; |
2 | delete winter; |
4 | //Outputs: "http://www.baidu.com" |
5 | console.log(winter); |
删除并没有破坏属性的值,仅仅属性本身,看下面的例子:
1 | var name = "winter" , |
2 | winter= {}; |
3 |
4 | winter.name = name; |
5 |
6 | delete winter.name; |
7 |
8 | //Outputs: "winter" |
9 | console.log(name); |
注意:delete如果操作数组的话,并不会改变数组的长度。
举例说明:
var a=[1,2,3];
delete a[2]; // 使用delete操作符
2 in a; //=> false :元素2在数组中已经不存在了
a.length; //=> 3 delete并没有改变数组的长度
void运算符
void 运算符是避免表达式返回值,一元运算符,它出现在操作数之前,操作数可以是任意类型。
使用方法:
void expression
其中expression 参数是任意有效的 JScript 表达式。
void运算符说明
void 运算符对表达式求值,并返回 undefined。在希望求表达式的值,但又不希望脚本的剩余部分看见这个结果时,该运算符最有用。
void运算符的两种用途:
- 书签小程序
- 在链接中执行JavaScript代码
用途1: 书签小程序
是一个能够执行JavaScript代码的URI(译者注:使用JavaScript伪协议).如果一个bookmarklet返回的结果不是 undefined ,那么当前页面显示的内容会被这个返回值替代.这时候就得用到 void运算符 .[Webkit内核的浏览器不会有这样的麻烦]:
- javascript:3+4 会把当前页面的内容替换成7.
- javascript:void(3+4) 不会改变当前页面的内容.void会“隐藏”掉表达式3+4的结果.
类似的:
- javascript:window.open("http://www.whitehouse.gov/") 会替换掉当前页面的内容.
- javascript:void window.open("http://www.whitehouse.gov/") 不会改变当前页面的内容.
javascript:void window.open("http://submit.example.com/submit?"+encodeURIComponent(document.location.href))
这个bookmarklet不会改变当前页面的内容,会在新标签或新窗口中打开页面.
译者注:网上有很多流行的Bookmarklet,通常是导入了另外一个js文件,比如繁体字转换成简体字,比如购物网站比价.
javascript: void(document.body.appendChild(document.createElement("script")).src = "http://tongwen.openfoundry.org/NewTongWen/tools/bookmarklet_cn2.js")
用途2: 在链接中执行JavaScript代码
虽然这种做法是不推荐的,但的确是可行的,例如下面的代码:
<a href="javascript:void computeResult()">Compute</a>
如果函数computeResult()返回undefined(或者没有return语句,也默认返回undefined),则不会有什么事.但如果这个函数返回了其他的值,那么你必须在函数前面添加void运算符来防止它改变当前页面的内容.[Webkit内核的浏览器不会有这样的麻烦].
更常见的用法是:javascript:void(0),用来阻止链接默认的跳转行为.
逗号运算符
逗号运算符,它将先计算左边的参数,再计算右边的参数值。然后返回最右边参数的值。
原书举的例子不太好,无法解释上面那句话,这里另外提供一个:
<script>
var a = 10, b = 20;
function CommaTest(){
return a++, b++, 10;
}
var c = CommaTest();
alert(a); // 返回11
alert(b); // 返回21
alert(c); // 返回10
</script>
变量c的值是函数CommaTest返回的值,而a和b多加1了。
逗号运算符和函数调用运算符的冲突
在JavaScript中,函数调用确实是函数调用运算符。它很特殊,因为其它编程语言资料中多从来没有这个叫法的。然后,(才是)它没有固定数目的运算数。
函数调用运算符的第一个参数是一个函数名或者是一个引用函数的表达式,其后是括号()。括号中间可以是数目不定的运算符,这些运算数可以是任意的表达式,它们之间用逗号隔开。
函数调用运算符将计算它的每一个运算数,第一个运算数指定为函数名(括号前),而括号中间的所有运算数的值将传递给这个函数作为函数的参数。
例如:
document.close()
Math.sin(x)
alert("Welcome " + name)
Date.UTC(2000, 11, 31, 23, 59, 59)
funcs.f(funcs.args[0], funcs.args[1])
知道了调用函数运算符后,我们举个例子说明关于如何处理它们冲突的事。
<script>
alert(2*5, 2*4); // 输出10
</script>
上面这段代码输出10,但是如果根据逗号运算符的原理来解释的话,那应该是输出8才对。为什么呢?
因为逗号运算符在JavaScript在的优先级是最底的,记住这一点非常有用。所以函数调用运算符将先于逗号运算符运行。结果alert函数输出第一个参数的值。将上面的代码修改成如下所示即可。
<script>
alert((2*5, 2*4)); // 返回8
</script>
逗号运算符和赋值运算赋的冲突
在JavaScript中,逗号运算符的优先级比赋值运算符还要底。请看下面的代码。
<script>
var a = 20;
var b = ++a,10;
alert(b);
</script>
这段代码似乎不能运行,可能是由于赋值运算符优先于逗号表达式运行,如果将代码改成
<script>
var a = 20;
var b = (++a,10);
alert(b);
</script>
即可了。