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); // numberconsole.log(typeof "123"); // stringconsole.log(typeof true); // booleanconsole.log(typeof undefined); // undefindconsole.log(typeof null); // objectconsole.log(typeof {}); // objectconsole.log(typeof []); // objectconsole.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")); // 123console.log(Number("true")); // NaN,非字符串数字返回 Not a Numberconsole.log(Number(null)); // 0,记住!!!console.log(Number(undefined)); // NaN,记住!!!console.log(Number(true)); // 1console.log(Number(false)); // 0
2) parseInt()
只要不是数字和字符串数字全部返回NaN
如果第一个字符不是数字,立马返回NaN
如果第一个字符是数字,或者+、-则继续检测每个字符,直到遇到非数字或者末尾
console.log(parseInt("123")); // 123console.log(parseInt("abc123")); // NaNconsole.log(parseInt("123abc")); // 123console.log(parseInt("")); // NaNconsole.log(parseInt(3.5)); // 3.5console.log(parseInt(true)); // NaNconsole.log(parseInt(null)); // NaNconsole.log(parseInt(undefined)); // NaNconsole.log(parseInt(NaN)); // NaN
parseInt()还支持第二个参数,指定要转换的数据进制。
// 16进制:0123456789abcdef// 2进制:01// 10进制:0123456789var a = "b";console.log(parseInt(a, 16)); // 11,因为b在16进制中11的位置
3) parseFloat()parseFloat()转换的规则和paresInt()一样
console.log(parseFloat("3.1415926")); // 3.1415926console.log(parseFloat("3.1415acb926")); // 3.1415console.log(parseFloat(3)); // 3
总结:parseInt()和parseFloat()更专注字符串数字,而Number()会尝试将各种数据类型转换成Number类型。
4) isNaN()
该函数接收一个参数,可以是任意数据类型,然后判断这个参数是否“不是数值”。把一个值传给isNaN()后,该函数会尝试把它转换为数值。某些非数值的值可以直接转换成数值,如字符串”10”或布尔值。任何不能转换为数值的值都会导致这个函数返回true
console.log(isNaN(NaN)); // trueconsole.log(isNaN(10)); // false,10 是数值console.log(isNaN("10")); // false,可以转换为数值10console.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)); // trueconsole.log(Boolean(null)); // flaseconsole.log(Boolean(" ")); // trueconsole.log(Boolean("")); // false
5、隐式类型转换
明文意思就是不告诉你偷偷的转换。
哪些情况会偷偷转换呢?
-、*、/、%
运算的时候会进行隐式类型转换:
var a = "123";a++;console.log(a); // 124,因为a会隐式转换成Number类型var b = "45a";b++;console.log(b); // NaNvar 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)转换成 NaNundefind == undefind; // trueundefind == 0; // falseundedind > 0; // falseundedind < 0; // falseundefind >= 0; // false// null 在进行隐式类型转换的时候,Number(null)转换成 0// null在 == 和 != 隐式类型转换的时候不会进行类型转换null == null; // truenull == 0; // falsenull != 0; // truenull > 0; // falsenull < 0; // falsenull >= 0; // true
