js学习
一、什么是对象
所谓对象就是真实世界中的实体,对象与实体是一一对应的,也就是说现实世界中每一个实体都是一个对象,它是一种具体的概念。
二、原型链
因为每个对象和原型都有原型,对象的原型指向原型对象,
而父的原型又指向父的父,这种原型层层连接起来的就构成了原型链。
三、局部变量、全局变量
局部变量可以与全局变量重名,但是局部变量会屏蔽全局变量。要使用全局变量,需要使用::。在函数体内引用变量会用到同名的局部变量而不是全局变量,对于一些编译器来说,在同一个函数体内可以定义多个同名的局部变量。例如我们可以在一个函数内部,在两个循环中都定义同名的局部变量i,而局部变量i的作用域在那个循环体内
具体来说,全局变量和局部变量的区别如下:
1. 作用域不同:全局变量的作用域为整个程序,而局部变量的作用域为当前函数或循环等
2. 内存存储方式不同:全局变量存储在全局数据区中,局部变量存储在栈区
3. 生命期不同:全局变量的生命期和主程序一样,随程序的销毁而销毁,局部变量在函数内部或循环内部,随函数的退出或循环退出就不存在了
4. 使用方式不同:全局变量在声明后程序的各个部分都可以用到,但是局部变量只能在局部使用。函数内部会优先使用局部变量再使用全局变量
四、形参、实参、作用域
通俗的说,形参就是函数定义时参数表的各个变量,实参就是调用函数时给函数的变量(写在函数名后的圆括号里)比如函数 int fun(int a,int c){some operation;}a和c都是形参。
当我调用函数fun时,例如:
int n,i=1,j=2;
n=fun(i,j);
调用fun(i,j)形式中的i,j就是实参。
五、作用域
作用域(scope)
作用域在许多程序设计语言中非常重要。
通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
作用域的使用提高了程序逻辑的局部性,增强程序的可靠性,减少名字冲突。
对于对象而言(其他也是一样的),在main函数中,对象的作用域为他所在的最近的一对花括号内。在后花括号处析构函数被调用;全局的对象的作用域为声明之后的整个文件,析构函数在最后被调用。另外,临时产生的对象在使用完后立即会被析构。
六、内置函数
编程语言中预先定义的函数。
具体:嵌入到主调函数中的函数称为内置函数,又称内嵌函数。 作用是提高程序的执行效率,大多编程语言都有自己的内置函数,如javascript内置函数等。 内置函数的存在极大的提升了程序员的效率和程序的阅读。
七、js函数调用的四种方法
js的函数调用会免费奉送两个而外的参数就是 this 和 arguments 。arguments是参数组,他并不是一个真实的数组,但是可以使用.length方法获得长度。
书上有说4中调用方式:
•方法调用模式
•函数调用模式
•构造器调用模式
•apply调用模式
1:方法调用模式
请注意this此时指向myobject。
[javascript] view plain copy print?
01./*方法调用模式*/
02. var myobject={
03. value:0,
04. inc:function(){
05. alert(this.value)
06. }
07. }
08. myobject.inc()
2:函数调用模式
请注意this此时指向window
[javascript] view plain copy print?
01./*函数调用模式*/
02.
03. var add=function(a,b){
04. alert(this)//this被绑顶到window
05. return a+b;
06. }
07. var sum=add(3,4);
08. alert(sum)
3:构造器调用模式
JavaScript语言精粹一书建议摒弃这中方式。因为有更好的方式。这里先不介绍。下次发表博文的时候贴出来。
会在这里加一个连接。
[javascript] view plain copy print?
01./*构造器调用模式 摒弃*/
02.
03. var quo=function(string){
04. this.status=string;
05. }
06. quo.prototype.get_status=function(){
07. return this.status;
08. }
09. var qq=new quo("aaa");
10. alert(qq.get_status());
4:apply调用模式
==我们可以来看一个更有用的apply实例。看最下面的代码。
[javascript] view plain copy print?
01./*apply*/
02. //注意使用了上面的sum函数
03. //与myobject
04. //这中调用方式的优点在于可以指向this指向的对象。
05. //apply的第一个参数就是this指针要指向的对象
06. var arr=[10,20];
07. var sum=add.apply(myobject,arr);
08. alert(sum);
八、数组里怎样插入和取出内容
添加一个元素
1var array = [1,2,3,4,6];
2array.splice(4,0,5);
结果:array为[1,2,3,4,5,6]。
删除并替换一个元素
1var array = [1,2,2,4,5];
2array.splice(2,1,2);
结果:array为[1,2,3,4,5]。
九、禁止鼠标点击的使用方法
JavaScript有一个preventDefault方法, 可用以来取消事件的默认动作。比如取消打开链接,选择文本或拖放等。
代码如下:
event.preventDefault()
该方法将通知 Web 浏览器不要执行与事件关联的默认动作(如果存在这样的动作)。例如,如果 type 属性是 “submit”,在事件传播的任意阶段可以调用任意的事件句柄,通过调用该方法,可以阻止提交表单。注意,如果 Event 对象的 cancelable 属性是 fasle,那么就没有默认动作,或者不能阻止默认动作。无论哪种情况,调用该方法都没有作用。
这种方法可以阻止当前元素的浏览器默认行为,但并不阻止事件被父级及document响应。如果想彻底取消事件,则可使用stopPropagation
代码如下:
event.stopPropagation()
该方法将停止事件的传播,阻止它被分派到其他 Document 节点。在事件传播的任何阶段都可以调用它。注意,虽然该方法不能阻止同一个 Document 节点上的其他事件句柄被调用,但是它可以阻止把事件分派到其他节点。
这两种是在JS中的常用取消事件的方法,但是其实还有一种用纯css就能实现取消事件响应的方法,pointer-events,使用起来更加简单,它可以:
1、阻止用户的点击动作产生任何效果
2、阻止缺省鼠标指针的显示
3、阻止CSS里的hover和active状态的变化触发事件
4、阻止JavaScript点击动作触发的事件
比如以下CSS就顺起到将禁用的按钮灰掉的效果
代码如下:
.disabled {
pointer-events: none;
cursor: default;
opacity: 0.6;
}
这种方法明显比js代码更加灵活,可惜ie9不支持。以上就是本文的全部内容,希望对大家的学习和工作能有所帮助。
十、浏览器如何设置二维码插件的方法/步骤
1.不同的浏览器操作是不一样的,比如chrome就需要去网上商店去下载,IE需要安装插件,目前火狐只需要轻松一设置即可。
2.然后,选择工具栏上的最右上角处的“菜单”选择。接着选择“附加组件”。
3.然后选择“扩展”里的“附加组件管理器”。
4.选择“二维码“选项,并选择启用,确定即可。
5.此时,再打开浏览器新窗口,然后点一下二维码图标,生成一个二维码图标,
6.然后再用手机扫描一下即可。
十一、递归
递归算法一般用于解决三类问题:
(1)数据的定义是按递归定义的。(Fibonacci函数)
(2)问题解法按递归算法实现。
这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。
(3)数据的结构形式是按递归定义的。
如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。
递归的缺点:
递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
十二、数组和函数
1、如果对全部元素赋初值(即提供全部初始数据), 则定义数组时对第一维的长度可以不指定, 但第二维的长度不能省。
2.gets(字符数组)
(1)格式:gets(字符数组名)
(2)作用:从终端输入一个字符串到字符数组,并且得到一个函数值。该函数值是字符数组的首地址。
gets函数这里注意 如果和scanf("%s",k);一起出现在程序中。如果gets在scanf在前面 则不执行scanf函数。只执行gets函数 如果在后面 会执行。
while(scanf("%d",&n) != EOF)
{
scanf("%c",&h);
gets(a);
scanf("%c",&h);
gets(b);
scanf("%c",&h);
gets(c);
}
while(scanf("%d",&n) != EOF)
{
scanf("%s",a);
scanf("%s",b);
scanf("%s",c);
}
类似这样子。
当要调用gets的时候,如果前面有输入数组要敲回车,则会将回车赋给gets;
这时要用scanf来输入,可以获取整行的完全信息(无括号)
例:
#include"stdio.h"
main( )
{
char st[15];
printf("input string:\n");
gets(st);
puts(st);
}
可以看出当输入的字符串中含有空格时,输出仍为全部字符串。说明gets函数并不以空格作为字符串输入结束的标志,而只以回车作为输入结束。
3.字符串连接函数strcat
(1)格式:strcat(字符数组名1,字符数组名2)
(2)作用:连接两个字符数组中的字符串,把 字符串2接到字符串1 的后面,结果放在字 符数组1中,函数调用后得到一个函数值——字符数组1的地址。
例: strcat函数的使用
#include"string.h"
main( )
{
static char st1[30]="My name is ";
int st2[10];
printf("input your name:\n");
gets(st2);
strcat(st1,st2);
puts(st1);
}
4.字符串复制函数strcpy
(1)格式:strcpy(字符数组名1,字符数组名2)
(2)作用:将字符串2复制到字符串1中去。字符数名2,
也可以是一个字符串常量。这时相当于把一
个字符串赋予一个字符数组。不能用赋值语
句对整个数组进行赋值。
例: 复制函数的使用
#include"string.h"
main( )
{
static char st1[15],st2[]="C Language";
strcpy(st1,st2);
puts(st1);
printf("\n");
}
5.字符串比较函数strcmp
(1)格式:strcmp(字符数组名1,字符数组名2)
(2)作用:比较字符串1和字符串2。
(3)规则:
A.对两个字符串自左至右逐个字符相比(按照ASCII码值
大小比较),直到出现不同的字符或遇到`\0`为止。如全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。并由函数返回值返回比较结果。
B.如果参加比较的两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”。注意:小写字母比大写字母“大”。
C.比较的结果由函数值带回。
(I)如果字符串1==字符串2,函数值为0;
(II)如果字符串2>字符串2,函数值为一正整数;
(III)如果字符串1<字符串2,函数值为一负整数。
注意:对两个字符串比较时的书写格式。
例如:if (str1=str2) printf("yes");
是不行的;而应该使用
if (strcmp(str1,str2)==0) printf("yes");
6.测试字符串长度函数strlen
(1)格式:strlen(字符数组名)
(2)作用:测试字符串的长度。函数的值为字符串中
的实际长度,不包括`\0`在内。
例:
#include"string.h"
main()
{
int k;
static char st[]="C language";
k=strlen(st);
printf("The lenth of the string is %d\n",k);
}
7.大小写转换函数
(1)strlwr(字符串)
作用:将字符串中大写字母转换成小写字母。
(2)strupr(字符串)
作用:将串中的小写字母转换成大写字母。