显隐式类型转换
typeof题:
typeof []; => object => 可以理解为引用,但不完全是引用
typeof null; => object => 为什么是obj? 其实是个bug;null实际上是空对象的指针,/空对象的占位符。它一开始的规定是引用类型,所以是object。es6曾提案说修改成null类型,但被拒绝了,因为更改已有代码代价很大。
typeof undefined => undefined。
typeof( function(){} ) => function。
typeof(1 - 1) => number。
typeof(1- "1") => number, 隐式类型转换。
typeof "1" - "1" => number。
直接打印typeof a; => undefined。
直接打印console.log(a) => 报错, referenceError。
typeof typof a; => string。
显示类型转换规则:
Number转换题:
特殊
Number(true); => 1, number。
Number( null ) => 0 。
其他
Number('123'); => 123, number。
Number('true') => NaN, number。
Number( undefined ) => NaN。
Number('a') => NaN。
Number('1a') => NaN。
(Number除了字符串数字, null和true以外,其他都转换成NaN)。
parseInt转换题:
parseInt('123') => 123, number 。
parseInt('233abc123') => 233, 前面有数字就转换,忽略后面不是数字的部分 。
parseInt(true) => NaN, 为什么?指向转换成整形,数字到整形。
parseInt('false') => NaN。
parseInt(null) => NaN。
parseInt(undefined) => NaN。
parseInt(NaN) => NaN。
(parseInt只有数字才转换,前面有数字也转换, 其他的变成NaN)。
parseInt(数字, radix'基底'16 ) => 基底16表示以多少进制转换成十进制,取值2-36进制。
parseFloat转换题:
parseFloat('3.14'); => 3.14。
保留几位.toFixed(2 几位); => 四舍五入。
字符串转换:
(有数字参与比较的时候,会转换成数字再比较)。
var a = '123'; a++; 打印a; -> 124, 隐式类型转换。
String(123); => '123'。
console.log(123 + ''); 转换成字符串。
.toString() => 调用toString()方法,转字符串。
.toString(radix目标进制) => 以十进制为基础,转换成目标进制。
(parseInt(100, 2).toString(16); 解释一下意思)。
Boolean转换:
Boolean(1); => true。
Boolean(null); => false。
(Boolean的参数是6个假的时候,为false,其他为true)。
隐式类型转换规则(偷偷转):
隐式类型转换的符号:> < >= <= ==
不转换的符号: === 不转换
> 比较:
'1' > 2 -> false, 先转换成数字再进行比较。
1 > '2' -> false 。
(两边字符串比较的时候,逐位比较Ascii码)。
'a' > 'b' -> false。
'4.5' > '11' --> true --> 4跟1对比,有结果就结束。
'1.5' > '11' --> false --> 1跟1对比,.跟1对比,转换成ascii后比1小。
2 > 1 > 3 -> false, true > 3,比较1和3。
== 比较:
NaN == NaN ? --> false --> NaN不等于包括自己在内的任何东西。
2 > 1 == 1 -> true。
undefined比较:既不等于0,不大于0,也不小于0。
undefined > 0 ->false。
undefined < 0 ->false。
undefined ==0 ->false。
+undefined -> NaN。
undefined == null ->true。 但undefined与null相等,他俩都跟0没关系,所以干脆就让他门相等了。
undefined === null ->false。
null比较:不等0,不大0,不小0。
null > 0 ->false。
null < 0 ->false。
null ==0 ->false。
+null -> null。
(+a / -a)比较:
var a = '123'; +a; 求typeof +a -> number,123, +a或-a,的结果是转换成number类型。
typeof -a; ->number, -123。
+true -> 1。
+false -> 0。
typeof比较:
typeof -a; ->number, -123。
isNaN比较:
背下来(isNaN用的是Number类型转换,所以null和true,false特殊)。
isNaN(NaN) ->true。
isNaN('123') -> false, 隐式类型转换成数字了。
isNaN('a') -> true, a转换成成NaN。
isNaN(null) -> false, 转换成0了,false。
为假的6个值,其他都为真:undefined, null, "", 0, false, NaN。
if的为假的情况:undefined, null, '', 0, false, NaN为假。其余的全部为真。
object与Object对比:
object => 具体的对象:Object => 代表引用类型,object,array等
两类错误及各自特点:语法错误通篇不执行。通用错误之后的语句不执行。
字符串比较:
'str' + null --> 'strnull'。
'str' + undefined --> 'strundefined'。
'str' + true --> 'strtrue'。
'str' + NaN --> 'strNaN'。
(任何数据类型+字符串,都是字符串)。
(控制台,变量是蓝色,字符串是灰黑色)。
NaN, Infinity。
0 / 0 --> NaN --> 非数的意思。
(NaN 是 number类型)。
1 / 0 --> Infinity 正无穷。
-1 / 0 --> Infinity 负无穷。
(Infinity 是 number类型)。
++ --
var a = 1;
console.log(a++) // 1先输出,再++,叫后++。
console.log(++a) // 3 先++再输出,叫前++。
console.log(a = a + 1 ); // 4先运算,接着赋值,再输出
var a = 5, b;
b = a++ +1; //a++ 是在算式的最后才运算的
console.log(a, b); //6,6 //b = a + 1; 然后a++; 相当于b=1 + a++;。
var a = 5, b;
b = ++a +1;
console.log(a, b); //6, 7
var a = 5, b;
b = a-- + --a;
console.log(a, b); //3, 8 //a--的--是放在整个算式赋值后才运行的。
(相当于 b = --a + a--, 所以结果是 a = 3, b = 4+4 =8)。
var a = 5, b;
b = --a + --a;
console.log(a, b); //3, 7
==
1 == '1' //true //相等是不看类型的。
1 === '1' //false //全等类型也要相等。
NaN == NaN //false //NaN不等于包括它自己的任何东西。
a = !a; //把非a赋值给a。
a != a; //a不等于a。false
逻辑运算符规则:|| 假就往后走,遇到真就返回真的值。都为假就返回最后值。&& 真就往后走,假就返回假的值。都为真就返回最后一个值,
在开发中应用|| :给参数和变量赋默认值。
var name ='';
console.log(name || '未找到数据');
点击事件兼容写法:
btn.onclick = function(ev){
var e = ev || window.event; //如果走后,则是IE低版本
var tar = e.target || e.srcElement;
}
if和if else的使用场景:如果互斥条件要if else。不互斥可分开写。
if switch的使用场景:switch: 单条件,多个定值。if: 判断范围值 多条件时。
else if的使用场景:全部条件都互斥时,用else if。
判断条件的逻辑完整性:写代码要注意逻辑的完整性!!尽量将每个情况都考虑到。
js输入输出方法:输入:window.prompt('输入提示内容'),弹框输入。输出:console.log(''),控制台打印。document.write(''),文档输入,插入在body的最后。console.info()。
JS考题:
1. 解释var c = (a + b) * d; 的过程:1. 声明变量c。2. 括号运算a+b。3. *d。4. 计算结果赋值给c。
2. 打印1到100的数,()只有一句,{}里不能出现i++, i--:
方法1:
var i = 100;
for(; i-- ;){
console.log(i);
}
//打印0到100的数,()只有一句,{}里不能出现I++, i--
方法2:
var i = 1,
sum =100;
for(; i ;){
console.log(sum--);
sum == 0 && i = 0;
}
方法3:
var i = 100;
for(; i-- ; ) {
console.log(100 - i);
}
3. 把789变成987编程题:
方法1:
var num = 789;
var num2 = +(num + '').split('').reverse().join('');
console.info(num2);
方法2:
var num = 789;
var a = num % 10;
var b = (num - a) % 10;
var c = (num - a - b * 10) /100;
console.log("" + a + b + c);
方法3:
var num = 789;
var a3 = num % 10,
a2 = (num - a3) % 100 / 10,
a1 = (num - a3 - a2 * 10) % 1000 / 100;
console.info('' + a1+ a2+ a3);
4. 打印100以内的质数
//仅被1和自己整除的数
for(var i = 2; i < 100; i++){ //从2开始,1不是质数
var flag = 0;
for(var j = 1; j <= i; j++){
if(i % j == 0){
flag++;
}
}
if(flag == 2){
console.log(i);
}
}
//思路,从2开始。外层循环范围,内层循环数量(从1循环到自身),判断flag标记仅为2时,判断是质数并输出。
5. 以下表达式a的值是?为什么?
var a = 1 && 2;
//2, 都为真就返回最后一个值,有假就返回假的值。逻辑运算符规则:|| 假就往后走,都为假就返回最后值,遇到真就返回真的值。&& 真就往后走,都为真就返回最后一个值,有假就返回假的值。
6. 只用a,b两个变量交换值:
a = a + b
b = a - b
a = a - b