JS基础(二)-数据类型转换、运算符、流程控制、数组
数据类型转换
将其它类型转换为字符串
- 调用被转换数据类型的toString()方法
-
代码举例:
var num1 = 10; var res1 = num1.toString(); console.log(res1); // 10 console.log(typeof res1); // String var num2 = true; var res2 = num2.toString(); console.log(res2); // true console.log(typeof res2); // String
-
null和undefined这两个值没有toString()方法,如果调用他们的方法,会报错
var num3 = undefined; var res3 = num3.toString(); // 报错 console.log(res3); var num4 = null; var res4 = num4.toString(); // 报错 console.log(res4); var num5 = NaN; var res5 = num5.toString(); console.log(res5); // NaN console.log(typeof res5); // String
- 该方法不会影响到原变量,它会将转换的结果返回
-
数值类型的toString(),可以携带一个参数,输出对应进制的值
var num7 = 20; var res7 = num7.toString(2); var res8 = num7.toString(8); var res9 = num7.toString(10); var res10 = num7.toString(16); console.log(res7); // 10100 console.log(res8); // 24 console.log(res9); // 20 console.log(res10); // 14
-
- 将被转换的数据传入String()函数中
- String()函数存在的意义:
- 有些值没有toString(),这个时候可以使用String()。比如:undefined和null
-
对于Number和Boolean实际上就是调用的toString()方法
var num1 = 10; var res1 = String(num1); console.log(typeof res1); // String var num2 = true; var res2 = String(num2); console.log(typeof res2); // String
-
对于null和undefined,就不会调用toString()方法(因为这两个没有这个方法).而是在内部生成一个新的字符串
var num3 = undefined; var res3 = String(num3); console.log(res3); // undefined console.log(typeof res3); // String var num4 = null; var res4 = String(num4); console.log(res4); // null console.log(typeof res4); // String
- String()函数存在的意义:
- 将被转换的数据和+”“连接到一起
- 任何数据和 +”” 连接到一起都会转换为字符串
-
内部实现原理和String()函数一样
var num1 = 10; var res1 = num1 + ""; console.log(res1); // 10 console.log(typeof res1); // String var num2 = true; var res2 = num2 + ""; console.log(res2); // true console.log(typeof res2); // string var num3 = undefined; var res3 = num3 + ""; console.log(res3); // undefined console.log(typeof res3); // string var num4 = null; var res4 = num4 + ""; console.log(res4); // null console.log(typeof res4); // string
将其它类型转换为Number类型
- 将被转换的数据传入Number()函数中
- 字符串 –> 数字
- 如果是纯数字的字符串,则直接将其转换为数字
- 如果字符串中有非数字的内容,则转换为NaN
- 如果字符串是一个空串或者是一个全是空格的字符串,则转换为0
- 布尔 –> 数字
- true 转成 1
- false 转成 0
- null –> 数字 –> 0
-
undefined –> 数字 –> NaN
var str1 = "123"; var res1 = Number(str1); console.log(res1); // 123 console.log(typeof res1); // number var str2 = "123ab"; var res2 = Number(str2); console.log(res2); // NaN var str3 = ""; var res3 = Number(str3); console.log(res3); // 0 var str4 = " "; var res4 = Number(str4); console.log(res4); // 0 var bool1 = true; var res5 = Number(bool1); console.log(res5); // 1 var bool2 = false; var res6 = Number(bool2); console.log(res6); // 0 var str5 = null; var res7 = Number(str5); console.log(res7); // 0 var str6 = undefined; var res8 = Number(str6); console.log(res8); // NaN
- 字符串 –> 数字
- 将被转换的数据传入parseInt()函数中/parseFloat()函数中
- Number()函数中无论混合字符串是否存在有效整数都会返回NaN
- 利用parseInt()/parseFloat()可以提取字符串中的有效整数
- 两者之前的区别是前者只能提取整数,后者可以提取小数
- parseInt()提取字符串中的整数
- 从第一位有效数字开始, 直到遇到无效数字
- 如果第一位不是有效数字, 什么都提取不到, 会返回NaN
- 第一个参数是要转换的字符串,第二个参数是要转换的进制
- parseFloat提取字符串中的小数
- 会解析第一个. 遇到第二个.或者非数字结束
- 如果第一位不是有效数字, 什么都提取不到
- 不支持第二个参数,只能解析10进制数
- 如果解析的内容里只有整数,解析成整数
- 对非String使用parseInt()或parseFloat(), 会先将其转换为String然后在操作
var str7 = "300px"; var res9 = parseInt(str7); console.log(res9); // 300 var str8 = "300px250"; var res10 = parseInt(str8); console.log(res10); // 300 console.log(parseInt("abc123")); //返回NaN,如果第一个字符不是数字或者符号就返回NaN console.log(parseInt("")); //空字符串返回NaN,Number("")返回0 var str9 = "20.5px"; var res11 = parseInt(str9); console.log(res11); // 20 var str10 = "20.5.5.5px"; var res12 = parseFloat(str10); console.log(res12); // 20.5
进制转换
- 书写格式
- 二进制:需要以0b或者0B开头,比如0b101
- 八进制:在前面加个0,比如045
- 十六进制:在前面加个0x或者0X,比如0x45
JS中的运算符
- JS中的运算符跟C语言基本一样
- 不同点:
- 和C语言不同的是JavaScript中整数除以整数结果是小数
- 任何值和NaN做运算都得NaN
- 非Number类型的值进行运算时,会将这些值转换为Number然后在运算
- 任何的值和字符串做加法运算,都会先转换为字符串,然后再和字符串做拼串的操作
- 任何的值和字符串做- * / %法运算, 都会先将字符串转换为Number
-
取余运算m%n, n等于0 返回NaN, 其它和C语言一样
var res4 = 10 / 3; console.log(res4); // 3.3333 var result = 2 + NaN; console.log(result); //NaN var result = true + 1; // + - * / % console.log(result); // 2 result = true + false; console.log(result); // 1 result = 2 + null; console.log(result);// 2 var result = 1 + "123"; console.log(result); // 1123 result = 2 + "true"; console.log(result); // 2true var result = 2 - "1"; // - * / % console.log(result); // 1 result = "2" - "1"; console.log(result); // 1 var result = 10 % 0; console.log(result); // NaN
- 关系运算符
- 和C语言不同的是, JavaScript中的关系运算符只会返回true或false
- 对于非数值进行比较时,会将其转换为数字然后在比较
- 如果符号两侧的值都是字符串时,不会将其转换为数字进行比较, 而会分别比较字符串中字符的Unicode编码
-
null、undefined 、NaN比较
console.log(null == 0); // false console.log(undefined == 0); // false // 永远不要判断两个NaN是否相等 console.log(NaN == NaN); // false /* * 可以通过isNaN()函数来判断一个值是否是NaN * 如果该值是NaN则返回true,否则返回false */ var num = NaN; console.log(isNaN(num)); // true // undefined 衍生自 null, 所以返回true console.log(null == undefined); // true; console.log(null === undefined); // false; // == 判断值是否相等 // == 会进行数据类型转换 console.log("123" == 123); // true // === 判断值和类型时候同时相等 // === 不会进行数据类型转换 console.log("123" === 123); // false
-
逻辑运算符(!、&&、 ) - 对于非Boolean类型的数值, 逻辑运算符会将其换为Boolean类型来判断
- 逻辑与
- 如果条件A不成立, 则返回条件A的数值本身
-
如果条件A成立, 不管条件B成不成立都返回条件B数值本身
result = null && 0; console.log(result); // null var result = "123" && "abc"; console.log(result); // "abc" result = "123" && 0; console.log(result); // 0
- 逻辑或
- 如果条件A不成立, 则不管条件B成不成立都返回条件B数值本身
-
如果条件A成立, 则返回条件A的数值本身
var result = null || 0; console.log(result); // 0 result = "123" || "abc"; console.log(result); // "123" result = "123" || 0; console.log(result); // "123"
JavaScript流程控制
JavaScript中流程控制的概念和C语言中一样,也有顺序结构、选择结构和循环结构
- 选择结构if注意点:
- C语言中的代码块可以用于控制变量的作用域, 但是JavaScript中的代码块不行
{ var name = "123"; } console.log(name); // 123
- C语言中的代码块可以用于控制变量的作用域, 但是JavaScript中的代码块不行
- Switch注意点
- case全等于问题
-
JavaScript中case判断是否相等时是全等于(===),而不是等于(==),也就是说既会判断类型是否相等又会判断值是否相等
var str = "123"; switch (str){ case 123: console.log("123数字"); break; case "123": console.log("123字符串"); // 输出123字符串 break; default: console.log("default"); break; }
-
和C语言不同的是, JavaScript中case后可以是常量也可以是变量
var num = 120; switch (120){ case num: // 这里可以是变量 console.log("120"); // 输出120 break; case 110: // 这里可以是常量 console.log("110"); break; default: console.log("default"); break; }
-
- case全等于问题
- while循环注意点
- JavaScript中dowhile循环和C语言中一模一样
- for循环注意点
- JavaScript中for循环和C语言中一模一样
- 三大跳转
- JavaScript中没有提供C语言中的goto语句, 但是其它的三大跳转和C语言中一模一样
- return
- 立即结束所在函数
- break
- 立即跳出所在switch语句或循环语句, 离开作用范围没有意义
- continue
- 立即跳出所在循环语句, 离开作用范围没有意义
JavaScript数组
- JavaScript中数组的概念和C语言几乎一样, 都是指一组有序数据集合
- 不同的是由于JavaScript是弱语言, 所以JavaScript的数组中可以存放不同类型的数据
- 不同的是JavaScript中的数组是引用类型, 提供了很多便捷的属性和方法, 让我们使用起来更加简单
-
定义数组
var arr1=new Array(); var arr2=new Array("Saab","Volvo","BMW"); var arr2=new Array(3); var arr3=[]; var arr4=["Saab","Volvo","BMW"];
-
使用数组
var arr1 = new Array(); arr1[0] = 1; arr1[1] = "12"; arr1[2] = true; console.log(arr[0]); console.log(arr[1]); console.log(arr[2]);
-
数组的增删改查
var arr1 = new Array(); // 数组追加新增一条数据,res返回新增后的数组长度 let res = arr.push(3); // 追加多个数据 arr.push(4,5); // 数组最前面插入一条数据 arr.unshift(1); // 插入2条数据 arr.unshift("m","n"); // 删除数组最后一条数据,res:删除的数据 let res2 = arr.pop(); // 删除数据最前面一条数据 arr.shift() // 删除索引为1的数据 // 从索引为1的元素开始删除,删除1条数据 // 参数1,开始位置,参数2:删除多少个 arr.splice(1,1);
- 注意点:
- C语言中的数组必须在定义时确定长度, 后续不可修改
-
而JavaScript中的数组不需要在定义时确定长度, 后续可以动态增长
let arr = new Array(3); arr[0] = 0; arr[1] = 1; arr[2] = 2; // 动态添加数组长度 arr[3] = 3; // [0,1,2,3,4] console.log(arr)
- 和其他编程语言不同,如果数组对应的索引中没有存储数据,默认存储的就是undefined
- JS中访问了数组中不存在的索引不会报错,会返回undefined
- 其他编程语言一旦超出索引返回就会报错或者返回脏数据
let arr = new Array(3); // 不会报错,返回undefined console.log(arr[66])
- JS数组的分配存储空间不一定是连续的
- 分配在堆上,不是连续空间
-
数组遍历
var arr3 = [1, "123", true]; for(var i = 0; i < arr3.length; i++){ console.log(arr3[i]); }
- 注意点:
- JavaScript中可以通过数组的length属性直接获取数组的长度, 不用像C语言一样额外计算
- 注意点:
- 数组解构赋值
- 结构赋值是ES6中新增的一种赋值方式
-
数组解构赋值
// 解构赋值 let arr = [1,3,5]; // let a = a[0]; // let b = a[1]; // let c = c[2]; // ES6结构赋值 let [a,b,c] = arr; console.log("a="+a); console.log("b="+b); console.log("c="+c);
- 注意:
- 在数组解构赋值中,等号左边的格式必须和等号右边的格式一模一样,才能够完全结构
- 在数组解构赋值中,左边的个数可以和右边的个数不一样
- 如果右边的个数和左边的个数不一样,那么我们可以给左边设置指定默认值
-
使用ES6中新增的扩展运算符(
...
)来打包剩余的数据let [a,b] = [1,3,5]; let [a,b,c] = [3]; //设置默认值 let [a,b=4, c=5] = [3]; //扩展运算符,只能写在最后一个变量的前面,而且不能有逗号 let [a,...b] = [1,3,5]; // 1 console.log("a="+a); // [3,5] console.log("b="+b);
-
数组常用方法
// 数组常用方法 let arr = [1,2,3,4,5,6,7,8,9]; // 1. 清空数组 // arr = []; // arr.length = 0; // arr.splice(0,arr.length); // 2. 数组转字符串 let arrstr= arr.toString(); // 3. 将数组转换为指定格式的字符串 // join无参数时,跟toString一样 // let arrStr2 = arr.join(); // 1+2+3... let arrStr3 = arr.join('+'); // 4. 数组拼接 let arr1 = [1,3,5]; let arr2 = [2,4,6]; // 生成一个新的拼接数组 // let newarr = arr1.concat(arr2); // ES6语法拼接 let newarr2 = [...arr1,...arr2]; // 5. 数组内容反向排序 // 注意:该方法会修改原有数组 let arrrever = arr.reverse(); // [9,8,7,...] console.log(arrrever); // [9,8,7,...] 原有数组被修改 console.log(arr); // 6. 截取数组中指定位置数据 // 左开右闭区间。不包含结束位置 // [1,2,3,4,5]=>[2,3] let arrslice = arr.slice(1,3); // 7. 查找元素在数组中的位置 // 找到,index为索引 反之,index为-1,如果有多个,默认返回从左到右第一个索引 let index = arr.indexOf(3); // 参数1:要查找的数据。参数2:从哪个索引开始查找 let index2 = arr.indexOf(3,4); // 从右到左查找 let index3 = arr.lastIndexOf(3); // 8. 如何判断数组中是否包含某个元素 // 方法1:可以通过7的方法查找,判断index是否为-1 // 方法2:ES6语法 let find = arr.includes(4);