×

js运算符优先级

js运算符优先级(运算符号有哪些js)

admin admin 发表于2023-08-17 09:13:18 浏览36 评论0

抢沙发发表评论

本文目录

运算符号有哪些js

javascript 具有全范围的运算符,包括算术、逻辑、位以及赋值运算符。此外还有其他一些运算符。 计算 逻辑 位运算 赋值 杂项 描述 符号 描述 符号 描述 符号 描述 符号 描述 符号 负值 - 逻辑非 ! 按位取反 ~ 赋值 = 删除 delete 递增 ++ 小于 《 按位左移 《《 运算赋值 oP= typeof 运算符 typeof 递减 -- 大于 》 按位右移 》》 void 运算符 void 乘法 * 小于等于 《= 无符号右移 》》》 除法 / 大于等于 》= 按位与 & 取模运算 % 等于 == 按位异或 ^ 加法 + 不等于 != 按位或 | 减法 - 逻辑与 && 逻辑或 || 条件(三元运算符) ?: 逗号 , 恒等 === 不恒等 !== 运算符优先极 javascript 中的运算符是按照一个特定的顺序来求值的。这个顺序就是运算符的优先级。下表按从最高到最低的优先级列出了这些运算符。处于同一行中的运算符按从左至右的顺序求值。 运算符 描述 . () 字段访问、数组下标以及函数调用 ++ -- - ~ ! typeof new void delete 一元运算符、返回数据类型、对象创建、未定义值 * / % 乘法、除法、取模 + - + 加法、减法、字符串连接 《《 》》 》》》 移位 《 《= 》 》= 小于、小于等于、大于、大于等于 == != === !== 等于、不等于、恒等、不恒等 & 按位与 ^ 按位异或 | 按位或 && 逻辑与 || 逻辑或 ?: 条件 = oP= 赋值、运算赋值 , 多重求值 圆括号可用来改变求值顺序。圆括号中的表达式应在其用于语句的其余部分之前全部被求值。 具有较高优先级的运算符将在具有较低优先级的运算符之前被求值。例如: z = 78 * (96 + 3 + 45) 在该表达式中有五个运算符: =, *, (), +, 以及 +。根据优先级,它们将按下面的顺序求值: (), *, +, +, =。 首先对圆括号内的表达式求值:其中有两个加法运算符,它们具有相同的优先级:96 和 3 相加,然后再将它们的和与 45 相加,得到的结果为 144。 然后是乘法运算: 78 和 144 相乘,得到结果为 11232。 最后是赋值运算:将 11232 赋给 z。

js利用与或运算符优先级实现if else条件判断表达式

复制代码代码如下:《scripttype=“text/javascript“》/*******************************************************************利用运算符优先级实现ifelse表达式result=expression1&&expression2当且仅当两个表达式的值都等于True时,result才是True。如果任一表达式的值等于False,则result为False。JScript使用下面的规则,来把非Boolean值转换为Boolean值:所有对象都被认为是true。字符串当且仅当为空时被认为是false。null和未定义的均被认为是false。数字当且仅当为零时是false。*******************************************************************/alert(1&&0);//false,returnthefirstfalse’sargument0alert(1&&2);//true,returnthelasttrue’sargument2/*******************************************************************result=expression1||expression2如果两个表达式中有一个或两个等于True,则result是True。JScript使用下面的规则来把非Boolean值转换为Boolean值:所有对象都被认为是true。字符串当且仅当为空时才被认为是false。null和未定义的均被认为是false。数字当且仅当为0时才是false。*******************************************************************/alert(1||0);//true,returnthefirstture’sargument1alert(0||false);//false,returnthelastfalse’argumentfalse/*******************************************************************“并列“表达式,返回最后一个表达式*******************************************************************/alert((1,0,-1));//returnthelastargument-1/*******************************************************************利用运算符优先级实现if(...){...}else{...}无明确返回值的一律返回undefinedundefined,null都将被转换为false*******************************************************************/vara=true;a&&(alert(’true’),1)||alert(’false’)/*******************************************************************或者用三目运算符*******************************************************************/a?alert(’true’):alert(’false’);《/script》

请问这段javascript 代码是什么意思为什么能输出汉字

这代码混淆,其实靠的是js的类型转化的一些基本原理。

换个简单点的例子吧,

(!(~+)+{})

这个代码实际上等同于“sb”。

首先要运用到的第一个知识就是js运算符的优先级,因为这么长一段运算看的人眼花,我们必须得先根据优先级分成n小段,然后再各个击破。优先级的排列如下表:

  优先级从高到低:

根据此规则,我们把这一串运算分为以下16个子表达式:

