javascript运算符优先级 js位运算符怎么运算
本篇文章给大家谈谈javascript运算符优先级,以及js位运算符怎么运算对应的知识点,文章可能有点长,但是希望大家可以阅读完,增长自己的知识,最重要的是希望对各位有所帮助,可以解决了您的问题,不要忘了收藏本站喔。
javascript 变量的大小用什么关键字
JavaScript语言有以下特点:
(1) JavaScript语言的语法类似于C语言和Java语言。
(2) JavaScript程序由客户端的浏览器解释执行。
(3) JavaScript中,字母区分大小写。
由于JavaScript是解释执行的,所以它的语法远不如C语言等严格,如果程序中有错误,浏览器会忽略错误的部分,而不是停止执行。
JavaScript程序是在客户端执行的,它不能操纵服务器中的数据库,所以包含了JavaScript的网页仍是静态网页。
整型常量:
以 0开头的是八进制数,如 065。
以 0x开头的是十六进制数,如 0x3f4a。
其它为十进制数,如 35,-70。
浮点常量:
如 12.8、-0.65、1.2e-7。
布尔常量:
有 true和 false两个。
字符串常量:
如:"OK"、"a"、"欢迎光临"。
注:JavaScript中的字符串可以用双引号分界,也可用单引号分界。如果串中含有一种引号,需用另一种引号分界。
转义字符:
如:\n代表换行,\r代表回车,\t代表Tab符,\"代表双引号,\'代表单引号。
它们一般用于字符串之中。
undefined:
代表未定义的值。它不能用于计算,如果引用了一个不存在的变量,或没有赋值的变量时,输出此值。
null:
代表空值。它不能用于计算,但可以用它为变量赋值,来清空变量中原有的值。
说明:在JavaScript中没有其它语言中常见的字符型量,需要用字符串代替。
JavaScript的数据类型可分为两大类:原始类型、引用类型。原始类型变量的值存放在栈中,访问变量时可直接访问到变量的值。引用类型变量在栈中存放的是指针,其值另外存放在堆中,需要通过指针才能访问。
原始类型:包括 Undefined、Null、Boolean、Number、String五种。
Undefined类型:值为 undefined,代表一个未定义的量。
Null类型:值为 null,一般用作占位符,表示一个尚不存在的对象。
Boolean类型:值为 false或 true,一般用于条件表达式中。
Number类型:值为数字,可进行数值计算。
String类型:值为字符串,可进行字符串处理。
引用类型:所有对象都是引用类型。包括 Boolean、Number、String、Array、Date、Math等。
其中,Boolean、Number、String既可以是原始类型,也可以是引用类型。
引用类型的变量除了可以访问变量的值以外,还提供了若干属性和方法。
JavaScript中的变量声明用关键字 var引导,变量的类型取决于它的声明方式。
声明原始类型的变量:
var变量名=值;
例如:
var x;
var b= true;
var k= 20;
var s="abc";
变量 x没有指定值,它的值默认为 undefined,变量 b为 Boolean型,变量 k为 Number型,变量 s为 String型。
声明引用类型的变量:
var变量名= new类型名(初值);
例如:
var bb= new Boolean(false);
var str= new String("Hello");
var arr= new Array("red","yellow","blue");
变量 bb是 Boolean对象,变量 str是 String对象,变量 arr是 Array对象。
JavaScript的变量是弱类型的,变量的类型主要取决于它的值,你可以随时更改它的类型。
例如:
var i;
i= 20;
i="red";
声明时变量 i是 Undefined类型,赋值一个整数后,它成为 Number类型,赋值为字符串后,又成为 String类型。
JavaScript中的运算符和C语言基本相同,优先级也相同。
算术运算符:+(加)、-(减)、*(乘)、/(除)、%(取模)、++(增量)、--(减量)、-(取负)。
逻辑运算符:&&(与)、||(或)、!(非)。
比较运算符:>(大于)、>=(大于等于)、<(小于)、<=(小于等于)、==(等于)、!=(不等于)、===(严格相等)、!==(不严格相等)。
注:“相等”只要求值相等,“严格相等”要求值相等且类型相同。如:1=="1"是 true,而 1==="1"是 false。
位运算符:&(位与)、|(位或)、^(位异或)、~(按位取反)、<<(左移)、>>(右移)、>>>(填0右移)。
赋值运算符:=(赋值)、op=(运算赋值)。
注:运算赋值中的运算符可以是算术运算符或位运算符。如:“x+=10”表示“x=x+10”。
条件运算符:条件?表达式1:表达式2
注:若条件为 true,值为表达式1的值,否则为表达式2的值。
字符串连接运算符:+、+=。
如:"every"+"one"的结果为"everyone"。
注:连接的项目中可以包括字符串、常量、变量,不需要都是字符串,只要项目中有一个是字符串就会按字符串进行连接。
如:"ex"+20+"b"的结果为"ex20b"。
new运算符:
用于创建一个对象。如:new Array()表示生成一个数组对象。
delete运算符:
用于删除一个对象。
JavaScript语句用“;”分界,但没有分号也可以正常使用,不过应该养成书写分号的习惯。
表达式语句:
x=1;
x++;
条件语句:if…… else……
if( x>0)
k="A";
else
k="B";
多路分支语句:switch…… case……
switch( a)
{
case 1: x="A"; break;
case 2: x="B"; break;
case 3: x="C"; break;
default: x="D";
}
循环语句:while
while( x<5)
{
y+= x;
x++;
}
循环语句:do…… while
do
{
y+= x;
x++;
}while( x<5);
循环语句:for
for( i=1; i<=10; i++)
{
x+= 2;
}
退出循环:break、continue
break语句可退出循环语句或 switch语句。
continue语句可结束本次循环,并开始下一次循环。
JavaScript语句用“;”分界,但没有分号也可以正常使用,不过应该养成书写分号的习惯。
表达式语句:
x=1;
x++;
条件语句:if…… else……
if( x>0)
k="A";
else
k="B";
多路分支语句:switch…… case……
switch( a)
{
case 1: x="A"; break;
case 2: x="B"; break;
case 3: x="C"; break;
default: x="D";
}
循环语句:while
while( x<5)
{
y+= x;
x++;
}
循环语句:do…… while
do
{
y+= x;
x++;
}while( x<5);
循环语句:for
for( i=1; i<=10; i++)
{
x+= 2;
}
退出循环:break、continue
break语句可退出循环语句或 switch语句。
continue语句可结束本次循环,并开始下一次循环。
对象(Object)是JavaScript中最重要的一种数据类型,一个对象中可包含若干属性和方法。
属性相当于一种变量,有些属性一开始就有值,可以通过它们获取对象的参数,有些属性是只读的,这种属性可作为常量使用。引用对象属性的方法是:
对象名.属性名
方法相当于函数,你可以调用对象的方法来实现相应操作。引用对象方法的方法是:
对象名.方法名(参数)
有些方法不需要参数,但在调用时也不能省略括号。
JavaScript支持自定义对象,但我们在编程中使用的一般都是系统提供的对象。这些对象提供了丰富的属性和方法,可以在程序中直接使用它们。
JavaScript可访问的对象包括:本地对象、BOM对象和 DOM对象。
本地对象是JavaScript语言提供的对象,它们只能用于JavaScript程序中。包括 Boolean对象、Number对象、String对象、Array对象、Data对象、Math对象等。
BOM对象是由浏览器窗口提供的对象,它们由浏览器开发者提供,可以被包括JavaScript在内的脚本语言访问。包括 Window对象、Document对象、Navigator对象、Screen对象、History对象、Location对象等。
DOM对象是一种跨平台的对象,它们可以用于不同语言的程序中。DOM对象对应的是页面中的标签,每个HTML标签都是一个 DOM对象。
对象实例:
对象实例是对象的具体个体,一个对象可以拥有多个对象实例,比如每个字符串都是一个 String对象的实例,我们访问对象时,实际上访问的是对象的实例。
本地对象的实例一般是通过 new运算符生成的,比如:
var arr= new Array("red","yellow","blue");
var s="Hello";
arr是一个 Array对象的实例,s是一个 String原始类型,但它也是一个伪对象,可以引用 String对象的属性和方法。
BOM对象对应的是浏览器窗口,它本身已经实例化了,可以直接访问,比如:
window.alert("Hello!");
document.write("欢迎光临");
window是当前窗口的 Window对象的实例,document是当前窗口的 Document对象的实例。
DOM对象对应的是页面中的 HTML标签,每个标签都是某种 DOM对象的实例,它们往往是通过 Window对象或 Document对象间接访问的,比如:
var a= document.getElementById("txt");
document.getElementById("txt")用于获取页面中 id="txt"标签对应的 DOM对象。
注意:在JavaScript中,对象名、属性名、方法名都是区分大小写的,如:“Math.PI”不能写成“math.pi”,“document.write”也不能写成“Document.write”。
this关键字:
this是对当前对象自己的引用,用它可直接调用当前对象的属性和方法。比如:
<input type="radio" name="rr" value="A" onclick="sel(this.value)"/>
<input>是一个HTML标签,但它同时也是一个 DOM对象,其中的 this.value就是引用这个 Input对象的 value属性值。
请问这段javascript 代码是什么意思为什么能输出汉字。
这代码混淆,其实靠的是js的类型转化的一些基本原理。
换个简单点的例子吧,
(!(~+[])+{})[--[~+""][+[]]*[~+[]]+~~!+[]]+({}+[])[[~!+[]]*~+[]]这个代码实际上等同于“sb”。
首先要运用到的第一个知识就是js运算符的优先级,因为这么长一段运算看的人眼花,我们必须得先根据优先级分成n小段,然后再各个击破。优先级的排列如下表:
优先级从高到低:
根据此规则,我们把这一串运算分为以下16个子表达式:
运算符用红色标出,有一点可能大家会意识不到,其实中括号[]也是一个运算符,用来通过索引访问数组项,另外也可以访问字符串的子字符,有点类似charAt方法,如:'abcd'[1]//返回'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],即一个数组,里面只有一个元素-1.
接下来看子表达式13就简单了,把15、16求出来的填进去,就变成了这样:--[-1][0],取数组的第0个元素,然后自减,结果为-2,是不so easy!
继续往上走,子表达式14: [~+[]]
其实把15、和16的原理用上就非常明显了,答案[-1]
继续来求子表达式9,此刻它已变成:-2*[-1],有稍许不一样,不过没关系,我们还是按照规则来,运算符是乘号*,当然是做数学运算,那后面的[-1]就得转化为number,与16的求法类似,过程如下:
①调用toPrimitive,发现是object类型
②调用valueOf,返回自身[-1]
③因为不是原始类型,继续调用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,返回"[object Object]"
④false与"[object Object]"相加,false先转化为字符串"false"
⑤相加得结果"false[object Object]"
知道了表达式3和4,我们就可以来看表达式1了,此时它是这样的:"false[object Object]"[3],因为这个[]可以取字符串的子字符,像charAt一样,所以得到了结果"s"
经过上面艰难的流程,我们拿到了字符"s",也就是那张图的左半边,剩下的那个"b",相同的原理可以搞出来,我这里就不一一演示了,留给你练练吧~
回顾一下这个过程其实也不复杂,只是有一些需要重复劳动的,只要你掌握了运算的优先级,能把大串分解成一个个小串,然后运用类型转化的知识挨个处理就搞定了。怎么样,看到这里你还觉得神奇吗?
同样的,中文字符也是由这样组成的,跟英文同样的道理。
javascript算数运算符一点点小疑问。
首先你应该百度一下“自动类型转换”
关于字符串,只要用引号括起来就是字符串,不论引号中间是数字还是字母或其他符号。
a="100"
这个a如果不是字符串,是可以的,但是
a="100000000000000000000000000000000000000000000000000000"
如果去掉引号,就溢出了,因为任何编程语言中,都没有一种变量能容纳如此大的数。因此只能用字符串。
自动类型转换,如果一个字符串由数字组成且转换后不超出范围,就能转换成功,否则就会失败,出现NaN(not a number)错误。
a="100"
这个a是字符串,是不能直接进行运算的,之所以可以和其他数字相加得到正确结果,是因为在运算之前javascript解释器将a进行了自动类型转换,变成了数字。
打个比方,书上写着100,它本身是1,0,0三个字符组成的字符串,之所以你看成100,是因为你的大脑把这个字符串转换成了数字。
javascript运算符优先级的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于js位运算符怎么运算、javascript运算符优先级的信息别忘了在本站进行查找哦。