1.比较运算符有关的题 (>,<,==等)
1.js中 console.log(1<2<3)的运算结果为?;console.log(3>2>1)的运算结果为?
错看:一下子看到题:1<2<3,3>2>1这不是很正确么,那两个结果不都是true嘛,so easy!
console.log(1<2<3); //true console.log(3>2>1); //false
看到结果可以看出你学得不到位,还得加油啊!!!
分析:这道题主要在考察布尔类型的数据参与比较运算的时候是如何转换的:
规则:在关系运算符中:如果一个操作数是布尔值,则先将其转换为数值,然后再执行比较
//举个例子:
var re = 1 < 2;
console.log(re); //true
console.log(re < 3); //true
//分析:
//re结果为 true,true被转换成1
//也就相当于console.log(re < 3); -->就是console.log(1 < 3); true
var re1 = 3 > 2;
console.log(re1); //true
console.log(re1 > 1);//false
//分析:
//re1结果为 true,true被转换成1
//也就相当于console.log(re1 > 1); -->就是console.log(1 > 1); //false
所以,console.log(1<2<3) 是先进行 1 < 2 布尔判断为真,返回一个true,而后true < 3,true隐式转换为1,也就是1 < 3, 布尔判定得到 true
console.log(3>2>1) 是先进行 3>2 布尔判断为真,返回一个true,而后true > 1,true隐式转换为1,也就是1 > 1, 布尔判定得到 false
2.算术运算符相关的题
1.类型1
//类型1
console.log(1+2+'3');
console.log('3'+2+1);
console.log(3+4+'5'+5+1);
分析:以前做过console.log(1 + "2");/console.log("2" + 1);这种题一看就是打印 "12" 和 "21"
就会错误的认为,一个式子中,不管字符串式子在哪个位置(1 + "2")和("2" + 1),整个表达式所有项全部先转换成字符串类型("1" + "2")和("2" + "1"),再进行拼接 "12" 和 "21"
也就导致错误的认为:
console.log(1+2+'3'); //"123"
console.log('3'+2+1); //"321"
console.log(3+4+'5'+5+1);//"34551"实际正确结果为:
console.log(1+2+'3'); //"33" 1+2=3,转为"3",再与"3"拼接为"33" console.log('3'+2+1); //"321" 最先遇到字符串"3",全部转为字符串再拼接 console.log(3+4+'5'+5+1); //"7551" 先算加法 3+4=7,再遇到字符串"5"再转为 "7"+"5"+"5"+"1" //这种可以直接转 console.log(1+"2"+3+4); //"1234"
所以,是从左到右算起过来,先遇见加法就算加法的结果,再转字符串拼接,先遇到到字符串就转字符串,再拼接。特列:console.log(1+"2"+3+4); //"1234"这种就常规思维直接转字符串拼接
类型2:
//类型2
console.log(+'3'+2+1); //6
console.log(1+ +'3'+2+1); //7
console.log(1+ +'2'+'3'); //"33" 注意这题
console.log(1+2+3+4+ +"5"+6+7); //28
分析: +"123" 的意思就是把字符串"123"转为数字型,就是Number("123")的意思。(+"123"只是个例子)
整个表达式除了 +"123" 没其它字符串后,把+"123"当作对应的数字进行加法运算
eg:console.log(1+ +'3'+2+1); //7
整个表达式除了 +"123" 还有其它字符串,把+"123"当作对应的数字进行加法运算,在遇到字符串后,把加法运算的结果转为字符串类型,然后进行拼接。
eg:console.log(1+ +'2'+'3'); //"33"
1+ 2 = 3,然后遇见"3",转为字符串"3",然后"3"+"3"得到"33"
eg:console.log(1+ +'2'+'3'+4+5); //"3345"
类型3:
//类型3
console.log('A'-'B'+'C');// "NaNC"
console.log('C'+'A'-'B');// NaN
//拓展 (看了下面分析再看这里)
console.log('A' - 0); //NaN
console.log('A' - 1); //NaN
console.log(1 - 'A' + "b" + 2); //"NaNb2"
分析:易受到C,java这些语言的影响,想到这里是ASCII码对应的字符,运算时要转换为对应的数字进行计算, 但是在JS中不是,这样,"A","a"这些就是一个字符串,不按照ASCII码来
而从左到右 + 就是字符串拼接,- 就是若某个运算数不是数字,结果为NaN
所以:
console.log('A'-'B'+'C'); //'A'-'B' ,- 两端运算数都不是数字,结果为NaN ,再转为字符串类型"NaN",然后拼接为 "NaNC"
console.log('C'+'A'-'B'); //'C'+'A' 字符串拼接为"CA",然后"CA"-"A",- 两端运算数都不是数字,结果为NaN
更多了解关于JS的乘法,除法,取模,加法,减法运算规则去到这里:
http://t.csdn.cn/pbhrw
3.笔试题: var ,let,const的区别?
1.共同点:都是可以声明变量的。
2.区别:
01.var 具有变量提升的机制,let和const没有变量提升的机制
02.var 可以多次声明同一个变量,let和const不可以多次声明同一个变量(只能修饰一次)
03.var , let 声明变量,const声明常量,var和let声明的的变量可以再次赋值,但是const不可以再次赋值了。
<script>
let a = 1;
a = 2;
console.log(a); //2
const b = 3;
b = 4;
console.log(b);//Assignment to constant variable.(常量赋值)报错
</script>
注意点:如果const的是一个引用数据,里面的数据改了,但是引用地址没改,也不会报错
<script>
const obj = {
a:1
}
obj.a = "123";
console.log(obj);//{a: '123'}
const arr = [1,2,3];
arr[0] = "a";
console.log(arr); //(3) ['a', 2, 3]
</script>
04. var 声明的变量没有自身作用域,let 和const声明的变量有自身的作用域("暂时性死区"),在该区域外面,访问不到该区域里面的数据。