js学习总结
转自 http://blog.sina.com.cn/s/blog_75cf5f3201011csu.html
一: 关于基本数据类型在栈内存和堆内存中的关系
基本数据对于栈内存和堆内存是可以复制的,可以把a变量里的数据赋值给b变量同时在栈内存里面为每个变量各保存一个对象,改变其他某个变量的值将不影响其他对变量的值。
列子1:var num1 = 6;
var num2 = num1;
在此num1与num2保存着相同的值,但是他们是完全独立的,相互做任何操作不受影响。
列子2: var obj1 = new object();
var obj2 = obj1;
obj1.name = 'Nicholas';
alert(obj2.name); //'Nicholas'
在此obj1与obj2保存着同样的值,他们两个实际上是一个指针,多指向堆内存中的一个对象,因此他们是相互受影响的,改变其中一个,就会影响到另一个。
二:关于复杂数据类型在栈内存和堆内存中的关系
复杂数据对于栈内存和堆内存他们只指向同一个对象,不会因为堆内存里多个变量赋值后在栈内存里面产生多个对象,其中改变某个变量的值将影响其他变量的值,只有创建一个新对象,并将原对象的属性用for in语句遍历出来赋值给新对象,这样栈内存里就有了两个对象了,改变其中某一个对象不会影响另一个对象。
三:关于对象
创建新对象有两种写法:1 var a = new object(); 2 var a = {};
对于创建的新对象我们也可以为其添加属性和方法:a.name = 'attributively';
alert(a.name); (结果)//attributively
访问属性: 1 对象.属性 = 属性值 (以点来访问对象的属性) 2 对象 = {属性 :属性值};(以冒号访问属性) ;
对象有个索引值的概念,他类似数组的下标,也是用访问数组下标的形式访问它的索引值,如:classes['today'];这是访问classes对象中的today属性。
classes[topclass]这种形式一般是当对象的属性是可变的,动态的时候才用这种形式访问或者改变的。。。
修改属性默认特性(低版本浏览器不支持这些属性):
var ceShi = {};
ceShi.name = 10;
Object.defineProperty(ceShi, 'name', {writable:false});// 设置该对象属性值不能被修改Object.defineProperty(ceShi, 'name', {configurable:false});//设置该对象的属性不能被删除
四:创建数组:
创建数组有两种写法:1 var = a = new Array(); 2 var a = [];
数组的排序方法是由数字排第一,字母第二,文字第三且有顺序的排列;
五:字面量概念:
字符串字面量是不需要创建过程就可使用的对象,所以它既没有变量那样的声明或者定义(字符串字面量是无名对 象),也不需要象动态分配的对象那样进行动态分配。由于这个原因,用来限定变量的类型限定符(如 const、volatile)以及存储类别指示符(如 extern、static、auto、register)不能用在修饰字符串字面量上。
六:有关于变量 环境搜索方式相关概念
1、所有全局变量和函数多事作为window对象的属性和方法创建的。
2、每个环境多可以向上收缩作用域链,以查询变量名和函数名;但任何环境多不能通过向下搜索作用域链而进入另一个执行环境。
3、
合法的变量名遵循的规则:1 第一个字符必须是一个 ASCII 字母(大小写均可),或一个下划线(_)。注意第一个字符不能是数字。
2:后续的字符必须是字母、数字或下划线。
3:变量名称一定不能是 保留字。
七:函数的参数概念:
定义函数的参数我们可以把它当做一个局部变量,局部变量他执行完后就会销毁,而全局变量只有当你关掉网页才会销毁
参数分为形参和实参,形参就相当于当前函数的一个局部变量,实参就是调用的时候,
所传的参数,
就必须是有值的变量或常量或者字符串。
八:函数相关问题
1 多个相同的元素就可以创建一个数组保存 2 不同的则该创建一个对象保存。
3、把一个函数赋值给一个变量,结果是把这个函数返回的结果赋值给了这个变量。
九:关于面相对象的程序设计:
关于面向对象的程序设计要掌握的基本几点:1 要有类的概念,把属性方法一样的相似的东西抽象为一类。
2: 类的继承 3: 类里面的属性方法可以单独改变、
十:通过用函数定义一个方法并在相同效果情况下调用
在我们做js效果的时候常常会遇到很多情况下多是做同一种效果,因此,js代码也差不多,可以说是一样。
在这种情况下,有些人会在每个函数里多写上显示这种效果的方法,包括我自己也是,这样的话,要是很多样子多是这种效果的话,那我们的js就要写很多代码了。当我昨天在做一个文件栏的时候,每一个栏目多是一样的事件,偶尔想到用一个函数把每个栏目一样的几个事件用方法定义在一个函数里面。
这样哪里需要这种效果,调用这个函数就可以了,还有就是可以节省很多代码。
定义一个onclick点击事件改变class类名方法的函数:
var dJShiJian = function(dJs, cLsL) {
if (dJs.className == '') {
addClass(dJs, cLsL);
}else if (dJs.className == cLsL) {
removeClass(dJs, cLsL);
}
}
定义一个onclick点击事件改变img属性值方法的函数:
var hTShiJian = function(gHs) {
if(gHs.getAttribute("src") == "../img/tp7.gif") {
gHs.setAttribute("src", "../img/bjt1.gif");
}else if (gHs.getAttribute("src") == "../img/bjt1.gif") {
gHs.setAttribute("src", "../img/tp7.gif");
}
}
在你需要这种效果的时候直接调用定义好的函数,:
function zhanKai(hTu) {
dJShiJian(dUl[0], 'lB');
hTShiJian(hTu);
}
这样即使需要这种效果的样子再多,只要调用定义好的函数,把参数下就可以了。
十一 创建元素 createElement_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x():
使用该方法尅一创建一个新元素。这个方法只接受一个参数,就是要创建元素的标签名。
十二 操作节点 a()与insertBefore() 的用法:
appendChiild()用于在指定元素里面的末尾添加一个节点。
insertBefore()用于在指定元素里面的某个位置添加一个节点,这个方法接受两个参数:要插入的节点和作为参照的节点。插入节点后,被插入的节点会变成参照节点的前一个同胞,同时被方法返回。
十三 设置或获取位于对象起始和结束标签内的 HTML innerHTML
改属性是基本上每个标签对象里面多有的属性,它用于在某标签内添加html代码或文字。并替换当前标签里面的所有子节点,也就是代码。
十四 Math对象
Math对象提供了计算机功能。
random()方法 返回一个随机数,语法:【Math.random() *可能值的总数 + 第一个可能的值。】
十五 parseInt() 方法:
parseInt() 方法返回由字符串转换得到的整数。
十六 函数 函数的参数 return语句:
1、函数的一个重要特点:命名的参数只提供便利,但不是必须的。就相当于一个临时变量。
2、 return 语句:从当前函数退出,并返回一个值。
function sum (num1, num2) {
xnum1 + num2;
}
十七 tagName属性 toLowerCase()方法:
1、tagName属性用来获取对象的标签。
2、toLowerCase()方法用来返回一个字符串,该字符串中的字母被转换为小写字母
ie6不支持大写,为了兼容ie6,一般多会转换为小写。
十八 js手册自有的方法
1、indexOf()方法 用于返回 String(字符串) 对象内第一次出现子字符串的字符位置。(查询该对象是否有这指定的字符串。)
2、lastIndexOf()方法用于返回 String 对象中子字符串最后出现的位置。
比如当一个图片的路径是相对路径的时候ie6得到的图片路径多是绝对路径,其他标准浏览器得到的是相对路径。
这种情况在写js代码的时候,特别是在if判断语句的时候很容易碰到这种问题,结果不相等,因为绝得路径跟相对路径字符串不同。这个时候我们就要用到indexof来解决这个问题
列子:if (huanTuimgJiHe[0].getAttribute('src').indexOf('5.png') > -1),这里是只要这个图片地址有个5.png就相等。
列子2:if ($('p').get(0).innerHTML.indexOf('qwer') > -1) //这里需要记住的是indexOf属于字符换对象的方法。然而.点运算符一般是用来对象.点属性。所以点.的右边是属性,左边就是对象了。所以很多时候要注意.点右边的属性和方法是不是.点左边对象的属性或者方法。比如上面的列子开始我们得到的一个标签对象。而标签对象没有indexOf方法,所以要用innerHTML得到里面的字符串才行。。。
3、charAt()方法用来得到指定位置的字符串,字符串的位置默认是从0开始,也就是说要得到一个字符串的第一个字符就用下标0来访问。
列子:var ziFuShuZi = dRadio[i].value.charAt(0); //得到input的value属性值的第一个字符。
4、substr()方法可以得到一个字符串中任何位置的字符,也可以得到某些字符串之间的所有字符。
列子:var dName = $('div').attr('name').substr(0,1); // 得到div标签的name属性值里面的第一个和第二个之间的字符。
4、isNaN()方法用来指明得到的值是数字还是字符,如果是数字那么就返回false,否则就是返回true
列子:alert(isNaN(1651651)); //返回false
十九: 记录写代码时需要注意的地方:
1、为某个事情用一个函数定义一个方法,该函数如果有参数那么他的的参数要在函数体里面用到,这里需要注意,在函数体里面用这个参数的时候直接用这个函数的参数名,不能把该参数改成字符串的形式在里面用等等、、、、。
2、++ 递增运算符要记住,在写代码的时候经常用到,他表示表达式每执行一次该变量就加1,直到表达式不运行。
3、在写代码的时候要注意:思路要清晰,把想到的思路用注释写在代码里,这样就不会忘记。
每部分的代码是用来干什么的多要用注释写清楚,这样方便以后找。
还有做网页写代码时命名很重要:命名要看得懂,体现明这个名是用来干什么的。
4、写代码好的调试方法是很重要的,js调试方法要充分利用alert语句调试,比如某个条件不成立,我们要知道他为什么不成立,这个时候可以再if条件前面打印出来这个条件到底是什么,有时候火狐也不是很准。
5、当我们一听到要遍历数组,查找某个数组就要想到循环语句:
fon循环 fon in 循环 while循环 do while循环、、、
6、在写代码的时候定义一个全局变量来保存当前选中的节点对象这种思路很常用,要切记。
7、js里面每个方法或属性里面有的是有很多单词组成,每个单词的第一个字母要大写。
8、访问对象的属性有两种方法:一个是就是 . 点运算符,还有个就是 [] 中括号。
二十二 event对象用法以及阻止事件冒泡的属性
event对象必须写在处理程序里面才有意义,或者在处理程序调用event对象,因为只有当你触发这个处理程序的时候,浏览器才会把event及属性传进来。
阻止事件冒泡:当某事件在某标签对象上触发时,就阻止该事件从改标签上向上冒泡。
得到你想阻止的那个标签对象就用event对象的target属性。。
returnValue 属性是event对象的一个属性用在ie中阻止默认动作。
cancelBubble 属性也是event对象的一个属性用在ie中取消冒泡事件。
二十三 在js里面跟哪个标签添加一个事件的方法:
标准浏览器添加事件的方法:addEventListener(事件名, 函数, false冒泡阶段);//如果函数在其他地方已经申明,那么这里直接填已经申明的函数名就可以了
标准浏览器删除事件的方法:removeEventListener(事件名, 函数名, false);
非标准浏览器添加事件的方法:attavhEvent(事件名, 函数);
非标准被浏览器删除事件的方法:detachEvent(事件名, 保存函数的变量);
注意的是非标准浏览器里添加或删除事件它只支持冒泡事件,所以不用加false,还有就是非标准浏览器方法里面的第一个事件名前面要加个on,而标准浏览器不需要加on。
二十四:关于鼠标坐标
Alt键设置或检索一个值,指示Alt键的状态。
altLeft获取或设置一个值,指示左边的ALT键的状态。
的cancelBubble集或检索当前事件是否应的事件处理程序的层次结构得到冒泡。
clientX设置或获取鼠标指针位置相对于窗口的客户区的x坐标,窗口装饰和滚动条除外。
clientY设置或获取鼠标指针位置相对于窗口的客户区的y坐标,窗口装饰和滚动条除外。
ctrlKey属性设置或检索CTRL键的状态。
ctrlLeft设置或获取左Ctrl键的状态。
dataTransfer提供拖放式操作使用预定义的剪贴板格式的访问。
offsetX设置或获取鼠标指针位置相对于触发事件的对象的x坐标。
offsetY设置或获取鼠标指针位置相对于触发事件的对象的y坐标。
的returnValue设置或检索从事件的返回值。
screenX检索用户的屏幕上鼠标指针的相对位置的x坐标。
screenY设置或获取鼠标指针位置相对于用户屏幕的y坐标。
shiftLeft获取左Shift键的状态。
srcElement设置或获取触发事件的对象。
类型设置或检索从事件对象事件的名称。
x设置或检索的x坐标,以像素为单位,鼠标指针的一个相对定位的父元素的相对位置。
Ÿ设置或检索的y坐标,以像素为单位,鼠标指针的一个相对定位的父元素的相对位置。
二十五 添加事件处理程序的一种简单的方法:
在为添加事件的标签的父元素上面添加一个事件处理程序,在处理程序里面用判断语句判断用户触发的是哪个事件目标,在各为其做出需要做的事情。
判断方法:标准浏览器:if(event.target == 事件目标) {}
ie浏览器: if (event.srcElement == 事件目标) {}
添加事件的这种方法可以直接使用this
兼容所有浏览器的事件目标:var target = ev.target || ev.srcElement;
二十六:返回值和拖曳效果
1、一个返回值基本上是用来做比较运算或赋值运算的。自定义对象里面的属性和属性值之间是用:冒号分隔的、
2、网页制作里面的拖曳效果一般分为3部分,onmousedown onmousemove onmouseup 对之 拖动开始 拖动中 拖动结束
二十七:关于event this在js中怎样得到以及onmousemove和onmouseove的区别
1、在html标签上利用属性添加事件,在js里面调用的时候如果要用到this或者event对象,就必须先在html标签上事件里的参数传进来才可在js里面用。
2、onmousemove事件和onmouseove是有区别的,onmousemove是指在对象里面每移动一下就会触发该事件。
onmouseove是指移到对象内就触发该事件,只触发一次、
二十八:关于阻止浏览器默认行为在做拖动事件处理程序中的区别、、、
在做拖动效果的网页中,往往很多时候需要阻止在拖动图片的时候的浏览器所产生的默认行为
这时候要注意了,要拖动一个对象就有三个步骤onmousedown(拖动开始)和onmousemove(拖动中)还有onmouseup(拖动结束),而要阻止浏览器默认行为是要在哪个事件处理程序中阻止了?
标准浏览器阻止拖动图片时产生的默认行为是在onmousedown(按下去的时候)中阻止的
而非标准浏览器则是在onmousemove(移动的时候)中阻止的、
二十九:innerHTML与createElement_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x()以及a()的用法:
innerHTML是用来设置(添加)html结构或者字符,值是由字符串组成,返回的也是一个字符串。
createElement_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x_x()是用来添加一个新的标签对象,括号里面的参数就是要添加的标签对象名称,通常多事和innerHTML一起用。
a()用来添加一个元素在childnodes集合的末尾,括号里面的参数必须是个节点对象,也就是一个标签对象。
三十:Math对象 random属性 创建随机数,结合+=运算符和for循环语句创建随机显示多个字符串。
列子:
var htmlfabric = '
'
' +
'' +
'' +
'' +
'视频' +
'
' +
'
';
var numeral = Math.floor(Math.random() * 9 + 2); //创建随机数字。
var randomicity = ''; //因为这个变量不是被赋值的而是被增加的,所以要等与空字符串。不然就会出现undefinde
for (var i = 0; i < numeral; i++) {
randomicity += htmlfabric; //只要i小于随机数numeral,htmlfabric就会递增给randomicity多少次
}
dDIv.innerHTML = randomicity; //循环后的randomicity的次数就等于在网页上添加多少个htmlfabric。
elderP.a(dDIv);//把dDIv添加在elderP的末尾。
Math.floor()方法用来把Math.random的值转换为整数。
三十一 滚动事件onscroll, 整个网页的滚动事件,必须是在window先才能兼容所有浏览器。
三十二 关于js改变某个标签的属性值问题:
js改变某个标签的属性值,可以直接【对象.属性 = ‘属性值’】
也可以用setAttribute()方法来改变某个标签的属性值。
但是这里最好是用用第一种方法,第二种方法适合改变自己创建的新属性。
三十三 关于ajax 问题:
1、表单中的name属性就是参数,value属性就是参数值;
2、ajax的核心技术就是xmlHttpRequest
3、ajax中get传参和post传参,get传参和post传参post比get更安全,get比post速度更快;
post参数每个变量多要用&符号链接起来:var postStr = "user_name="+ userName +"&user_age="+ userAge +"&user_sex="+ userSex;
get参数接受表单的路径:var url = "ajax_output2.php? user_name="+ userName +"&user_age="+ userAge +"&user_sex="+ userSex;。
4、添加参数,
可以根据需要添加任意多个参数。比如,如果需要增加另一个参数,只需要将其附加到 URL 中并用 “与”(&)字符分开 [第一个参数用问号(?)和脚本名分开]。
5、xmlHttpRequest 的几个属性:
·open():建立到服务器的新请求。
·send():向服务器发送请求。
·abort():退出当前请求。
·readyState:提供当前 HTML 的就绪状态。
·responseText:服务器返回的请求响应文本
status:服务器的HTTP状态码(200对应OK,404对应Not Found(未找到),等等)
responseXML:服务器的响应,表示为XML。这个对象可以解析为一个DOM对象
6、xmlHttpRequest 的几个方法:
abort():停止当前请求
getAllResponseHeaders():把HTTP请求的所有响应首部作为键/值对返回
getResponseHeader("header"):返回指定首部的串值
open("method", "url"):建立对服务器的调用。method参数可以是GET、POST或PUT。url参数可以是相对URL或绝对URL。这个方法还包括3个可选的参数
send(content):向服务器发送请求
setRequestHeader("header", "value"):把指定首部设置为所提供的值。在设置任何首部之前必须先调用open()
7、因为安全限制,ajax的POST方法是不支持跨域的。所以你可以通过get方法进行跨域请求。也可以通过
三十四:关于时间戳
时间戳表示1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数
php输出的时间戳是总秒数,而js输出的时间戳是总毫秒数。
获取php时间戳:var endTime = ;
获取js时间戳:ar now = new Date().getTime()
php和js时间戳互转:var startDate = new Date(php时间戳* 1000).getTime();//php时间戳转换为js时间戳
js转换为php时间戳就相反了。
js学习总结的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- js学习之变量、作用域和内存问题
js学习之变量.作用域和内存问题 标签(空格分隔): javascript 变量 1.基本类型和引用类型: 基本类型值:Undefined, Null, Boolean, Number, String ...
- 【Knockout.js 学习体验之旅】(3)模板绑定
本文是[Knockout.js 学习体验之旅]系列文章的第3篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...
- 【Knockout.js 学习体验之旅】(2)花式捆绑
本文是[Knockout.js 学习体验之旅]系列文章的第2篇,所有demo均基于目前knockout.js的最新版本(3.4.0).小茄才识有限,文中若有不当之处,还望大家指出. 目录: [Knoc ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- js学习篇1--数组
javascript的数组可以包含各种类型的数据. 1. 数组的长度 ,直接用 length 属性; var arr=[1,2,3]; arr.length; js中,直接给数组的length赋值是会 ...
- Vue.js学习笔记(2)vue-router
vue中vue-router的使用:
- NODE.JS学习的常见误区及四大名著
NODE.JS学习的常见误区及四大名著 前段时间由于不满于社区里很多人对于NODE.JS的种种误解而写了一篇文章名为: NODE.JS之我见:http://www.cnblogs.com/pugang ...
- Node.js学习系列总索引
Node.js学习系列也积累了一些了,建个总索引方便相互交流学习,后面会持续更新^_^! 尽量写些和实战相关的,不讲太多大道理... Node.js学习笔记系列总索引 Nodejs学习笔记(一)--- ...
- 【入门必备】最佳的 Node.js 学习教程和资料书籍
Web 开发人员对 Node.js 的关注日益增多,更多的公司和开发者开始尝试使用 Node.js 来实现一些对实时性要求高,I/O密集型的业务.这篇文章中,我们整理了一批优秀的资源,你可以得到所有你 ...
随机推荐
- 2435: [Noi2011]道路修建 - BZOJ
Description 在 W 星球上有 n 个国家.为了各自国家的经济发展,他们决定在各个国家之间建设双向道路使得国家之间连通.但是每个国家的国王都很吝啬,他们只愿意修建恰好 n – 1条双向道路. ...
- 【转发】SSH无密码登录的配置
免责声明: 本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除. 原文作者:http://cn.soulmachine.me/ 原文地址:http ...
- C#textbox右击弹出菜单
给窗口体拖一个contextMenuTrip 控件,也就是右键菜单控件,这时你就不要给这个控件写内容了, 选中textBox 然后点属性窗口,把它的contextMenuTrip 属性选中你刚才托的那 ...
- ssh连接慢
suse刚装完,开始用ssh的时候,总会遇到这样的问题:输入了用户名以后,等半天才出输入密码的框,很是急人.这是dns反查造成的.解决方法:编辑 /etc/ssh/sshd_conf , 将 #Use ...
- uva 11235
数据结构 RMQ算法 左右左右 写得有点晕了 ..... /****************************************************************** ...
- Java学习笔记(二)UML基础
用例图:代表系统的一个功能模块,仅仅是系统功能的描述.用例图包括:用例.角色.角色和用例之间的关系以及系统内用例之间的关系. 类图:表示系统中包含哪些实体,各实体之间如何关联. 类图除了表示实体内部结 ...
- lintcode :旋转字符串
题目: 旋转字符串 给定一个字符串和一个偏移量,根据偏移量旋转字符串(从左向右旋转) 样例 对于字符串 "abcdefg". offset=0 => "abcdef ...
- 毕向东JAVA视频讲解笔记(前三课)
1,定义一个类,因为java程序都定义类中,java程序都是以类的形式存在的,类的形式其实就是一个字节码文件最终体现. 2,定义一个主函数.为了让该类可以独立运行. 3,因为演示hello world ...
- python logging 学习笔记
logging.basicConfig函数各参数: filename: 指定日志文件名 filemode: 和file函数意义相同,指定日志文件的打开模式,'w'或'a' format: 指定输出的格 ...
- 搜索之BM25和BM25F模型
www.netfoucs.com/article/wdxin1322/94603.html#