运算符用红色标出,有一点可能大家会意识不到,其实中括号也是一个运算符,用来通过索引访问数组项,另外也可以访问字符串的子字符,有点类似charAt方法,如:’abcd’ // 返回’b’。而且中括号的优先级还是最高的哦。

 

  预处理结束,接下来需要运用的就是javascript的类型转化知识了。我们先说说什么情况下需要进行类型转化。当操作符两边的操作数类型不一致或者不是基本类型(也叫原始类型)时,需要进行类型转化。先按运算符来分一下类:

减号-,乘号*,肯定是进行数学运算,所以操作数需转化为number类型。

加号+,可能是字符串拼接,也可能是数学运算,所以可能会转化为number或string

一元运算,如+,只有一个操作数的,转化为number类型

  下面来看一下转化规则。

  1. 对于非原始类型的,通过ToPrimitive() 将值转换成原始类型:

  ToPrimitive(input, PreferredType?)

  可选参数PreferredType是Number或者是String。返回值为任何原始值.如果PreferredType是Number,执行顺序如下:

如果input为primitive,返回

  否则,input为Object。调用 obj.valueOf()。如果结果是primitive,返回。

  否则,调用obj.toString(). 如果结果是primitive,返回

  否则,抛出TypeError

  如果 PreferredType是String,步骤2跟3互换,如果PreferredType没有,Date实例被设置成String,其他都是Number

 

  2. 通过ToNumber()把值转换成Number,直接看ECMA 9.3的表格

3. 通过ToString()把值转化成字符串, 直接看ECMA 9.8的表格

规则就这么多,接下来实践一下,根据我们上面划分出的子表达式,一步一步将这个神奇的代码给执行出来。开工~

  

  先看最简单的子表达式16:+

  只有一个操作数,肯定是转化为number了,根据上面的规则2,是个数组,object类型,即对象。所以得先调用toPrimitive转化为原始类型,并且PreferredType为number,这个参数表示更“倾向于”转化的类型,这里肯定是number了。然后首先调用数组的valueOf方法,数组调用valueOf会返回自身,如下:

这个时候,我们得到一个空串“”,还没有结束,看上面的规则2描述,继续调用toNumber,转化为number类型,如下:

大功告成!子表达式16转化完毕,+,最终得到0。

 

  来看子表达式15:

  空串““前面有两个一元操作符,但是操作数还是只有一个,所以,最终要转化为的类型是number。看规则2吧,空串调用toNumber得到0。接下来是~,这是个什么东东呢?它是位运算符,作用可以记为把数字取负然后减一,所以~0就是-1 。

  别忘了,这个子表达式外头还包着中括号,所以最终的值为,即一个数组,里面只有一个元素-1.

 

  接下来看子表达式13就简单了,把15、16求出来的填进去,就变成了这样:--,取数组的第0个元素,然后自减,结果为-2,是不so easy!

 

  继续往上走,子表达式14:

  其实把15、和16的原理用上就非常明显了,答案

 

  继续来求子表达式9,此刻它已变成:-2*,有稍许不一样,不过没关系,我们还是按照规则来,运算符是乘号*,当然是做数学运算,那后面的就得转化为number,与16的求法类似,过程如下:

  ①调用toPrimitive,发现是object类型

  ②调用valueOf,返回自身

  ③因为不是原始类型,继续调用toString,返回“-1“

  ④“-1“是原始类型了,然后调用toNumber,返回-1

  ⑤与-2相乘,返回2

 

  子表达式10:~~!+,不多说了,答案1. 就是从右往左依次一元计算。

 

  有了9和10,我们来到了子表达式4,此刻它已经长这样了:2+1, 好,我不多说了。

 

  继续看表达式7:!(~+),~+=-1,这个根据上面已经知道了,那!-1是什么呢?这里要说一下这个感叹号,它是逻辑取非的意思,会把表达式转化为布尔类型,转化规则和js的Truthy和Falsy原则是一样的,后面跟数字的,除0以外都为false,后面跟字符串的,除空串以外都为false。这里的!-1当然就是false了。

 

  接下来这个表达式3:false+{}有点关键。一个布尔加一个对象,那这个{}应该先转化为原始类型,流程如下:

  ①调用toPrimitive,发现是object类型

  ②调用valueOf,返回自身{},

  ③不是原始类型,调用toString,返回““

  ④false与““相加,false先转化为字符串“false“

  ⑤相加得结果“false“

 

  知道了表达式3和4,我们就可以来看表达式1了,此时它是这样的:“false“,因为这个可以取字符串的子字符,像charAt一样,所以得到了结果“s“

 

  经过上面艰难的流程,我们拿到了字符“s“,也就是那张图的左半边,剩下的那个“b“,相同的原理可以搞出来,我这里就不一一演示了,留给你练练吧~

     

  回顾一下这个过程其实也不复杂,只是有一些需要重复劳动的,只要你掌握了运算的优先级,能把大串分解成一个个小串,然后运用类型转化的知识挨个处理就搞定了。怎么样,看到这里你还觉得神奇吗?

