lizhenqiu blog
最新评论流与站内评论搜索
Comment Stream
最新评论聚合
共 2894 条评论
Current Page
链接聚合
链接标签分页
Latest
评论流
第 63 / 145 页
当前展示 1241 - 1260 条,共 2894 条评论
Weiphp微信公众平台自定义菜单等开发
微信内置浏览器的 User Agent
检测浏览器的 User Agent 应该是非常简单的事情
微信在 Android 下的 User Agent
微信在 iPhone 下的 User Agent
通过javascript判断
很容易看出来,微信的 User Agent 都有‘micromessenger’字符串标示,我们判断是否含有这些字符串就OK了
通过 PHP 判断
大部分页面是判断UA来的, 但也有一部分页面是通过调用微信JS-SDK提供的方法,如果调用失败说明不在微信浏览器环境内,你可以尝试一下mock这些API
我知道的方法是 在浏览器 more tools->network conditions
User agent 把 select automatically 取消勾选
下面的输入框输入
isWeixinBrowser
判断是否为微信内置浏览器
在微信公众账号开发中,一般会在微站点使用微信用户授权接口,但是我们的网站也需要在非微信环境中正常使用,这就需要判断当前的浏览器是微信内置的浏览器,那么如何判断呢?
判断微信浏览器浏览器中的User Agent,经过在 iPhone 上微信的浏览器的检测,它的 User Agent 是:
所以通过识别“MicroMessenger”这个关键字来确定是否微信内置的浏览器。
使用JavaScript 判断
使用PHP判断
Weiphp微信公众平台自定义菜单等开发
ThinkPHP getBy动态查询
getBy动态查询
ThinkPHP getBy动态查询是一个魔术方法,可以根据某个字段名称动态得到对应的一条数据记录。
根据用户名(username)查询对应的用户资料记录:
方法中传入的参数是查询的字段对应的值,上面例子执行的 SQL 语句为:
SELECT * FROM user WHERE username = 'Admin' LIMIT 1
请注意,在getBy之后紧跟着的字段名称,首字母必须大写。对于如 user_name 这样的字段名称,以驼峰法自动识别下划线,即:
实际使用中可以灵活根据查询的字段名来定义 getBy 放入,如:getByEmail、getByTitle、getById 等。
ThinkPHP3.0,getById() 适合于编辑一条信息的时候,向模板里面传递数据
在编辑一条信息的时候,用getById()而没用find()或者select(),现阶段还不明白具体原因,并且,也没有搜到ThinkPHP里面有关于getById()的相关说明。
这样的用法,是在官方的实例里面看到的。
具体操作如下:
在模板里面,执行PHP代码是这样的:
就上面一段代码,解决了所有问题,而在模板里面,需要调用符合条件的某个字段的时候,只需在需要调用的地方这样写:
thinkphp3.0增加setInc、setDec方法,今天查看thinkphp2.0的方法setInc、setDec时是这样写的:
而对于统计字段(通常指的是数字类型)的更新,系统还提供了 setInc 和 setDec 方法:
而tp3.0有了新的改动,这样写了,方便了不少:
必须配合连贯操作where一起使用
#3
Weiphp微信公众平台自定义菜单等开发
Scope参数错误或没有Scope权限
订阅号无获取用户信息权限
当 scope 为 snsapi_base的时候没有影响。但是scope为snsapi_userinfo 就会提示 scope参数错误或没有scope权限
官网文档说snsapi_base授权只能拿到openid的。而且我实践也发现,有时snsapi_base授权得到的access_token是拿不到用户信息的,
只有在关注的情况下snsapi_base才可以获取到用户信息,否则只能获取到openid
#1也不是, 有时候关注了, 也拿不到会48001
#1
你猜想的没错,经过证明如果先使用snsapi_userinfo参数去调用接口,在使用snsapi_base调用接口,确实会取到其它的参数,而直接使用snsapi_base参数调用接口只能获取到openid。
#1
微信公众号开发文档 关于网页授权回调域名的说明
Weiphp微信公众平台自定义菜单等开发
关键词回复图文点击链接URL
成功的故事只能倒叙着讲
如果你儿子不努力,给他看这张图
如果你女儿不努力,给她看这张图
2XXX年O月网信部微博办
办事员:下一位
你:中国复兴,是21世纪中国经济社会文化等历史发展的必然!您好,我想发一篇微博
办事员:坚持以人民为中心的创作导向,坚持文艺“为人民服务、为社会主义服务”的方向和“百花齐放、百家争鸣”的方针,好,身份证原件、复印件给我,这张表填好,发布日期时间要写详细。
你:坚定文化自信,坚持服务人民,勇于创新创造,坚守艺术理想,推出更多反映时代呼声、展现人民奋斗、振奋民族精神、陶冶高尚情操的优秀美术作品!好,给您。
办事员:“看得见多远的过去,就能走得向多远的未来。”内容有问题,这里需要修改。改完给我就好。
你:“雄关漫道真如铁”“人间正道是沧桑”“长风破浪会有时”!多谢,再见🥳
#1好的,那么现在时间是1983年7月14日下午两点三十分了吗?
#1看完后吓个半死,连夜爬起来看看,微博有没有给我塞僵尸粉。
确认了十遍,发现粉丝数还是0时,终于可以放心地睡一觉了……
^_^
#1怕是它们预感到浪潮即将到来。不管浪潮是不是真的要来,它们现在所做的正是在推波助澜
#1看谁不爽给他买波僵尸粉
每个人都会有过疯狂,疯狂过后的现实才会让人明白,生活来不得半点儿戏!
作者赫拉利:人工智能的危险之处在于,它会打破权力的内在平衡
JS的闭包与变量
意思是说b要变成闭包的话,就必须被外包所引用,即c引用:😬
我认为这句话只是在说闭包的调用,并不是没有被c引用的话,闭包就不存在
用对象调用的叫方法,直接调函数名的叫函数
车是一类对象,
你的车是实例。
车是class
我的车既是一个对象也是一个实例?
对象与实例表达的意思都一样啊,只是不同的说法而已。车可以包括单车,汽车等,具有车所应该有的一般特点:有车轮、可以载东西等等,那么具体到你的那辆汽车,就是车的一个实例或者说是对象。
我觉得对象是实际存在的 但可以=null
实例也是对象,但实例!=null
对象范围包括实例。
对象是:产品设计图纸;
实例是:根据图纸设计出来的产品.产品可以体现出图纸的设计思想;
图纸没有实际作用;
产品可以直接使用
女孩是个对象,,人家不都说谈对象吗
实例呢,就是老婆了,,有了主的女人,,当然这个女人也可能离婚,,的,,哈哈
某个具体的对象就是实例。。
两个有时候就是一个意思,class代表的是一类对象,而这个类中的某一个具体的对象就是一个实例。
比如说人这个类,你是属于人类的,那这个人就是一个具体的对象,也是人类的一个实例。
你是人么?你不是人,你属于人类,但是你不能代表人,你只是自己,属于人类的一个对象,也是人类的一个实例。。
其实两个我感觉就差不多是一会事。。
我觉得,对象是普遍的面向对象思想的概念,面向对象的思想并不只是针对面向对象编程而言的,即 OO != OOP。而实例,是面向对象程序设计中对对象的特有称谓,所以在针对某一门具体的面向对象的语言时,对象和实例指的是同一个事物。
对象引用!=对象
可以有多个对象引用指向同一个对象
对象=实例
不知道理解的对不对
呵呵,对象是一种类型,而实例具体的一个对象。
我们常常听老人说
帮你介绍个 “对象”
真的见面的时候 来的是一个姑娘/帅哥
这就是 对象 实例的区别
对象是概念:你如说车,只是你脑中的一个认识,一类事物
实例是具体的实现:比如一辆奔驰。
类:
public class ren
{string 一个鼻子;
int 两个眼睛
}
实例1:
ren 张山=new ren();
张山.鼻子="高鼻梁";
张山.眼睛="双眼皮";
实例2:
ren 张山=new ren();
张山.鼻子="低鼻梁";
张山.眼睛="单眼皮";
对象:抽象的对象
实例:具体的对象
对象是对一类事物的抽象概括,
而
实例,是具体的某一个物体。
比如:
汽车是对象。
而
宝马就是实例。
对像object,类class,实例instance。
有时候说“对像”是指“类”,有时候是指“实例”,要看context。
这个问题就跟interface的实际意义是什么差不多。
对象分配在内存堆里,实例分配在堆栈里。
对象是不变的东西,它是对客观事物的抽象,实例是对操作对象的引用,你不能直接操作对象。
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
例如五子棋,面向过程的设计思路就是首先分析问题的步骤:1、开始游戏,2、黑子先走,3、绘制画面,4、判断输赢,5、轮到白子,6、绘制画面,7、判断输赢,8、返回步骤2,9、输出最后结果。把上面每个步骤用分别的函数来实现,问题就解决了。
而面向对象的设计则是从另外的思路来解决问题。整个五子棋可以分为 1、黑白双方,这两方的行为是一模一样的,2、棋盘系统,负责绘制画面,3、规则系统,负责判定诸如犯规、输赢等。第一类对象(玩家对象)负责接受用户输入,并告知第二类对象(棋盘对象)棋子布局的变化,棋盘对象接收到了棋子的i变化就要负责在屏幕上面显示出这种变化,同时利用第三类对象(规则系统)来对棋局进行判定。
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一。
功能上的统一保证了面向对象设计的可扩展性。比如我要加入悔棋的功能,如果要改动面向过程的设计,那么从输入到判断到显示这一连串的步骤都要改动,甚至步骤之间的循序都要进行大规模调整。如果是面向对象的话,只用改动棋盘对象就行了,棋盘系统保存了黑白双方的棋谱,简单回溯就可以了,而显示和规则判断则不用顾及,同时整个对对象功能的调用顺序都没有变化,改动只是局部的。
再比如我要把这个五子棋游戏改为围棋游戏,如果你是面向过程设计,那么五子棋的规则就分布在了你的程序的每一个角落,要改动还不如重写。但是如果你当初就是面向对象的设计,那么你只用改动规则对象就可以了,五子棋和围棋的区别不就是规则吗?(当然棋盘大小好像也不一样,但是你会觉得这是一个难题吗?直接在棋盘对象中进行一番小改动就可以了。)而下棋的大致步骤从面向对象的角度来看没有任何变化。
当然,要达到改动只是局部的需要设计的人有足够的经验,使用对象不能保证你的程序就是面向对象,初学者或者很蹩脚的程序员很可能以面向对象之虚而行面向过程之实,这样设计出来的所谓面向对象的程序很难有良好的可移植性和可扩展性。
对象是类的实例。
类:鸟类
对象:一群喜鹊
实例:一只喜鹊
类:具有同种属性的对象称为类,是个抽象的概念。比如说:汽车、人、狗、神;
对象:日常生活中的所有东西都是对象,是类的实例化。比如说:推土车是汽车的实例化;姚明是人的实例化;小白(狗的名字)是狗的实例化;二郎神是神的实例化;
属性:用来描述具体某个对象的特征的是属性,是静态的。比如:姚明身高2.6米多;小白的毛发是棕色的;二郎神额头上有只眼睛;
方法:每个对象有它们自己的行为或者是使用它们的方法,比如说一只狗会跑会叫等,我们把这些行为称之为方法,是动态的,可以使用这些方法来操作一个对象;
类的成员:属性和方法称为这个对象的成员,因为它们是构成一个对象的主要部分,没有了这两样东西,那么对象也没什么存在意义了。
给个例子:
我们以Person类为例:
这就是一个"人"类,描述了"人"这个事物的大体特征
至于对象,就是将"人"具体到某一个人.
比如小王,
则可写成
这样就可以得到小王这个对象了.
我们可以通过小王这个对象来描述他自己的特征.
如
JS的闭包与变量
匿名函数与闭包的区别
匿名函数:没有函数名称的函数;
这就是匿名函数:
闭包:一个可以使用另外一个函数作用域中的变量的函数。
如下面的代码函数b就是闭包,但是这个前提是:当函数a的内部函数b被函数a外的一个变量引用的时候,就创建了一个我们通常所谓的“闭包”。
意思是说b要变成闭包的话,就必须被外包所引用,即c引用:
用一个专业一点的说法就是:函数调用返回后一个没有释放资源的栈区;
一般,当函数执行完毕后,局部活动对象会被销毁,内存中仅保存全局作用域,但闭包的情况是不一样的。闭包的活动对象依然会保存在内存中,于是像上例中,函数调用返回后,变量i是属于活动对象里面的,就是说其栈区还没有释放,但你调用c()的时候i变量保存的作用域链从b()->a()->全局去寻找作用域var i声明所在,然后找到了var i=1;然后在闭包内++i;结果,最后输出的值就是2了;不知道这么说有没人明白,如果不明白,那么只要记住它的闭包的两个点就好了,一点就是闭包的活动对象没有被销毁;第二点是作用域链的关键是他要遇到var 声明;就好了····
共同点:他们都有是函数;除此之外没有任何共同点;
下面是,阮一峰对闭包的解析;
闭包会携带它的函数的作用域,因此会比其他函数占用更多的内存,所以使用闭包要非常注意!!!
类是有行为的数据,闭包是有数据的行为。
学习Javascript闭包(Closure)
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
下面就是我的学习笔记,对于Javascript初学者应该是很有用的。
一、变量的作用域
要理解闭包,首先必须理解Javascript特殊的变量作用域。
变量的作用域无非就是两种:全局变量和局部变量。
Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。
另一方面,在函数外部自然无法读取函数内的局部变量。
这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!
二、如何从外部读取局部变量?
出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。
那就是在函数的内部,再定义一个函数。
在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1就是不可见的。这就是Javascript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。
既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!
三、闭包的概念
上一节代码中的f2函数,就是闭包。
各种专业文献上的"闭包"(closure)定义非常抽象,很难看懂。我的理解是,闭包就是能够读取其他函数内部变量的函数。
由于在Javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成"定义在一个函数内部的函数"。
所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。
四、闭包的用途
闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。
怎么来理解这句话呢?请看下面的代码。
在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。
为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。
这段代码中另一个值得注意的地方,就是"nAdd=function(){n+=1}"这一行,首先在nAdd前面没有使用var关键字,因此nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。
五、使用闭包的注意点
1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。
六、思考题
如果你能理解下面两段代码的运行结果,应该就算理解闭包的运行机制了。
代码片段一。
代码片段二。
请版主讲一讲最后一个例子怎么回事,没有看明白
#3函数中的this一般是指向window中的变量。
#4上面本人说得不太正确。
this的指向是由它所在函数调用的上下文决定的,而不是由它所在函数定义的上下文决定的。
如果非要指向object,可显式的控制--把代码的最后一句改为 alert(object.getName().call(object));
函数内部定义的方法和变量,要等到函数执行过以后,才会真正定义
最后一个题感觉和闭包没什么关系啊,能详细解释一下吗?因为当一个函数作为函数而不是方法来调用的时候,this指向的是全局对象,这在《Javascript权威指南》上说的很清楚,所以答案肯定是“The Window”,和闭包没什么关系啊
最后一题重点在this
this始终表示调用者的应用,第一个的闭包返回出来的一个函数,就是在window的环境下调用了这个函数,所以这个this是指向的window,而第二个把this保存在了that中。
最后两道思考题~ 其实和函数调用还有关系的~ 在以上例子中使用的是函数调用的方式,this这时候是指全局变量
对于代码片段一
object.getnameFunc() 返回的匿名闭包函数被全局变量所引用,其中的this指向
全局变量,当执行时打印The Window 。
对于代码片段二
object.getnameFunc() 在返回闭包函数前,将this赋给that,此时getnameFunc是由
object调用的,故而this指向object,当内部函数被返回时,由于闭包的特性,仍然
能访问到外部函数中的值,当执行打印My Object 。
代码段一、
当一个函数作为函数而不是方法调用的时候,这个this关键字引用全局对象。容易令人混淆的是,当一个嵌套的函数(作为函数)在一个包含的函数中调用,而这个包含的函数是作为方法调用的,这也是成立的:this关键字在包含的函数中有一个值,但是它却(不太直观地)引用嵌套的函数体的内部的全局对象。
所以第一个打印出来的是"The Window"
代码段二、
由于this关键字不是在包含的函数中引用的,而是通过that=this这个调用的,所以这个this不是在闭包内的,因此这个this就不能调用函数体内的全局对象,而是他的局部对象object.name,所以第二个打印出来的是"My Object"
关键是理清函数什么时候作为对象使用,什么时候作为函数使用。
object.getnameFunc()() 也可以改为object.getnameFunc().call()
这就是javascript狡猾的地方。
书写更漂亮规范的js代码
jQuery中的on与bind绑定事件区别实例详解
bind与on的区别就在于–事件冒泡,关于jquery中的on与bind绑定事件的区别通过本文给大家实例讲解,需要的朋友参考下吧
on(events,[selector],[data],fn)
events:一个或多个用空格分隔的事件类型和可选的命名空间,如”click”或”keydown.myPlugin” 。
selector:一个选择器字符串用于过滤器的触发事件的选择器元素的后代.
data:当一个事件被触发时要传递event.data给事件处理函数。
fn:该事件被触发时执行的函数。 false 值也可以做一个函数的简写,返回false。
bind(type,[data],fn)
为每个匹配元素的特定事件绑定事件处理函数。
jQuery 3.0中已弃用此方法,请用 on()代替。
参数类型跟前面那个on一样.
bind与on的区别就在于–事件冒泡
demo1:
## 点击相应的li弹出里面内容,这里把on换成bind是一样的没有区别.也就是说on不使用selector属性与bind并无区别
demo2:
demo3
事件委托的好处
万一子元素非常多,给每个子元素都添加一个事件,会影响到性能;
为动态添加的元素也能绑上指定事件;
javascript取网页DOM自定义属性值和设置自定义属性值的通用方法
20 行 JS 代码,实现复制到剪贴板功能
使用clipboard.js实现页面内容复制到剪贴板
clipboard.js
书写更漂亮规范的js代码
js中函数表达式、函数声明和立即执行函数归纳
函数声明、函数表达式、匿名函数
函数声明:function fnName () {…};使用function关键字声明一个函数,再指定一个函数名,叫函数声明。
函数表达式 var fnName = function () {…};使用function关键字声明一个函数,但未给函数命名,最后将匿名函数赋予一个变量,叫函数表达式,这是最常见的函数表达式语法形式。
匿名函数:function () {}; 使用function关键字声明一个函数,但未给函数命名,所以叫匿名函数,匿名函数属于函数表达式,匿名函数有很多作用,赋予一个变量则创建函数,赋予一个事件则成为事件处理程序或创建闭包等等。
函数声明和函数表达式不同之处在于,一、JavaScript引擎在解析javascript代码时会‘函数声明提升’(Function declaration Hoisting)当前执行环境(作用域)上的函数声明,而函数表达式必须等到Javascirtp引擎执行到它所在行时,才会从上而下一行一行地解析函数表达式,二、函数表达式后面可以加括号立即调用该函数,函数声明不可以,只能以fnName()形式调用 。以下是两者差别的两个例子。
在理解了一些函数基本概念后,回头看看( function(){…} )()和( function (){…} () )这两种立即执行函数的写法,最初我以为是一个括号包裹匿名函数,并后面加个括号立即调用函数,当时不知道为什么要加括号,后来明白,要在函数体后面加括号就能立即调用,则这个函数必须是函数表达式,不能是函数声明。
可以看到输出结果,在function前面加!、+、 -甚至是逗号等到都可以起到函数定义后立即执行的效果,而()、!、+、-、=等运算符,都将函数声明转换成函数表达式,消除了javascript引擎识别函数表达式和函数声明的歧义,告诉javascript引擎这是一个函数表达式,不是函数声明,可以在后面加括号,并立即执行函数的代码。
加括号是最安全的做法,因为!、+、-等运算符还会和函数的返回值进行运算,有时造成不必要的麻烦。
不过这样的写法有什么用呢?
javascript中没用私有作用域的概念,如果在多人开发的项目上,你在全局或局部作用域中声明了一些变量,可能会被其他人不小心用同名的变量给覆盖掉,根据javascript函数作用域链的特性,可以使用这种技术可以模仿一个私有作用域,用匿名函数作为一个“容器”,“容器”内部可以访问外部的变量,而外部环境不能访问“容器”内部的变量,所以( function(){…} )()内部定义的变量不会和外部的变量发生冲突,俗称“匿名包裹器”或“命名空间”。
jQuery使用的就是这种方法,将jquery代码包裹在( function (window,undefined){…jquery代码…} (window)中,在全局作用域中调用JQuery代码时,可以达到保护JQuery内部变量的作用。
书写更漂亮规范的js代码
javascript 的 "!function" 是什么意思?
这种叫自执行函数表达式
在这种情况下,解析器在解析function关键字的时候,会将相应的代码解析成function表达式,而不是function声明。
#1
叹号后面跟函数!function
和加号后面跟函数+function
都是跟(function(){})();这个函数是一个意思,都是告诉浏览器自动运行这个匿名函数的,因为!+()这些符号的运算符是最高的,所以会先运行它们后面的函数
js 中 var v=v || [] ;这种写法有什么意义?为什么不直接var v='';
这种写法就是如果v为null和undefined的就赋值[]
js 这种写法是什么意思 var a= b || c
+号把字符串转成了整数
箭头函数
模板字符串
传统的JavaScript语言,输出模板通常是这样写的。
上面这种写法相当繁琐不方便,ES6引入了模板字符串解决这个问题。
模板字符串(template string)是增强版的字符串,用
标识。它可以当作普通字符串使用,也可以用来定义多行字符串,或者在字符串中嵌入变量。
上面代码中的模板字符串,都是用反引号表示。如果在模板字符串中需要使用反引号,则前面要用反斜杠转义。
如果使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。
上面代码中,所有模板字符串的空格和换行,都是被保留的,比如<ul>标签前面会有一个换行。如果你不想要这个换行,可以使用trim方法消除它。
模板字符串中嵌入变量,需要将变量名写在${}之中。
大括号内部可以放入任意的JavaScript表达式,可以进行运算,以及引用对象属性。
模板字符串之中还能调用函数。
如果大括号中的值不是字符串,将按照一般的规则转为字符串。比如,大括号中是一个对象,将默认调用对象的toString方法。
如果模板字符串中的变量没有声明,将报错。
由于模板字符串的大括号内部,就是执行JavaScript代码,因此如果大括号内部是一个字符串,将会原样输出。
模板字符串甚至还能嵌套。
上面代码中,模板字符串的变量之中,又嵌入了另一个模板字符串,使用方法如下。
如果需要引用模板字符串本身,在需要时执行,可以像下面这样写。
阮一峰的es6入门
mdn文档
You-Dont-Know-JS
#8
#个人见解#
当使用的字段名、表名等与MySQL保留字冲突时(如创建名为desc的字段、往desc表中插入记录),如果不加反引号``,无法执行成功。
因此,INSERT `desc` VALUES('aa','bb');可以执行成功。而INSERT desc VALUES('aa','bb');执行失败。
而当你所使用的的字段名、表名不含有保留字时,可以不加反引号``
#8
#10
Html转义字符
二进制是Binary,简写为B
八进制是Octal,简写为O
十进制为Decimal,简写为D
十六进制为Hexadecimal,简写为H
#12
在计算机语言中常用的进制有二进制、八进制、十进制和十六进制,十进制是最主要的表达形式。
对于进制,有两个基本的概念:基数和运算规则。
基数:基数是指一种进制中组成的基本数字,也就是不能再进行拆分的数字。二进制是0和1;八进制是0-7;十进制是0-9;十六进制是0-9+A-F(大小写均可)。也可以这样简单记忆,假设是n进制的话,基数就是【0,n-1】的数字,基数的个数和进制值相同,二进制有两个基数,十进制有十个基数,依次类推。
运算规则:运算规则就是进位或错位规则。例如对于二进制来说,该规则是“满二进一,借一当二”;对于十进制来说,该规则是“满十进一,借一当十”。其他进制也是这样。
#12
js实现二进制与十进制的相互转换
#14
注释:对数字调用 toString(10) 与调用 toString() 相同,它们返回的都是该数字的十进制形式。
ECMAScript 类型转换
#14十进制转二进制
用2辗转相除至结果为1
将余数和最后的1从下向上倒序写
就是结果
例如
302 302/2 = 151 余0
151/2 = 75 余1
75/2 = 37 余1
37/2 = 18 余1
18/2 = 9 余0
9/2 = 4 余1
4/2 = 2 余0
2/2 = 1 余0
故二进制为100101110
二进制转十进制
从最后一位开始算
依次列为第0、1、2...位
第n位的数(0或1)乘以2的n次方
得到的结果相加就是答案
例如:01101011
转十进制:
第0位:1乘2的0次方=1 1乘2的1次方=2 0乘2的2次方=0 1乘2的3次方=8 0乘2的4次方=0 1乘2的5次方=32 1乘2的6次方=64 0乘2的7次方=0 然后:1+2+0 +8+0+32+64+0=107. 二进制01101011=十进制107.
#10
错误😬
#8反引号怎么打
今天我发现我从来没打过这外符号
, 直接按下即可....
刚开始我还一直在找没找到.....🤔
#17
#16
JS浮点数运算多出很多位小数点Bug的解决办法
js取整数四舍五入
书写更漂亮规范的js代码
js中三种作用域详解(全局,函数,块级)
1.全局变量:声明在函数外部的变量(所有没有var直接赋值的变量都属于全局变量)
2.局部变量:声明在函数内部的变量(所有没有var直接赋值的变量都属于全局变量)
JS中变量申明分显式申明和隐式申明。
在函数中使用var关键字进行显式申明的变量是做为局部变量,而没有用var关键字,使用直接赋值方式声明的是全局变量。
当我们使用访问一个没有声明的变量时,JS会报错。而当我们给一个没有声明的变量赋值时,JS不会报错,相反它会认为我们是要隐式申明一个全局变量,这一点一定要注意。
全局作用域针对于全局变量来说;
全局变量在整个上下文都有效只是在没有赋值之前调用,会输出undefin
函数作用域是针对局部变量来说的,在函数中定义的变量在函数外不能获取
块级作用域
概念“{}”中间的部分都是块级作用域ex:for while if ,js中没有块级作用域,但是可以用闭包实现类似功能。
在C/C++中,由花括号封闭的代码块都有自己的作用域,也就是块级作用域(私有作用域)。而在javascript中则没有块级作用域,首先来看一段代码:
对于有块级作用域的语言来说,for语句中定义并初始化的变量i在循环外是无法访问的,而在javascript中,for语句中定义的变量i在循环结束后,依旧会存在于循环外部的执行环境(作用域)中,在这里i的作用域是全局环境。具体来说就是:使用var关键字声明变量时,这个变量会自动添加到距离最近的可用环境中。对于函数而言,这个最近的环境就是函数的局部环境。如果变量在未经声明的情况下被初始化,则该变量会被自动添加到全局环境。
不过有时候的确很需要块级作用域来解决一些问题,这时候我们就可以使用匿名函数来模仿块级作用域。
匿名函数就是没有名字的函数,有时候也被称为拉姆达(lamda)函数。形式如下:
而用作模仿块级作用域(私有作用域)的匿名函数的语法形式如下:
以上代码的意思是:首先定义并立即调用一个匿名函数。将函数声明包含在圆括号中,表示它实际上是一个函数表达式。而紧随其后的另一对圆括号表示立即调用这个函数。
可能刚开始我们感觉这种语法比较难以理解,我们可以先看下下面这段代码:
上面的代码中,首先以函数表达式的方式定义了一个函数,然后立即调用它。在这里定义函数的方式就是先创建一个匿名函数,然后将其赋值给变量myFunc,而在函数名称后加一对圆括号即表示调用函数。那我们如果直接用匿名函数代表变量myFunc,在匿名函数后面添加一对圆括号不就表示直接调用了吗?然而,如果如下这样做就会报错:
因为在javascript中,function关键字表示一个函数声明的开始,而函数声明后面不能直接跟圆括号。而函数表达式后面可以跟圆括号,来表示函数调用。在函数声明外面加一对圆括号就可以转换成函数表达式,如下:
这样最简单的块级作用域就创建好了。这种技术长在全局作用域中用在函数外部,来限制向全局作用域中添加过多的变量和函数。例如:
以上代码放在全局作用域中,用来确定在1月1日显示一条祝贺新年的信息。其中变量now现在就是匿名函数模仿的块级作用域中的局部变量。
当然,只要我们临时需要一些变量,都可以使用块级作用域(私有作用域)。当匿名函数执行完毕,其作用域链立即销毁,从而可以减少闭包占用资源问题。
书写更漂亮规范的js代码
微信摇一摇统计次数微官网
PHP输出中文乱码的问题
用echo输出的中文显示成乱码,
其实应该是各种服务器脚本都会遇到这个问题,
根本还是编码问题,
一般来说出于编码兼容考虑大多的页面都将页面字符集定义为utf-8
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
这时候要正常显示中文需要转化一下编码方式,比如
echo iconv("GB2312","UTF-8",'中文');就不会乱码了
还有其他方法,比如
在php的echo前面加入header("Content-Type:text/html;charset=gb2312");
当然简体中文页面也可以干脆地,
把<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />中的UTF-8改成gb2312
实际中遇见奇怪的现象,
在本机服务器上正常显示的页面,传上服务器就echo出来乱码,
没仔细琢磨过这个缘由,因为通过iconv函数GB2312、UTF-8换换位置重新编码下就正常了,
不过估计肯定是APACHE,更确切说是PHP服务端的设置不同造成的,
看看PHP.INI应该就能解决。
在php的echo前面加入
js字符串转换成数字的三种方法
H5的storage(sessionstorage&localStorage)简单存储删除
众所周知,H5的storage有sessionstorage&localStorage,其中他们的共同特点是API相同
下面直接上代码,storage中的存储与删除:
存值取值删除
他不是脾气暴躁,只是不能被打扰
比烂果然是部分国人最后的遮羞布🥳
张嘴就来,马云在什么场合讲什么话的本事已经炉火纯青了。
微信摇一摇统计次数微官网
这篇回答叫做:“为什么有时候下载东西一开始很快,后来就越来越慢”回答暨通信网理论基础课程复习笔记
不是套路!!!是TCP协议的拥塞控制机制导致的!
要理解TCP的拥塞控制机制,还得从古老的七层模型说起……
其中TCP协议应用于传输层,下载就是传输的一种,而TCP传输的速度基本是这样的
其中横坐标是传输次数,纵坐标是“拥塞窗口”数,就是要传输的报文需要先进入这个窗口才能发出去,简单的理解成传输速度就可以了a
假设我要在百度云上下载一个文件,以之为例解释一下这个过程。
(A→B段)
百度云:不知道当前网络环境怎么样,路上堵不堵……不管了发一个报文试试。
我:收到啦收到啦!
百度云:诶呦不错那再发两个试试~
……
百度云:行了行了差不多了可以慢点儿增加了
这一段,起点学名叫做慢开始,后面叫指数增大
(B→C段)
百度云:加一个
我:收到啦
百度云:再加一个
我:收到啦
百度云:再加一个
我:……
百度云:? 诶好像堵了= =
这一段,学名叫做,拥塞避免算法,即,加法增大
(C→D段)
百度云:算了从头开始
这一段叫做,乘法减小,开始新的慢开始,指数增大,但是,只增大到刚刚的一半,就进入拥塞避免阶段啦!(D→E段,E纵坐标是C的一半)
以上是TCP Tahoe版本的传输过程(也是主要考试的内容),然而实际上这个版本太基础了,已经废弃不用了,实际使用的是红线的版本,叫做TCP Reno(但是这个不考)
红色版本与蓝色版本的区别就是,红色版本的乘法减小并不是直接减到1然后重新慢开始,而是采用了效率高一些的“快恢复快重传”算法,也就是乘法减小至原来的一半(C→F段,F是C的一半)然后直接开始加法增大。这样可以看到比原来的蓝色版本稍微快了一点。
但下载还是很慢啊怎么办,关于这点老师的说法是,自己手动暂停一下,再重新开始下载,就又能享受一次第一次的指数增加加法增加的速度,不然后面一直减半减半减半就会越来越慢越慢越慢………………
以上都是与TCP协议有关的理论因素,其他因素还包括加速器啊下载器啊什么的
他不是脾气暴躁,只是不能被打扰
川普推特治国,我们现在微博治国,反正发错了就删
#1890,我们先别谈更高级的道德,首先学会尽量不给别人添麻烦
#1890,
“医生,快,病人有反应了!”
医生长出一口气:“这位患者那天工资被新人超过,一着急脑溢血晕过去了,看来总算在梦里想通了啊”
银角大王将宝葫芦倒置,喊了一声:“周鸿祎!”周鸿祎应了一声,嗖的便被吸了进去。银角大王查看时,里面除了周鸿祎,还有360杀毒、360压缩、360浏览器、360安全卫士、360游戏大厅等熙熙攘攘一干人。银角大王惊讶道:“怎的来了这么多?”宝葫开口言道:“我就只点了个‘下一步’。” 危险!您的宝葫芦有53个漏洞。金角大王正要说话,看到一旁的李彦宏在笑,大怒,反转宝葫芦正要喊,李彦宏嗖的一声钻进了宝葫芦,金角大王转过葫芦一看,里面除了李彦宏,还有百度贴吧、百度手机管家、百度浏览器、百度杀毒、百度输入法、百度外卖、百度安全中心、百度云、百度音乐、百度知道、百度百科……密密麻麻一干人,金角大王问怎么回事,宝葫芦开口道:“我什么都没干!” 然后突然见马化腾拿了一个一模一样的葫芦站在金角大王家门口。
#3马云现在路边吆喝:金角大王同款,真实可吸,包邮试用只要9.9元!😴
#3看到谷歌现在门口,反转宝葫芦喊了半天,谷歌硬是听不到。。
#3对比了一下,淫叫大王觉得还是周鸿祎比较有节操。
#5因为有堵墙Ծ‸Ծ
#6然后忽见一人携不明物体飞来,曰:俺老罗要造东天庭最好的葫芦!把山寨品给砸了。
#4马化腾说:你的葫芦是假的,我的才是真的!
银角大王喊一声:马化腾,马化腾应了一声,然后进去了,还带进腾讯全家桶,周鸿祎就给挤出来了,再喊一声周鸿祎,周鸿祎就进去了,马化腾又被挤出来了,银角大王惊道:恩师传授宝贝之时,说过此物可容宇宙万物,没想到放个马化腾或者周鸿祎就满了,金角道,贤弟莫慌,此二人定是五行相冲,所以不能同时在一个葫芦内,等我把李彦宏放出,你再把李彦宏吸进瓶,必定可行,况且那李彦宏自带几百莆田医院,包治百病,说不定还可治好此二人的五行相冲症状.🤔
周鸿祎还挺有良心,下一步!
能聊天的病毒,会杀毒的木马😁
然后葫芦就卡死再也用不了了
再三确认了一下,李彦宏的“密密麻麻”后面是一干人,而不是一千人。🥳
华为推出原谅绿葫芦,雷军表示我们的葫芦跑分宇宙第一!
#11杀完毒发现多了一个猎豹浏览器。。
高铁上,一位中国大妈坐在一位外国小伙旁边。漫长的旅途百无聊赖,大妈正好也懂几句英文,于是就问外国小伙:“Do you know An Li?”正好小伙中文说的很好,听到这个问题马上激动地说:“知道知道,我是他的超级粉丝,他的电影我全都看过!”于是大妈跟小伙相谈甚欢,从“卧虎藏龙”到“断背山”,从“少年Pi的奇幻漂流”到“比利林恩的中场战事”,一直聊到小伙到站下车。哦,对了,小伙下车前还从大妈这里买走了一千多块的安利产品。😬
以大多数人的努力程度之低,根本轮不到拼天赋。😅
华盛顿和乾隆同一年死去,这就是美国的发达之处了,对比华盛顿所留下的伟大遗产,乾隆毕生的工作不过是在对一所即将沉没的巨轮进行修补,然而他挽回不了船本身的巨大漏洞。他们死后,两个国家走上截然不同的道路。
#19没有法国拼了老命援助,独立战争谁赢真不一定呢。
法国七年战争惨败。独立战争拼命援助美国怼英国,最后打赢了,却没占到什么实际便宜,最后国内怨声载道,还爆发了法国大革命。也算是华盛顿的贡献了。
#19华盛顿一辈子就没打赢过几场胜仗,还把法国老大哥坑死了,独立宣言一开始没人想那么伟光正,正如上面说的,女人,黑人,黄种人,穷人都不是人,后面美国变得越来越自由,平等,不是华盛顿一个人的功劳,最主要的还是和后来的国际共产主义运动,民族独立浪潮等共同逐渐推动的
#19然而美帝1865年林肯赢了内战后才废除奴隶制
#19啧啧,搞不好几百年后就是“XXX和川普同一年死去,这就是中国的发达之处了,对比XXX所留下的伟大遗产,川普毕生的工作不过是在对一所即将沉没的巨轮进行修补,然而他挽回不了船本身的巨大漏洞。他们死后,两个国家走上截然不同的道路。”
#21大概华盛顿一定肯定以及及其确定的忘掉了Negro
你大清国也不是你这四等贱汉的大清国,是满大人的大清国😂
美国起码打赢英国从英国殖民地变为独立国家,大清打英国从独立国家变成半殖民地。
微信摇一摇统计次数微官网
if(!localStorage.lastnamenn) localStorage.lastnamenn=Number(localStorage.lastnamenn)+Number(n);😬😬😬
微信摇一摇统计次数微官网
JavaScript中8个常见的陷阱
1. 你是否尝试过对数组元素进行排序?
JavaScript默认使用字典序(alphanumeric)来排序。因此,[1,2,5,10].sort()的结果是[1, 10, 2, 5]。
如果你想正确的排序,应该这样做:
2. new Date() 十分好用
new Date()的使用方法有:
不接收任何参数:返回当前时间;
接收一个参数x: 返回1970年1月1日 + x毫秒的值。
new Date(1, 1, 1)返回1901年2月1号。
然而....,new Date(2016, 1, 1)不会在1900年的基础上加2016,而只是表示2016年。
3. 替换函数没有真的替换?
如果你想把所有的b都替换掉,要使用正则:
4. 谨慎对待比较运算
因为[1,2,3]和[1,2,3]是两个不同的数组,只是它们的元素碰巧相同。因此,不能简单的通过===来判断。
5. 数组不是基础类型
如果要判断一个变量var是否是数组,你需要使用Array.isArray(var)。
6. 闭包
这是一个经典的JavaScript面试题:
虽然期望输出0,1,2,...,然而实际上却不会。知道如何Debug嘛?
有两种方法:
使用let而不是var。备注:可以参考Fundebug的另一篇博客ES6之"let"能替代"var"吗?
使用bind函数。备注:可以参考Fundebug的另一篇博客JavaScript初学者必看“this”
Greeters.push(console.log.bind(null, i))
当然,还有很多解法。这两种是我最喜欢的!
7. 关于bind
下面这段代码会输出什么结果?
如果你说程序会崩溃,并且报错:Cannot read property 'name' of undefined。
因为第16行的geet没有在正确的环境下执行。当然,也有很多方法解决这个BUG!
我喜欢使用bind函数来解决问题:
这样会确保greet会被Foo的实例调用,而不是局部的函数的this。
如果你想要greet永远不会绑定到错误的作用域,你可以在构造函数里面使用bind来绑 。
你也可以使用箭头函数(=>)来防止作用域被修改。备注:可以参考Fundebug的另一篇博客JavaScript初学者必看“箭头函数”。
8. Math.min()比Math.max()大
因为Math.min() 返回 Infinity, 而 Math.max()返回 -Infinity。
原文: Who said javascript was easy ?
译者: Fundebug的全栈BUG监控