本文已参与「新人创作礼」活动,一起开启掘金创作之路。
第1关:JavaScript知识训练-运算符
通关知识
1、在JavaScript中,两个整数进行除(/)运算,其结果也为整数。(B)
A、正确
B、错误
2、x={x:1};y={y:1};z=1;n='1’下面结果为true的是(D)
A、x === y
B、x == y
C、z === n
D、z == n
3、假设val已经声明,且定义为任何数值。三元运算符 (val !== '0')?'define':'undefine';的返回值是(A)
A、define
B、undefine
C、define或undefine
D、非0的数
4、假设有如下代码,那么a(10)的返回结果是(A)
function a(a){
a^=(1<<4)-1;
return a;
}
A、5
B、10
C、15
D、16
5、下面这段javascript代码,最后一句alert的输出结果是(C)
var msg='hello';
for(var i=0;i<10;i++){
var msg = 'hello'+i*2+i;
}
alert(msg);
A、hello
B、hello27
C、hello189
D、hello30
第2关:算术运算符
相关知识
JavaScript中的算术运算符除了数学中常见的加减乘除外,还有递增、递减和取余等。
+ - * / %运算符
JavaScript中的加号除了具有数学中将两个数字相加的作用外,还能对字符串做连接操作。
对两个数字相加和数学中一样,字符串相加就是拼接字符串的意思,比如Java+Script的结果是字符串JavaScript。
当字符串和数字相加时需要进行类型转换,数字会先转为字符串,然后再做字符串的拼接。
var resultNumber = 1+1;
//结果是2
var resultString1 = "1"+"1";
//结果是“11”
var resultString2 = 1+"2";//结果是“12”
减法、乘法、除法以及取余运算符只能用于数字之间的计算,不能做字符串操作。
-和数学中减号用法相同;
*和数学中乘号用法相同;
/表示除以,结果是浮点数,不做四舍五入;
%表示取余数,a%b返回a除以b得到的余数,结果与a的符号相同。
var floatNumber = 3/2;
//结果是1.5
var intNumber1 = 3%2;
//结果是1
var intNumber2 = -3%2;
//结果是-1
递增运算符和递减运算符
递增运算符++表示对一个数做加1的操作,递减运算符--表示对一个数做减1的操作。
++符号在数字的左边还是右边会影响运算的顺序,当++在数的左边时,表示先对数加1,再返回加1后的结果。在右边时,表示先返回该数的值,再加1。下面的例子展示了这种区别。
递减运算符--同理。
递增只对数字有效,不做字符串的拼接。
var i = 1,j = 0;
j = i++;
//j为1,i为2
var m = 1,n = 0;
n = ++m;
//n为2,m为2
字符串与数的转换
(1)parseInt()函数 parseInt()是系统内置函数,可可解析一个字符串,并第一个数字字符串返回一个整数。 语法格式为: parseInt(string, radix) 其中,string是被解析的字符串,radix是要解析的数字的基数。 当参数 radix 的值为 0或缺省时,parseInt() 会根据 string 来判断数字的基数。
- 当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
- 如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字
- 如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。
例如: parseInt("123")的返回值为123 parseInt("4m6")的返回值为4 parseInt("a2")的返回值为NaN parseInt(12,16)的返回值为18
(2)toString()函数 toString()是Object对象的方法,用于将当前对象以字符串的形式返回。由于所有对象都"继承"了Object的对象实例,因此都可以使用该方法实现转换。 语法格式: object.toString( ) 例如: var num1 = 15; a = num1.toString(); var num2 = 10; b = num2.toString(); c = a + b c的输出结果为1512。
编程要求
给定两个字符串变量,把它们转为数字后相除,拼接被除数、除数和余数为一个新的字符串。例如:a为"5",b为"3",则c为数字2,拼接后结果为字符串"532"。a为"23asdf",b为"3fe",则c为数字2,拼接后结果为字符串"23asdf3fe2"。
本关的编程任务是补全右侧代码片段中Begin至End中间的代码,完成函数mainJs(),具体要求如下:
- 将两个数字字符串参数
a和b转换为数字a1和b1; - 计算
a1除以b1的余数c; - 将
a、b、c分别转换为字符串;
- 具体请参见后续测试样例。
本关涉及的代码文件ArithSymbol.js的代码框架如下:
function mainJs(a,b) {
//请在此处编写代码
/********** Begin **********/
/********** End **********/
return a+b+c;
}
测试说明
测试过程:
- 平台将读取用户补全后的
ArithSymbol.js; - 调用其中的
mainJs()方法,输入若干组测试数据; - 最后根据测试的输出判断程序是否正确。
以下是测试样例:
测试输入: 100,9 预期输出: 10091
测试输入: -10,3 预期输出: -103-1
测试输入: 23as,3ss 预期输出: 23as3ss2
通关代码
function mainJs(a,b) {
//请在此处编写代码
/***********Begin**********/
var a;
var b;
var d;
var e;
d = parseInt(a);
e = parseInt(b);
c=d%e;
c.toString();
/*********End************/
return a+b+c;
}
第3关:比较和逻辑运算符
相关知识
比较运算符
JavaScript中的比较运算符有==,===,>,<,!=,>=等。
==叫做相等,===叫做严格相等。双等号和三等号的区别是:三等号要求数据类型和值都相等,双等号只需要值相等即可,相等包含严格相等。
从比较过程来看,严格相等先比较两个对象的数据类型是否相等,不相等则结束比较,返回false,相等在数据类型不同时,尝试进行数据类型转换,例如,在字符串和数字的比较中,字符串会被转为数字再比较;布尔值true转为数字1,布尔值false转为数字0。
如果数据类型相同,相等和严格相等都会直接比较值,值相等返回true。
-
不等 对应于上面的等号,不等号也有两种:
!=和!==。!=和==互为相反,==成立,!=一定不成立。!==和===互为相反,严格相等成立,则严格不相等不成立。 -
其它
大于,小于,大于等于,小于等于的比较规则如下: 比较的两个对象都是数字,按照数学中数字的比较方法。 数字和字符串比较,字符串转为数字后再比较。 字符串和字符串比较,从第一个字符开始,逐个比较,发现不相等立即返回。字符按照
ASCII编码值的大小比较,一般只要记住:数字<大写字母<小写字母,字母a小于字母z,A小于Z, 比较过程中,当一个字符串结束另外一个字符串还有,还没有比较出大小,则长的字符串较大。
逻辑运算符
在介绍逻辑运算符之前,我们必须明确逻辑运算符的操作数只能是布尔型,其他类型都会被转换为布尔型:除了0,null,undefined,""外,其他的值转换为布尔值都是true。
- 逻辑与 逻辑与有两个操作数,中间用
&&连接,只有两个操作数都是true结果才是true; 其中一个操作数不是布尔型,当左操作数为真值时,返回右操作数。当左操作数为假值时,返回左操作数。 - 逻辑或 逻辑或同样有两个操作数,用
||连接,至少有一个操作数为true时结果为true; 其中一个操作数不是布尔型,当左操作数为真值时,返回左操作数。当左操作数为假值时,返回右操作数。 - 逻辑非 逻辑非只有一个操作数,
!后连接操作数或表达式,意思是将操作数取反; 如果操作数不是布尔型,编译器首先将其他类型转换为布尔型,然后返回true或者false。
编程要求
本关的编程任务是补全右侧代码片段中Begin至End中间的代码,完成函数mainJs(),具体要求如下:
(1) 比较字符串a和b的大小;
(2)使用if...else语句进行分支设计,如果a>b,则返回a逻辑与b的结果,否则返回a逻辑取反的结果(返回时使用return);
本关涉及的代码文件LoginBoolSymbol.js的代码框架如下:
function mainJs(a,b) {
//请在此处编写代码
/********** Begin **********/
/********** End **********/
}
测试说明
测试过程:
- 平台将读取用户补全后的
LoginBoolSymbol.js; - 调用其中的
mainJs()方法,输入若干组测试数据; - 最后根据测试结果判断程序是否正确。
以下是测试样例:
测试输入: b,d 预期输出: b
测试输入: z,zz 预期输出: False
通关代码
function mainJs(a,b) {
//请在此处编写代码
/********Begin***************/
var a;
var b;
if( a > b ) {
return (a&&b);
}
else {
return !a;
}
/**********End****************/
}
第4关:条件运算符
相关知识
条件运算符
条件运算符由?和:构成,三个操作数分别在?的左边、右边以及:的右边,第一个操作数如果是真值,整个表达式返回第二个操作数的值;第一个操作数如果是假值,返回第三个操作数的值。
一般我们说到JavaScript中的三元运算符,指的就是条件运算符,因为它有三个操作数。条件运算符通常用来简化表达式。
var result1 = a>b?a:b;
//result1赋值为a和b中大的那一个
var result2 = (a==5)?(a+1):(a-1);
//a为5,返回a+1,否则返回a-1
编程要求
本关的编程任务是补全右侧代码片段中begin至end中间的代码,完成函数mainJs(),具体要求如下:
- 使用return返回参数
a和b中较大的字符串; - 判断字符串的大小直接用
<和>即可。
- 具体请参见后续测试样例。
本关涉及的代码文件ConditionSymbol.js的代码框架如下:
function mainJs(a,b) {
//请在此处编写代码
/********** Begin **********/
/********** End **********/
}
测试说明
测试过程:
- 平台将读取用户补全后的
ConditionSymbol.js; - 调用其中的
mainJs()方法,输入若干组测试数据; - 接着根据测试的输出判断程序是否正确。
以下是测试样例:
测试输入: a,aa 预期输出: aa
测试输入: 1,2 预期输出: 2
通关代码
function mainJs(a,b) {
//请在此处编写代码
/********** Begin **********/
var result = a>b?a:b;
return result;
/********** End **********/
}
第5关:运算符的优先级和结合性
相关知识
运算符的优先级
JavaScript中运算符的优先级和数学中运算符的优先级意思相同,优先级高的运算符比优先级低的运算符先计算,例如数学中1+2*3算式,先计算2*3,结果再与1相加,所以乘法的优先级高于加法,在JavaScript中,不同的优先级也是这个作用。
下面是常见的运算符的优先级:
| 分类 | 运算符 | 含义 | 结合性 |
|---|---|---|---|
| 1 | ++ | 前后增量 | R |
| 1 | -- | 前后减量 | R |
| 1 | ! | 逻辑非 | R |
| 2 | * / % | 乘 除 求余 | L |
| 3 | + - | 加减 | L |
| 4 | < <= > >= | 比较数字顺序 | L |
| 4 | in | 测试属性是否存在 | L |
| 5 | == | 判断相等 | L |
| 5 | != | 判断不等 | L |
| 6 | & | 按位与 | L |
| 7 | && | 逻辑与 | L |
| 8 | ?: | 条件运算符 | R |
| 9 | = | 赋值 | R |
| 9 | += -= *= /= %= | 运算且赋值 | R |
| 10 | , | 忽略第一个操作数 | L |
从上到下优先级逐渐降低。第一栏数字相同的运算符优先级相同,对于这个表格,不需要全部记住,但是常见的需要记住,比如加减乘除的优先级高于比较运算符,赋值运算符的优先级几乎是最低的,下面给出例子帮助理解:
var a = 1;
var b = 2;
var c = ++a+b;
因为++的优先级高于+,所以上面的第三个句子等价于:
var c = (++a)+b;
运算符的结合性
运算符的优先级是针对不同优先级的运算符来说的,对于同一级的运算符,运算顺序取决于运算符的结合性,比如加法和减法的优先级相同,而加法和减法都是从左向右结合,所以a+b-c式中,会先计算a+b,即按照阅读的顺序计算。
也有很多运算符是从右到左结合的,比如取反、逻辑非。
上面图中的第三栏就是结合性,R表示从右向左结合,L表示从左到右结合,从左向右的占多数,这和我们在数学中的习惯相同。
var d = a*b/c;//先计算乘法后计算除法
var aa = 2;
var bb = 3;
var cc = aa *= bb;
//先计算aa*=bb,再把结果赋值给cc,为6
上面第一个式子是从左到右结合,第四个式子是从右到左结合。 分别等价于:
var d = (a*b)/c;
var cc = (aa *= bb);
编程要求
本关的编程任务是补全右侧代码片段中begin至end中间的代码,在函数体内第三句以及第五句添加适当的括号,以实现如下功能:
(1)参数a先减去1,所得差再与参数b相加,然后将结果再与b相乘;
(2)上面的结果为24则给参数c赋值1,否则赋值0;
(3)计算c与d(d 等于4)的积,这个积再与参数d求和,所得结果赋值给参数e;
- 函数参见下面的测试说明部分。
本关涉及的代码文件Priority.js的代码框架如下:
function mainJs(a,b) {
var a = parseInt(a);
var b = parseInt(b);
//请在此处编写代码
/********** Begin **********/
var c = --a+b*b==24?1:0;
var d = 4;
var e = c*=d+d;
/********** End **********/
return e;
}
测试说明
测试过程:
- 平台将读取用户补全后的
Priority.js; - 调用其中的
mainJs()方法,输入若干组测试数据; - 接着根据测试后的输出判断程序是否正确。
以下是测试样例:
测试输入: 6,3 预期输出: 8 测试输入: 5,1 预期输出: 4
通关代码
function mainJs(a,b) {
var a = parseInt(a);
var b = parseInt(b);
//请在此处编写代码
/*********begin*********/
var bb = ((--a)+b)*b;
if(bb==24)
var c = 1;
else
var c = 0;
var d = 4;
var e = (c*d)+d;
/*********end*********/
return e;
}