同样的,中文字符也是由这样组成的,跟英文同样的道理。

javascript运算符优先级: var i,j; i=0; j=i&&(++i); 为什么上面的代码运行之后j的值是0

这个应该是不能只看运算顺序的,这个是&&的运算,在这个运算中,是有一种称之为“短路”的。&&的运算中,只要是有0,那结果就为0,而且它的计算顺序是为从左到右,也就是先判断左边数值,如果为0,那就直接返回结果为0,右边的运算就不执行

为什么大于小于符号有时候表格标题下载不下来JS

在写代码时按照一贯的数学思维 :if(101 《 this.status 《 1010) { return true} else { return false预期返回false ;结果返回的true;在js的逻辑中,程序会按运算符优先级,先计算左边的,左边的公式返回的应该是bool值,拿这个bool值再结合右边的 计算;且false默认为0, true默认为1先执行:1001 《= 4001 返回 true,( 即1)再执行:1 《 1010 返回true;正确的实现方式应该是:if(1001 《 status && status 《 1010) { return true} else { return false}

我在看javascript语言精粹里面有一个例子,有例子但是没有使用,谁可以正确的使用下有点不理解

      1.  walk_the_DOM方法:这个方法的主要作用就只是遍历某个DOM节点(node)下的所有子节点,并且在遍历到每个节点的时候,都是执行参数中传入的那个方法(func),你要是想要对遍历到的节点做些其他什么事情,那么你自己就可以自定义个函数,把它当参数传入到walk_the_DOM方法里就行了;这个方法里可能会有疑问的地方:     1.1  debugger; 关键字,这个是调式js代码用的,你如果用ASP.NET调试的时候,你的js代码里            写有debugger关键字,那么执行到debugger的时候就会中断执行,就像加个断点一样。当            然在IE的开发人员工具里调试,效果也是一样的。

      1.2  node.firstChild :这个是取得指定节点的第一个子节点。

      1.3  node.nextSibling:取得指定节点的下一个兄弟节点。

        

   2. getElementsByAttribute方法:这个方法里调用了walk_the_DOM方法遍历body对象,主要作用是根据HTML标记中的指定属性,取得所有该属性值等于传入值的HTML控件对象。先整个例子吧:

《html》  《head》    《script language=“javascript“》      function Window_Load(){              //自定义属性depth为2的所有html控件对象        var elements = getElementsByAttribute(“depth“,“2“);        alert(elements.outerHTML);        //取得所有width为29的html控件对象        var elements = getElementsByAttribute(“width“,“29“);        }      var walk_the_DOM = function walk(node, func) {        debugger;        func(node);        node = node.firstChild;        while (node) {          walk(node, func);          node = node.nextSibling;        }      };            var getElementsByAttribute = function (att, value) {        var results = ;          walk_the_DOM(document.body, function (node) {          var actual = node.nodeType === 1 && node.getAttribute(att);          if (typeof actual === ’string’ &&               (actual === value || typeof value !== ’string’)) {            results.push(node)          }        });        return results;      };    《/script》  《/head》  《body onload=“Window_Load();“》    《div id=“node1“》      《div id=“node11“ depth=“2“ width=“30“》 dd 《/div》     《div id=“node12“ depth=“2“ width=“29“》 dd 《/div》     《div id=“node13“ depth=“2“ width=“29“》 dd 《/div》    《/div》  《/body》《/html》

 这里的属性,可以是HTML标记的默认属性,也可以是自定义的属性。 getElementsByAttribute方法里,比较难理解的地方可能是下面这一句:

var actual = node.nodeType === 1 && node.getAttribute(att);

理解这段代码,先要清楚javascript里运算符的优先级( 总之上面这句代码跟下面这片代码的作用是一样一样的:

var actual;if(node.nodeType !== 1){  actual = node.nodeType === 1; //得到的是个整型数值(Numeric)}else{  actual = node.getAttribute(att));//得到的是个字串(String)}

javascript 执行顺序的问题

alert函数参数  str--要显示在消息对话框中的文本  alert函数说明  alert消息对话框通常用于一些对用户的提示信息,例如在表单中输入了错误的数据时。  1.提示:消息对话框是由系统提供的,因此样式字体在不同浏览器中可能不同。  2.提示:消息对话框是排它的,也就是在用户点击对话框的按钮前,不能进行任何其它操作。  3.提示:消息对话框通常可以用于调试程序。再讲一下alert的优先级,此()运算符的优先级是最高的,因此,在其它操作进行前必须限制性()操作符。而“()”又是和函数调用相关的,也就是”alert()”了!​下图给出js的操作符优先级表。