javascript之运算符的二义性

近来通过同事的介绍再看一本名为《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分支

[]        数组下标  数组直接量声明

{}        函数直接量声明   对象直接量声明   复合语句

;         空语句    语句分隔符

时间: 2024-10-12 16:06:59

javascript之运算符的二义性的相关文章

(4)javascript的运算符以及运算符的优先级

                                运算符的使用方法 在javascript的程序中要完成各种各样的运算,是离不开运算符的. 在javascript中,按运算符类型可以分为算术运算符.赋值运算符.比较运算符.逻辑运算符.条件运算符等. ( 图片来自于W3School离线手册) 算术运算符案例: <!doctype html> <head> <meta http-equiv="content-type" content="

javascript算术运算符详解

算术运算符 +.-.*./.%.++.-- ++.--分为前缀形式和后缀形式 前缀形式先加减1在执行 后缀形式先执行再加减1 注意 +号用来连接两个字符串 只要+连接的操作数中有一个是字符串型,JS就会自动把非字符串型数据作为字符串型数据来处理 JS代码的执行顺序是从左到右,所以在+连接的表达式中,遇到字符串型数据之前,所有出现的数值型数据(或者可以自动转换为数值型的数据)仍被作为数值来处理.为了避免这种情况,我们可以在表达式前拼一个空字符串 实例 <!DOCTYPE html> <ht

js语法中运算符的二义性之逗号&ldquo;,&rdquo;的二义性

看到<js语言精髓与编程实践>中讲解的js语法中运算符的二义性之逗号的二义性,做些笔记 我们先来看看这两个例子: alert(eval('a=(1,2,3);'));//示例1 alert(eval('a=1,2,3;'));//示例2 结果是两者都会弹出3,这种用法产生的混乱,是因为逗号","既可以是语法分隔符,又可以是运算符所导致的.在上面的示例1,示例2中,逗号都被作为"连续运算符"在使用.示例1中的括号强制运算符,因此它的效果是运算如下表达式:

JavaScript的运算符

JavaScript的运算符 算术运算 加法运算符(Addition):x + y 减法运算符(Subtraction): x y 乘法运算符(Multiplication): x * y 除法运算符(Division):x / y 余数运算符(Remainder):x % y 自增运算符(Increment):++x 或者 x++ 自减运算符(Decrement):--x 或者 x-- 求负运算符(Negate):-x 赋值运算 比较运算 字符编码:计算机里所有的数字,字母和其他符号都有编号.

JavaScript instanceof 运算符深入剖析

instanceof 运算符简介 在 JavaScript 中,判断一个变量的类型尝尝会用 typeof 运算符,在使用 typeof 运算符时采用引用类型存储值会出现一个问题,无论引用的是什么类型的对象,它都返回 "object".ECMAScript 引入了另一个 Java 运算符 instanceof 来解决这个问题.instanceof 运算符与 typeof 运算符相似,用于识别正在处理的对象的类型.与 typeof 方法不同的是,instanceof 方法要求开发者明确地确

JavaScript的运算符(操作符)和优先级

最近因为在读 Underscore.js 的源代码,加上重拾之前没有完成 ife 中的 JavaScript 部分的 task2,其中大量简略的语句写法,尤其喜欢 ?: 这个三目运算符和其他运算符连用.因为对于运算符优先级的概念一直很模糊,然后经常被绕进圈子里面.下面整理下常用的运算符和它们的优先级差异. 一.运算符 1. 一元运算符 (1)  递增递减运算符 主要就是 a++ 和 ++a 的区别,执行前置递增和递减运算时,变量的值都是在语句被求值之前改变的. var num1 = 10; va

JavaScript (+) 加法运算符

JavaScript加法运算符用加号(+)表示. 代码实例如下: var a = 1; var b = 2; console.log(a+b); 在处理特殊值时,加法也有一些特殊行为: (1).某个运算数是NaN,那么结果为NaN. (2).-Infinity加-Infinity,结果为-Infinity. (3).Infinity加-Infinity,结果为NaN. (4).+0加+0,结果为+0. (5).-0加+0,结果为+0. (6).-0加-0,结果为-0. +0和-0虽然它们在值上是

JavaScript (++) 递增运算符

递增运算符为其操作数增加1,返回一个数值. 递增运算符分为两种使用方式: (1).后置使用,运算符位于操作数的后面(如 x++),那么将会在递增前返回数值. (2).前置使用,运算符位于操作数的前面(如 ++x),那么将会在递增后返回数值. 代码实例: var x = 1; console.log(x++); console.log(x); 后置使用是先返回值,然后再进行递增计算. var x = 1; console.log(++x); console.log(x); 原文可以参阅JavaSc

Javascript实现运算符重载

最近要做数据处理,自定义了一些数据结构,比如Mat,Vector,Point之类的,对于加减乘除之类的四则运算还要重复定义,代码显得不是很直观,javascript没有运算符重载这个像C++.C#之类的功能的确令人不爽,于是想"曲线救国",自动将翻译代码实现运算符重载,实现思路其实很简单,就是编写一个解释器,将代码编译.例如:S = A + B (B - C.fun())/2 + D翻译成`S = replace(replace(A, '+', replace(replace(B,''