JavaScript
JavaScript
一、如何编写
1.代码形式
标签<script type="text\javascript"></script> #type声明这是JavaScript代码,可以忽略
存在形式:①head的script标签②文件src引入本地js③远程src
④为了效率,放置body最下面
---------------
2.注释格式
单行//
多行/* */
2.简介
学习一门语言:从基本数据类型和基本语法开始
基本数据类型:数字、字符串、列表、字典、布尔类型
条件
循环
3.定时器:setInterval("alert(123);",5000) 每5秒执行一次函数
<script> function f1() { console.log(111); } setInterval("f1();",5000) </script>
4.js分号
实际为了节省容量,网络上一般使用min.js文件,通常都写一行,不加分号不能识别
二、变量
python: name='' JavaScript: name='' #默认全局变量 var name = '' #局部变量
三、数据类型
数字:
统一浮点数值表示
parseInt()将某值转换成数字
parseFloat()将某值转换成浮点型
字符串:
obj.length 长度 obj.trim() 移除空白 obj.trimLeft() obj.trimRight) obj.charAt(n) 返回字符串中的第n个字符 obj.concat(value, ...) 拼接,类似+ obj.indexOf(substring,start) 子序列位置 obj.lastIndexOf(substring,start) 子序列位置,倒着找 obj.substring(from, to) 根据索引获取子序列 obj.slice(start, end) 切片,两者差不多 obj.toLowerCase() 大写 obj.toUpperCase() 小写 obj.split(delimiter, limit) 以‘’进行分割 obj.search(regexp) 从头开始匹配,返回匹配成功的第一个位置(g无效) obj.match(regexp) 全局搜索,如果正则中有g表示找到全部,否则只找到第一个。 obj.replace(regexp, replacement) 替换,正则中有g则替换所有,否则只替换第一个匹配项, $数字:匹配的第n个组内容; $&:当前匹配的内容; $`:位于匹配子串左侧的文本; $':位于匹配子串右侧的文本 $$:直接量$符号
方法:在前端称为string,所有的方法都在String.prototype中
通过String.prototype.函数名 = function(){}能够自定义方法
布尔类型:
a = true #python中是小写
== 比较值相等
a = true #python中是小写 == 比较值相等 != 不等于 === 比较值和类型相等 !=== 不等于 || 或 && 且
列表(js中称数组):
a=[11,22] obj.length 数组的大小 obj.push(ele) 尾部追加元素,对比python中的append() obj.pop() 尾部获取一个元素 obj.unshift(ele) 头部插入元素 obj.shift() 头部移除元素 obj.splice(start, deleteCount, value, ...) 插入、删除或替换数组的元素 obj.splice(n,0,val) 指定位置插入元素 obj.splice(n,1,val) 指定位置替换元素 obj.splice(n,1) 指定位置删除元素 obj.slice( ) 切片 obj.reverse( ) 反转 obj.join(sep) 将数组元素连接起来以构建一个字符串,python中是''.join('alex') obj.concat(val,..) 连接数组 obj.sort( ) 对数组元素进行排序
字典:
{} #属于对象类型,但分model对象和普通字典,model对象通过[]获取,普通字典通过.操作
四、语句和异常
1.循环语句
for循环: ①循环的是索引,字典时是键key a=[11,22,33] for(var item in a){ console.log(item); #a[item] } ②标准循环,不支持字典 for(var i=0;i<a.length;i++){ #记得声明var a[i] } while循环: while(条件){ }
2.条件语句:
if( && ){ #对比python中是and,or对比是|| }else if(){ }else{} switch(name){ case '1': console.log() default : ... }
3.异常处理
try { //这段代码从上往下运行,其中任何一个语句抛出异常该代码块就结束运行 } catch (e) { // 如果try代码块中抛出了异常,catch代码块中的代码就会被执行。 //e是一个局部变量,用来指向Error对象或者其他抛出的对象 } finally { //无论try中代码是否有异常抛出(甚至是try代码块中有return语句),finally代码块中始终会被执行。 }
五、函数
1.基本函数
普通函数:function func(){} 匿名函数:setInterval("func()",5000) setInterval(function(){ console.log(123); },5000) 自执行函数: function func(){} func() #直接执行,这是主动执行 用途:引入多家网站js文件时,函数名func可能会重复,用匿名函数替代 (function(arg){ console.log(arg); })(1) #解析时自动执行,现大多数js文件都是这样,程序一到来自动执行
2.函数作用域
========================1.JavaScript的作用域为函数(let则是块级)======================================
其他语言:以代码块作为作用域
public void Func(){ if(1==1){ string name = 'Java' } console.writeline(name); } Func() #程序报错,以{}作为代码块
python:以函数作为作用域
def func(): if 1==1: name = 'alex' print(name) func() #能运行,以一个冒号一个缩进作为一个代码块,所以作用域不一样,python以函数作为作用域
JavaScript:以函数作为作用域
function func(){ if(1==1){ var name = 'sss'; } console.log(name); } func() #能执行
========================2.函数的作用域在调用前,已经创建======================================
即function编译时已经创建,func()调用的时候前
========================3.函数的作用域存在作用域链,且在被调用前已创建======================================
即嵌套函数作用域
例子一:
xo = 'alex' function func(){ var xo='eric'; function inner(){ var xo = 'tony'; console.log(xo); } inner() #输入xo变量从内到外的作用域找该变量,都没有就报错 }
例子二:
xo = 'alex' function func(){ var xo='eric'; function inner(){ console.log(xo); } return inner; #不加括号,返回函数 } var ret = func() #ret = inner 函数 ret() #输出eric,作用域在调用前已确定
例子三:
xo = 'alex' function func(){ var xo='eric'; function inner(){ console.log(xo); } var xo = 'tony' return inner; } var ret = func() ret() #输出tony,func的作用域xo先等于eric,后被替换为tony
========================4.函数内局部变量提前声明=======================
function func(){ console.log(xx); xx = 'alex'; } func(); #输出undefined,因为编译过程中生成作用域链的同时将内部的局部变量xx提前声明了, 但没赋值,执行时输出的xx已声明,还没赋值,故undefined。
3.面向对象及原型
JavaScript支持面向对象,是函数的一个变种 function foo(){ this.name = 'alex'; #①this即python中的self this.sayName = function(){ console.log(this.name); } } var obj = new foo() #②创建对象要添加new关键字 obj.name obj.sayName() #多个对象创建时内存会重复定义 python中: class Foo: def __init__(self,name): self.name = name def sayName(self): print(self.name) obj1 = Foo('we') obj2 = Foo('wee') #类中的方法只创建一次,保存在类中,引用时.sayName
解决:将函数的初始化(构造方法)与方法分离开。
function Foo(){ this.name = n; } #原型,用于存放方法的空间 Foo.prototype = { 'sayName':function(){ console.log(this.name) } } obj.sayName()执行时会在prototype中找
六、其他
1.JavaScript序列化及转义
a.将字典、数组转换为字符串 JSON.stringify(li) #对应python写法json.dumps() b.将字符串转换为字典、数组 JSON.parse() #更常用,平时从数据库拿数据得到的是字符串,对应python写法json.loads()
转义:特殊的符号如中文和\等,需要转为一串字符,通常用在js中向客户端保存数据如cookies、输入框内容时转义
客户端(保存cookies ) -> 服务器端
decodeURI( ) URl中未转义的字符,即解码 decodeURIComponent( ) URI组件中的未转义字符 encodeURI( ) URI中的转义字符,如url的搜索词中文 encodeURIComponent( ) 转义URI组件中的字符,除了中文,还转义所有除字母外的字符\=: escape( ) 对字符串转义,保存cookies时用 unescape( ) 给转义字符串解码 URIError 由URl的编码和解码方法抛出
一般的代码由python或者pycharm进行编码,不用转义。中文等特殊字符一定要编码。
2.自动登录抽屉并点赞(python代码实现,与js无关)
### 1、首先登陆任何页面,获取cookie(已经登录后,再去页面拿cookie) i1 = requests.get(url= "http://dig.chouti.com/help/service") ### 2、用户登陆,携带上一次的cookie,后台对cookie中的 gpsd 进行授权 i2 = requests.post( url= "http://dig.chouti.com/login", data= { 'phone': "86手机号", 'password': "密码", 'oneMonth': "" }, cookies = i1.cookies.get_dict() ) ### 3、点赞(只需要携带已经被授权的gpsd即可) gpsd = i1.cookies.get_dict()['gpsd'] (抽屉专有cookie字段) i3 = requests.post( url="http://dig.chouti.com/link/vote?linksId=8589523", (不同用户id需修改) cookies={'gpsd': gpsd} ) print(i3.text)
3. eval
python: val = eval(表达式) 如eval("1+1")返回2,用于处理excel表格, 没有eval的话通过split然后转数字然后运算。 exec(代码块) 如for循环,没有返回值,不然一个循环多个返回值 JavaScript: eval 集合了上两种功能,可加代码也可加表达式
4.时间
python中time模块获取
JavaScript中Data类
var d = new Data() d.getMinutes() 获取 d.setMinutes() 设置
5.正则表达式
-登录注册验证
主要提供了两个功能:验证和提前
test - 判断
exec - 获取
如何写:
python中import re模块 rep = "\d+" re.match(rep,'asdad') javascript中 rep = /\d+/ 所有的表达式都写着/ /内 rep.test('as23das34') 返回true,只要有就返回true rep.exec('as23das34') 返回["23"],只拿第一个匹配值,数组形式
符号:
开始:^ 结束:$ /\bJava(\w*)\b/:匹配单词开头和结尾 *表示0个或多个,+表示一个或多个 /.../g 表示全局匹配,执行一次返回一个匹配直到null,再执行重新匹配 /.../i 表示不区分大小写 /.../m 表示多行匹配 JS正则匹配时本身默认多行,m模式下使得^$能够匹配换行的内容,本来^指的是整体,现在第二行的开头 也能匹配^。 text = "asda\nJavaScript is more fun than Java or JavaBeans!"; pattern = /^Java(\w*)/g; pattern.exec(text) 返回null,加上m后返回JavaScript。
分组:
表达式加括号,返回匹配值和分组内容
var pattern = /\bJava(\w*)\b/; var text = "JavaScript is more fun than Java or JavaBeans!"; result = pattern.exec(text) 返回 ["JavaScript", "Script"]
可以g全局匹配
验证:
JS循环内,添加自定义属性进行定制验证
if('属性名称'){正则表达式匹配}