简述数据类型
JS,python是一门拥有动态类型的语言
name='jh'
name=100
name=[1,2,3,4]
# name可以指向任意的数据类型,但是有一些语言中,变量名只能指向一种后不能更改
。
。
(python与JS对照)
【JS数据类型】
-
简单数据类型:Number、String、undefined、Boolean、null(数据类型是object)
-
复杂数据类型:Object、array
一.【数值类型number】
特殊的 NaN:数值类型,表示的意思是“不是一个数字” not a number
二.【字符串类型string】
模板字符串除了可以定义多行文本之外还可以实现格式化字符串操作
书写$会自动去前面找大括号里面的变量名对应的值,如果没有定义直接报错, $相当于占位符
。
。
【对象(object)】
对象之数组(Array)常用方法:
类似于python中的列表
1 js中一切皆对象!!! 2 ----------------------------------------------- 3 定义方式 let l1 = [] 4 -------------------------- 5 数组常用方法: 6 let l1 = [11,22,333,4] 7 --------------------------- 8 typeof l1 9 'object' 10 ------------------------ 11 l1[1] # 索引取值 12 22 13 --------------------- 14 l1.length 15 4 16 -------------------------------------------------- 17 l1.push(55) # 尾部追加元素 18 l1.push([66,7]) # 尾部追加元素 19 [11, 22, 333, 4, 55, Array(2)] 20 ------------------------------------------------ 21 l1.unshift(99) # 头部插入元素 22 [99, 11, 22, 333, 4, 55, Array(2)] 23 --------------------------------------------- 24 l1.shift() # 头部移除元素 25 [11, 22, 333, 4, 55, Array(2)] 26 -------------------------------------------- 27 l1.slice(2,5) # 切片 28 [333, 4, 55] 29 ------------------------------------------- 30 l1.reverse() # 翻转 31 [Array(2), 55, 4, 333, 22, 11] 32 ------------------------------------------ 33 l1.join('|') # 将数组里面的元素连接成字符串 34 '66,7|55|4|333|22|11' 35 ------------------------------------------- 36 l1.concat([123,456]) # 连接数组 37 [Array(2), 55, 4, 333, 22, 11, 123, 456] 38 ----------------------------------------- 39 l1.sort() # 数组里面的数据排序 40 [11, 22, 333, 4, 55, Array(2)] 41 ------------------------------------------- 42 forEach() # 将数组里面的每一个元素传递给回调函数进行处理 43 forEach(function(currentValue, index, arr), thisValue) 44 45 let l1 = [11,22,333,4] 46 l1.forEach(function(a){console.log(a)}) 47 # 类似于python的for循环,并执行for循环的函数体代码,相当于一个内置的简易的for循环 48 11 49 22 50 333 51 4 52 53 l1.forEach(function(a,b){console.log(a,b)}) 54 # b参数 相当于是一个索引 还可以再加一个参数c 被循环的数组本身 55 11 0 56 22 1 57 333 2 58 4 3 59 ------------------------------------------------- 60 splice() 删除元素,并向数组添加新元素,要加多个元素要用列表包起来 61 splice(index,howmany,item1,.....,itemX) 62 63 let l1 = [11,22,333,4] 64 65 l1.splice(0,1) # 第一个参数是索引,第二个参数是从该索引位置往后删除的数据个数!!! 66 [11] 67 l1的结果是 [22, 333, 4] 68 69 l1.splice(0,2) 70 [22, 333] 71 l1的结果是 [4] 72 73 let l1 = [11,22,333,4] 74 l1.splice(0,8,['jack','jason','jocker']) # 总共就4个,我要删8个,那就是都删掉 75 l1的结果是 [Array(3)]就是['jack', 'jason', 'jocker'] 76 ---------------------------------------------------- 77 map() 映射 78 let l1 = [11,22,333,4] 79 l1.map(function(a){return a+1}) 80 l1结果是 [12, 23, 334, 5] 81 -------------------------------------------------
(tostring\valueof\indexof\lastindex方法)
(every和some方法)
(forEach)
(splice)
(map)
对象之自定义对象(Object)常用方法:
类似于python的字典
1 定义方式1: 2 let d1 = {'name':'jason',} 3 定义方式2: 4 let d2 = new Object(); # 产生一个空对象就是一个空字典 5 ------------------------------ 6 let d1 = {'name':'jason',} 7 d1['name'] 8 'jason' 9 d1.age = 18 10 d1.hobby = 'read' 11 d1结果是 {name: 'jason', age: 18, hobby: 'read'} 12 ------------------------------- 13 let d2 = new Object() # 产生一个空对象就是一个空字典 14 d2.name = 'jason' 15 d2.age = 19 16 d2结果是 {name: 'jason', age: 19}
三.【布尔类型(Boolean)】
1 JS里面的布尔值与Python不同 2 JS是纯小写的 而Python是首字母大小 3 4 ---------------------------------------------------------- 5 typeof true 6 'boolean' 7 typeof false 8 'boolean' 9 10 typeof True # js不识别大写字母开头的True 11 'undefined' 12 13 ""(空字符串)、0、null、undefined、NaN 对应的布尔值都是false
null与undefined
null表示值为空(曾经拥有过)
undefined表示没有定义(从来没有过)
null表示值是空,一般在需要指定或清空一个变量时才会使用,如 name=null;
undefined表示当声明一个变量但未初始化时,该变量的默认值是undefined。还有就是函数无明确的返回值时,返回的也是undefined。
null 有但是用完了!!!
undefined表示没有定义(从来没有过)
四.【运算符】
算数运算符:++类似于:+=1
1 1.算术运算符 2 + - * / %取余 ++(自增1) --(自减1) 3 var x=10; 4 var res1=x++; 加号在后面 注意是:x先赋值给res1后,再自增11 5 var res2=++x; 加号在前面 注意是:x先自增1后,再赋值给res2 6 res1结果是10 res2结果是12 7 --------------------------------------- 8 2.比较运算符 9 10 !=(值不等 弱不等于) ==(值相等 弱等于) 11 12 !==(值不等 强不等于) ===(值相等 强等于) 13 14 ps:会不会自动转换类型 15 16 5=='5' 17 true # js里面会自动把不同的数据类型转为相同的数据类型,再去判断 18 19 5==='5' 20 false # 直接判断了 21 ---------------------------------------- 22 3.逻辑运算符 23 &&(与) 24 ||(或) 25 !(非)
五.【流程控制】
()是条件,{}是代码块,相当于python中的print
1 1.单if分支 2 if (条件){条件成立执行的代码} 3 ---------------------------------------------------- 4 2.if...else分支 5 if(条件){条件成立执行的代码}else{条件不成立执行的代码} 6 ---------------------------------------------------- 7 3.if...else if...else分支 8 if(条件1){条件1成立执行的代码} 9 else if(条件2){条件1不成立条件2执行的代码} 10 else{条件1和2都不成立执行的代码} 11 --------------------------------------------------- 12 4.如果分支结构中else if很多还可以考虑使用switch语法 13 switch(条件){case 条件1: 14 条件1成立执行的代码;break; 15 case 条件2: 16 条件2成立执行的代码;break; 17 case 条件3: 18 条件3成立执行的代码;break; 19 case 条件4: 20 条件4成立执行的代码;break; 21 default: 22 条件都不满足执行的代码 23 } 24 # 如果没有break,匹配到某一个case后,会基于某个case一直执行下去 比如: 25 var day= 0 26 switch(day){case 0:console.log('sunday'); 27 case 1:console.log('monday'); 28 case 2:console.log('tuesday'); 29 case 3:console.log('wednesday'); 30 case 4:console.log('thursday'); 31 default:console.log('...'); 32 } 33 结果是: 34 sunday 35 monday 36 tuesday 37 wednesday 38 thursday 39 ... 40 ------------------------------------------- 41 for循环 当对列表做for循环()括号里面要写3个参数 但是对字典做for循环时()括号里面可以就写一个参数就行了!!! 42 43 for(起始条件;循环条件;条件处理){循环体代码} 44 45 for(let i=0;i<10;i++){console.log(i)} 46 例如:for循环数组 47 let l1 = ['jack','jason','kevin','oscar','mark','john','tom'] 48 for (i=0;i<l1.length;i++){console.log(l1[i])} 49 ------------------------------------------- 50 for循环字典: 51 let dd = {'name':'jason','age':18} 52 for(let k in dd){console.log(k)} # 拿键 53 name 54 age 55 56 for(let k in dd){console.log(dd[k])} # 拿值 57 jason 58 18 59 ------------------- 60 for(let k in dd){console.log(dd.k)} # 这样好像不行!!因为键是字符串!!!用点的方式只能点名字,不能点字符串!!! 61 -------------------------------------------- 62 while循环 63 64 while(循环条件){循环体代码} 65 -------------------------------------------- 66 """ 67 三元运算 68 python中: 值1 if 条件 else 值2 69 JS中: 条件?值1:值2 70 """
补充 (for of 方法
)
六.【函数】
1 python中函数的定义 2 def 函数名(形参): 3 函数体代码 4 return 返回值 5 '''函数注释''' 6 ---------------------------------------------- 7 js中函数的定义: 8 function 函数名(形参){ 9 函数体代码 10 return 返回值 11 // 函数注释 12 } 13 14 ---------------------------- 15 # 匿名函数 不能单独出现!!! 16 var s1 = function(a, b){return a + b;} 17 var function(a, b){return a + b;} # 简化后 18 19 --------------------------- 20 # 箭头函数 => 箭头的左边是行参,右边是返回值!!! 21 用于一些比较简单的场景 22 23 # 一个行参的: 24 var f = function(v){return v;} 25 var f = v => v; # 简化后 26 27 # 无行参的: 28 var f = function(){return 5}; 29 var f = () => 5; 30 31 # 多个行参的: 32 var sum = (num1, num2) => num1 + num2; 33 var sum = function(num1, num2){return num1 + num2;} 34 35 ------------------------------------------------- 36 1.JS中函数的形参与实参个数可以不对应: 传少了就是undefined 传多了不用 37 38 2.函数体代码中有一个关键字arguments用来接收所有的实参 39 40 3.函数的返回值如果有多个需要自己处理成一个整体
(箭头函数语法,=> ES6里面的新语法
)
七.【自定义对象】
date对象
1 var d = new Date(); # 创建date对象 2 d.getDate() 获取日 3 d.getDay () 获取星期 4 d.getMonth () 获取月(0-11) 5 d.getFullYear () 获取完整年份 6 d.getYear () 获取年 7 d.getHours () 获取小时 8 d.getMinutes () 获取分钟 9 d.getSeconds () 获取秒 10 d.getMilliseconds () 获取毫秒 11 d.getTime () 返回累计毫秒数(从1970/1/1午夜)
json对象
1 let dd = {name: 'jason', age: 18} 2 JSON.stringify(dd) # 序列化 3 '{"name":"jason","age":18}' 4 5 let ss = '{"name":"jason","age":18}' 6 JSON.parse(ss) # 反序列化 7 {name: 'jason', age: 18}
正则
1 定义正则两种方式: 2 var reg1 = new RegExp("正则表达式"); 3 var reg2 = /正则表达式/; 4 5 var reg1 = new RegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}"); 6 var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/; 7 8 // 正则校验数据: 9 reg1.test('jason666') 10 reg2.test('jason666') 11 ------------------------------------------------- 12 ------------------------------------------------- 13 1.全局模式的规律 lastIndex 14 15 var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/g; # 加个g 就是全局匹配 16 有指针的概念,查到后会指在查到的数据的末尾,再匹配一次就是基于当前的指针位置继续往后匹配,如果查不到,指针会重新回到开头!!!所会出现一次匹配成功,一次匹配失败的现象 17 ------------------------------------------------- 18 小bug: 19 20 2.test匹配数据不传默认传undefined 21 var reg2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/; 22 reg2.test() # 对空用正则匹配也能匹配上 ,因为空默认传的就是undefined 23 true # undefined 正好有符合上面的正则表达式!! 所以就校验的结果就是true