1、循环
1)for
循环
// 1、声明变量且赋值 2、判断条件 3、条件自加
for (var i = 0; i < 10; i++) {
console.log(i);
}
在for
循环的初始化代码中,其实是可以不使用变量声明关键字的。不过,初始化定义的迭代器变量在循环执行完成后几乎不可能再用到了。
// 无穷循环
for (;;) {
doSomething();
}
for
循环的执行过程可以拆分为:
- 声明变量
var i = 0;
- 判断条件
i < 10;
- 变量自加
i++
- 判断条件…(下一轮)
- …
根据执行过程可以将for
循环拆分成:
var i = 0;
for(;i<10;){
console.log(i)
i++
}
这里插入一到面试题: 用 for 循环输出 0-100 的数字,() 只能有一句,不能写比较,{} 不能出现 i++ 或者i—
var i = 100; // 从 100 开始自减
// () 只能有一句,不能写比较,所以我们要考虑判断条件
// 当 100 自减到 0 的时候就会判断 0 为 false
// {} 不能出现 i++ 或者i-- ,所我我们只能将 i-- 放到 () 中
for (; i--; ) {
console.log(i);
}
2)while
循环
先判断循环条件,再执行循环体内的代码。
while (i < 10) {
console.log(i);
i++;
}
3)do...while...
循环
不在乎循环条件是否成立都会先执行一次,然后再判断循环条件。
do {
console.log("执行")
} while (condition);
4)终止循环break
和continue
语句为执行循环代码提供了更严格的控制手段。break
语句用于立即退出循环,强制执行循环后的下一条语句。continue
语句也用于立即退出循环,但会再次从循环顶部开始执行。
for (let i = 1; i < 10; i++) {
if (i == 5) {
break;
}
console.log(i) // 1 2 3 4
}
for (let i = 1; i < 10; i++) {
if (i == 5) {
continue;
}
console.log(i) // 1 2 3 4 6 7 8 9
}
2、引用值初识
JS
中「引用数据类型」有:Object
、Array
、Function
、Date
、RegExp
Array
的基本使用:
var arr = [1,2,3,4,5];
arr[0];
arr[3] = null;
arr.length; // 5
Object
的基本使用:
var obj = {
name:"Job",
age:18
}
obj.height = 180;
obj.name; // "Job"
3、typeof 数据检测
typeof
用来确定任意变量的数据类型。对一个值使用typeof
操作符会返回下列字符串之一:
// typeof(123) 和 typeof 123 是一样的。
console.log(typeof 123); // number
console.log(typeof "123"); // string
console.log(typeof true); // boolean
console.log(typeof undefined); // undefind
console.log(typeof null); // object
console.log(typeof {}); // object
console.log(typeof []); // object
console.log(typeof function () {}); // function
根据以上的输出可以看出:Object
、Array
、Function
都属于object
类型。
可是null
为什么也属于object
呢?
这是一个历史遗留问题,因为特殊值null
被认为是一个对空对象的引用。
面试题: console.log(typeof a); // string console.log(typeof typeof a) // string 记住 typeof 的返回值是 String 类型!!!
4、显示类型转换
显示类型转换主要有:Number
、String
、Boolean
Number 类型
1) Number()
console.log(Number("123")); // 123
console.log(Number("true")); // NaN,非字符串数字返回 Not a Number
console.log(Number(null)); // 0,记住!!!
console.log(Number(undefined)); // NaN,记住!!!
console.log(Number(true)); // 1
console.log(Number(false)); // 0
2) parseInt()
只要不是数字和字符串数字全部返回NaN
如果第一个字符不是数字,立马返回NaN
如果第一个字符是数字,或者+
、-
则继续检测每个字符,直到遇到非数字或者末尾
console.log(parseInt("123")); // 123
console.log(parseInt("abc123")); // NaN
console.log(parseInt("123abc")); // 123
console.log(parseInt("")); // NaN
console.log(parseInt(3.5)); // 3.5
console.log(parseInt(true)); // NaN
console.log(parseInt(null)); // NaN
console.log(parseInt(undefined)); // NaN
console.log(parseInt(NaN)); // NaN
parseInt()
还支持第二个参数,指定要转换的数据进制。
// 16进制:0123456789abcdef
// 2进制:01
// 10进制:0123456789
var a = "b";
console.log(parseInt(a, 16)); // 11,因为b在16进制中11的位置
3) parseFloat()parseFloat()
转换的规则和paresInt()
一样
console.log(parseFloat("3.1415926")); // 3.1415926
console.log(parseFloat("3.1415acb926")); // 3.1415
console.log(parseFloat(3)); // 3
总结:parseInt()
和parseFloat()
更专注字符串数字,而Number()
会尝试将各种数据类型转换成Number
类型。
4) isNaN()
该函数接收一个参数,可以是任意数据类型,然后判断这个参数是否“不是数值”。把一个值传给isNaN()
后,该函数会尝试把它转换为数值。某些非数值的值可以直接转换成数值,如字符串”10”或布尔值。任何不能转换为数值的值都会导致这个函数返回true
console.log(isNaN(NaN)); // true
console.log(isNaN(10)); // false,10 是数值
console.log(isNaN("10")); // false,可以转换为数值10
console.log(isNaN("blue")); // true,不可以转换为数值
console.log(isNaN(true)); // false,可以转换为数值1
NaN 不等于包括 NaN 在内的任何值。
console.log(NaN == NaN); // false
String 类型
1) toString()
除了Null
和Undefind
几乎所有的值都有toString()
方法。
console.log(123.toString()); // "123"
console.log("123".toString()); // "123"
console.log(true.toString()); // "true"
var a = {};
a.toString() // '[object Object]'
var b = function(){}
b.toString() // 'function(){}'
var c = undefind;
c.toString(); // error
2) String()
如果不确定一个值是Undefind
或者Null
,可以使用String()
String(undefined) // "undefind"
String(null) // "null"
String(123) // "123"
String(true) // "true"
Boolean 类型
Boolean()
尝试将数据转换成Boolean
类型Boolea()
会将undefind
、null
、NaN
、""
、0
、false
转换成false
,其他的都是true
console.log(Boolean(1)); // true
console.log(Boolean(null)); // flase
console.log(Boolean(" ")); // true
console.log(Boolean("")); // false
5、隐式类型转换
明文意思就是不告诉你偷偷的转换。
哪些情况会偷偷转换呢?
-
、*
、/
、%
运算的时候会进行隐式类型转换:
var a = "123";
a++;
console.log(a); // 124,因为a会隐式转换成Number类型
var b = "45a";
b++;
console.log(b); // NaN
var c = "3" * 2;
console.log(c); // 5
>
、<
、>=
、<=
、==
比较的时候会进行隐式类型转换:
var a = "1" > 2;
console.log(a); // false,"1"转换成1,1 < 2= false;
var b = 1 > 2 > 3;
console.log(b); // false,1 > 2 = flase; flase 会被转化成 0,然后就是 0 > 3 = false;
var c = 2 > 1 == 1; // true,2 > 1 = true; true 会被转化成 1,然后就是 1 == 1 = true;
// 从某种意义上来说,undefind 和 null 都表示一个数据的空值。
var bool1 = undefind == null;
console.log(bool1); // true
// 严格来说,undefind 表示声明了一个值没有赋值的状态,null 表示一个空对象的占位
var bool1 = undefind === null;
console.log(bool1); // flase
===
不会进行类型转换,==
会进行类型转换。
在隐式类型转换中,undefind
和null
是个特殊的存在。null
在==
和!=
隐式类型转换的时候不会进行类型转换!!!点击访问
// undefind 在进行隐式类型转换的时候,Number(undefined)转换成 NaN
undefind == undefind; // true
undefind == 0; // false
undedind > 0; // false
undedind < 0; // false
undefind >= 0; // false
// null 在进行隐式类型转换的时候,Number(null)转换成 0
// null在 == 和 != 隐式类型转换的时候不会进行类型转换
null == null; // true
null == 0; // false
null != 0; // true
null > 0; // false
null < 0; // false
null >= 0; // true