一、循环
1、for循环的另一种写法
var i = 0;
for(; i < 10; ) {
console.log(i);
i++;
}
看上去其实就是while循环。所以我们清楚 ,for和while是可以互相转换的。
2、如果不用break、return如何终止循环?
for(; i; ) {
console.log(i);
i++;
if(i === 11) {
i = 0; //这里只是一个固定的场景,就是要把循环条件给弄成false
}
}
我们想方设法把for循环的终止条件弄为false就可以了。
3、一些面试题
// 打印0-100的数
// 要求:()内只能有一句语句
// {}中不能出现i++、i--
// 我们这道题必须是要有++或者--的,不能出现在{}中,那么只能出现在()中了
var i = 101; // 注意是101哈,因为第一步要先减一
for(; i--; ) { // 这里必须是使用i--后自减的方式哈,因为如果是前自减,那么就没办法打印0了
console.log(i);
}
// 用for循环计算10的n次方
var n = 5;
var num = 1; // 这里是1
for(var i = 0; i < n; i++) {
num *= 10;
}
// 翻转一个数,如45678 --> 87654
var invertNum = function(num) {
var res = 0; // 起始值是0,因为一开始是个位数*10必须要为0
for (; num;) {
res = res * 10 + (num % 10); // 乘10之后在把当前数的个位数加上
num = Math.floor(num / 10); // 去掉最后一位数
}
return res;
}
// 打印1-100以内的质数
var c = 0;
for (var i = 2; i <= 100; i++) {
// 从1到其自身遍历,i就是我们要判断是不是质数的数,所以用它来除以从1到其自身的数
// 如果刚好只有两个数能被其整除,那么这个数就是质数。
for (var j = 1; j <= i; j++) {
if (i % j === 0) {
c++;
}
}
if (c === 2) {
console.log(i);
}
c = 0; // 归零,为下一次做准备
}
二、Array、Object简单基本用法
1、Array基本用法
定义:var arr = [1, 2, 3, 4];
取值:arr[0];
修改值:arr[1] = 6;
遍历:for(var i = 0; i < arr.lengt; i++) {
console.log(arr[i]);
}
2、Object的基本用法
定义:var person = {
name: 'xxx',
age: 18
}
取值:person.name
修改值:person.name = xxx;
三、typeof方法
1、用法:
typeof(xxx) 返回字符串形式的类型。
2、有哪些值呢?
- 基本数据类型除了null之外,都是可以直接返回对应的类型的字符串。
- 引用数据类型除了Function之外都返回Object。
- null、Array都是Object。
- 补充:为什么null是Object类型呢?
- 这是一个历史遗留问题。一开始的null的意思是空对象。空对象指针。后来es6有很多人提议把typeof(null) 输出为null类型,而不是object类型。但是被拒绝了。因为已经开发了那么多程序,已修改的话很多很多程序都用不了。
3、一道题
前面如果没有定义a,那么如下代码会怎么输出?
console.log(a); // 直接报错,因为前面未定义。 console.log(typeof(a)); // 输出undefined。可以假装这个a是声明了 console.log(typeof(+)); // 直接报错。因为这个值不可作为变量被声明 console.log(typeof(typeof(123)); // 输出string,因为typeof返回的值的类型是string
四、显示类型转换
1、Number()
- Number('123') ==> 数字123
- Number('abc') ==> NaN
- Number(null) ==> 0
- Number(false) ==> 0 true为1
- Number(undefined) ==> NaN
- Number({}) ==> NaN
也就是除了null、Boolean、String,其他类型用Number显示转换的话都是NaN。String如果不是数字的话也是转换为NaN。
2、parseInt()
1、只能转换字符串和数字类型,其余全部为NaN
- parseInt(3.14) ==> 3 (直接去掉小数部分而非四舍五入)
- parseInt('3.14') ==> 3
- parseInt('123abc') ==> 123 (会先读取前面的数字,然后转换,遇到字符串则把后面的字符串都丢掉)
- parseInt('abc123') ==> NaN (字符串后面的数字全部扔掉,也就是全部扔了,所以是NaN)
- parseInt('abc') ==> NaN
- parseInt(undefined) ==> NaN
- parseInt(null) ==>NaN
- parseInt(false) ==> NaN
2、parseInt还有第二个参数,radix,基数的意思,取值范围为2-36
如:parseInt('10', 16) ==> 16 // 就是这个字符串本来就是16进制,把转换为整数的同时,还要把他转换为十进制。
parseInt('a', 16) ==> 10
parseInt('4', 2) ==> NaN // 因为2进制里不可能出现4
3、parseFloat()
- 这个比较简单,跟parseInt一样。但是他后面没有第二个参数了,直接转为float
- 如果想要保存为小数点后几位的小数,那么可以使用toFixed()方法(会四舍五入)。
- 如: parseFloat('3.1415926').toFixed(2) ==> 3.14
4、String()
String就没什么可讲了,里面放啥东西都能变成string类型。
5、toString()
1、str.toString(),也是可以转换为字符串
2、与String()不一样的是,undefined和null不可以使用这个方法。会报错。
3、该方法也是有一个参数的,也是radix。他的意思是转换为多少进制的字符串。
如:
var a = 100;
a.toString(16) ==> '64' // 将100转换为16进制了。
6、Boolean()
除了undefined、null、''、NaN、0、false这六种是false以外,其他全部都是true。
五、隐式类型转换
1、自增(++)、自减(--)发生的隐式转换 Number()
在进行++、--的时候会自动发生隐式转换Number()
如:var a= '123';
a++; // 此时的a为124
2、字符串和数字相加(+)发生的隐式转换 String()
如:var a = 'a' + 1; // 此时的a为'a1'
3、(*、/、-、%)这些运算符运算时发生的隐式转换 Number()
如:var a = '3' * '2' // 此时a为6
4、比较运算符(>、<、==、!=)进行运算时发生隐式转换 Number()
如:'1' > 2 // 此时返回的是false,因为'1' 会被隐式转换为数字1
注意:
这里的比较运算符是其中一边是数字,另外一边是字符的方式才能进行Number()隐式转换哈,如果两边都是字符,如'a' > 'b'这种,是会自动根据ASCII的值来进行比较的。
5、(===、!==)运算符不会发生隐式转换
6、NaN不与任何值相等,包括其自身。
NaN == NaN // false
NaN === NaN // false
7、undefined与null之间的关系
undefined == null // true
undefined === null // false
注意:他们两个都不与0扯上关系
undefined == 0 // false
undefined > 0 // false
undefined < 0 // false
null == 0 // false
null > 0 // false
null < 0 // false
8、关于正负号(+、-)的隐式转换,注意不是加减
如:
var a = '123';
+a; // 返回Number类型的123
-a; // 返回Number类型的-123
9、一些练习
1、a1 = 2 > 1 > 3;
返回false,因为2 > 1 返回1,1 > 3 false
2、a2 = 2 > 1 == 1;
返回true,因为2 > 1 返回1,1 == 1 true
六、isNaN() 方法
作用:用来判断一个数是不是NaN。
请注意:
1、NaN的意思是not a number,不是一个数字。
2、isNaN() 会自动发生隐式转换,Number()
请认真观看下面的案例,要完全记下来的。只要记得Number转换之后的值是不是NaN就OK了。
- isNaN(NaN) // true
- isNaN(123) // false,因为123是数字
- isNaN('123') // fasle,因为他是字符串,但是会发生隐式转换,所以转换成了123,是一个数字,所以不是NaN
- isNaN('a') // true,因为Number('a') 会转换为NaN,isNaN刚好就判断出来是NaN,那肯定是true。
- isNaN(undefined) // true,因为Number(undefined)会转换为NaN
- isNaN(null) // false,因为Number(null)会转换为0