近来通过同事的介绍再看一本名为《javaScript语言精髓与编程实践》的书籍里面谈了许多关于Js的细节问题,比如我接下来要讲的运算符的二义性,那么问题来了,什么是二义性,字面理解当然是有两个含义的意思,那么什么是运算符的二义性呢?运算符的二义性是指这个运算符代表的运算方式不是唯一的,比如下面这个例子
1.var str = ‘hello‘+‘world‘;//这个‘+‘的运算符代表的是字符串的连接
2.var n=10;
var n2=+n;//这里‘+‘运算符表示取正值
3.var n=3+4;//这里‘+‘表示求和运算
为什么一个运算符会出现多种含义呢,原因很简单那是因为Js中的运算处理是依赖于数据类型的,那我们接下来看一个例子
<img src="" style="boder:1px solid yellow" >
这里如果你想改变这个图片的边框的宽度你可能会首先想到下面的代码
var e1=document.getElementsByTag(‘img‘);
e1.style.borderWidth+=10;
那么问题又来了e1.style.borderWidth在Js中会反回一个有单位的数值“1px”,而这个数值和10进行‘+‘的运算Js会返回给你一个拼接的字符串‘1px10‘,Js中是不会识别这种类型的所以它的值还会是‘1px‘
让我们再来看一下我们写代码的时候经常会遇到的运算符“,”
直接上例子
示例一:a=(1,2,3);
示例二:a=1,2,3;
这两种写法你能猜出结果吗,示例一会返回数值3 示例二则返回的是1,这是因为‘,‘既可以是语法分隔符又可以是运算符导致的 示例一中由于是三个单zhi表达式连续运算,其结果值是最后一个表达式即3,而示例二中由于没有括号来强制运算的优先级,因此会按默认的优先级进行运算,所以二中返回的是1那么我们再来看下面
var a=1,2,3;
这行代码和上面的示例二很像,但这行代码运行的结果会产生错误,因为在这个例子中‘,‘被解释成var声明变量时的分隔符而不是连续运算符,语句var要求用‘,‘来分割多个标识符,而2,3显然不是合法的标识符,由此得到的教训是var 声明会使连续连续运算表达式变为连续声明语句,
我们再来简单的介绍一下{}的二义性
{}有四种作用:
示例一:表示复合语句
Mylabel:{//标识标签后的复合语句
//....}
我们知道在复合语句末尾的大括号之前,语句‘;‘可以省略因此我们可以这样写我们的代码
{1,2,3}
示例二:声明对象直接量
var obj={
vi:1,
v2:2,
v3:3
}
由于整体上是一条赋值语句,所以其中的直接量声明部分其实是一个表达式:
{
v1:1,
v2:2,
v3:3
}
注意这里 他们整体才是一个表达式所以按照前面的解释我们有两种方法将这个表达式变成一条语句
第一种是‘;‘表示法
{
v1:1,
v2:2,
v3};
第二种是复合语句表示法
{
{
v1:1,
v2:2,
v3;3
}
}
还有很多类似于‘+‘,‘,‘,‘()‘这种具有二义性的运算符
我们在这里就不一一详细例举只做概要的介绍
: 声明标签 声明switch分支
[] 数组下标 数组直接量声明
{} 函数直接量声明 对象直接量声明 复合语句
; 空语句 语句分隔符