js学习笔记
来源:互联网 发布:mac下的数据库软件 编辑:程序博客网 时间:2024/05/01 05:44
1. Js中创建全局变量特别容易(例如不使用var 声明变量就是全局变量),但是使用全局变量容易发生冲突。因此建议尽可能使用var 去声明变量。
(1)如果使用链式:var a = b = 0;那么b也是全局变量。应当:var a, b;(赋值是从右到左赋值的。
(2)可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)。(有局部变量,就先使用局部变量,否则查找全局变量。)
(3)var声明的变量不可以delete
(4)使用单var形式
2. 使用for()使用for循环时,应该在循环外求出循环长度。
for (var i = 0; i < myarray.length; i++) {
}
3. document.images: 页面上所有的图片元素document.links : 所有a标签元素document.forms : 所有表单document.forms[0].elements : 页面上第一个表单中的所有域
4. for-in
循环应该用在非数组对象的遍历上,使用for-in
进行循环也被称为“枚举”。
Eg: var man = { hands: 2, legs: 2, heads: 1};
for (var i in man) { if (man.hasOwnProperty(i)) { // 过滤 console.log(i, ":", man[i]); }}/* 控制台显示结果hands : 2legs : 2heads : 1*/
为了避免枚举man的时候出现clone()方法,你需要应用hasOwnProperty()
方法过滤原型属性。如果不做过滤,会导致clone()函数显示出来,在大多数情况下这是不希望出现的
5. JavaScript的变量在比较的时候会隐式类型转换。这就是为什么一些诸如:false == 0 或 “” == 0 返回的结果是true。为避免引起混乱的隐含类型转换,在你比较值和表达式类型的时候始终使用===和!==操作符。
6. 给setInterval(), setTimeout()和Function()构造函数传递字符串,大部分情况下,与使用eval()是类似的,因此要避免。在幕后,JavaScript仍需要评估和执行你给程序传递的字符串:
// 反面示例setTimeout("myFunc()", 1000);setTimeout("myFunc(1, 2, 3)", 1000);// 更好的setTimeout(myFunc, 1000);setTimeout(function () { myFunc(1, 2, 3);}, 1000);
6. 使用parseInt()你可以从字符串中获取数值,该方法接受另一个基数参数,这经常省略,但不应该。
7. 空格的使用同样有助于改善代码的可读性和一致性。在写英文句子的时候,在逗号和句号后面会使用间隔。在JavaScript中,你可以按照同样的逻辑在列表模样表达式(相当于逗号)和结束语句(相对于完成了“想法”)后面添加间隔。
适合使用空格的地方包括:
· for循环分号分开后的的部分:如for (var i = 0; i < 10; i += 1) {...}
· for循环中初始化的多变量(i和max):for(var i = 0, max = 10; i < max; i += 1) {...}
· 分隔数组项的逗号的后面:var a = [1, 2, 3];
· 对象属性逗号的后面以及分隔属性名和属性值的冒号的后面:var o = {a: 1, b: 2};
· 限定函数参数:myFunc(a, b, c)
· 函数声明的花括号的前面:function myFunc() {}
· 匿名函数表达式function的后面:var myFunc =function () {};
使用空格分开所有的操作符和操作对象是另一个不错的使用,这意味着在+, -, *, =, <, >, <=, >=, ===,!==, &&, ||, +=等前后都需要空格。
8. 函数声明:
function 函数名称 (参数:可选){ 函数体 }
函数表达式:
function 函数名称(可选)(参数:可选){ 函数体 }
说明:对于函数声明,在执行代码前就会读取函数声明,这就意味着可以把函数声明放在调用该函数的后面。
9. JavaScript 中的函数是对象。每个函数对象都有一个名为 call 的方法,它将函数作为第一个参数的方法进行调用。就是说,作为函数第一个参数传递给 call 的任何对象都将在函数调用中成为“this”的值。这一技术对于调用基类构造函数来说非常有用.
有一点需要记住,绝不要调用包含“this”(却没有所属对象)的函数。否则,将违反全局命名空间,因为在该调用中,“this”将引用全局对象,而这必然会给您的应用程序带来灾难。
10. 定义构造函数,如下所示:
function DogConstructor(name) {
this.name = name;
this.respondTo = function(name) {
if(this.name == name) {
alert(“Woof”);
}
};
}
var spot = new DogConstructor(“Spot”);
spot.respondTo(“Rover”); // nope
spot.respondTo(“Spot”); // yeah!
实际上,在 JavaScript中构造函数的名称通常就是所模拟的类的名称,因此在上面的示例中,可以直接命名构造函数 Dog:
// Think of this as class Dog
function Dog(name) {
//instance variable
this.name = name;
//instance method? Hmmm...
this.respondTo = function(name) {
if(this.name == name) {
alert(“Woof”);
}
};
}
var spot = new Dog(“Spot”);
在上面的 Dog定义中,我定义了名为 name的实例变量。使用 Dog作为其构造函数所创建的每个对象都有它自己的实例变量名称副本(前面提到过,它就是对象词典的条目)。这就是希望的结果。毕竟,每个对象都需要它自己的实例变量副本来表示其状态。但如果看看下一行,就会发现每个 Dog实例也都有它自己的 respondTo方法副本,这是个浪费;您只需要一个可供各个 Dog实例共享的 respondTo实例!通过在 Dog 以外定义 respondTo,可以避免此问题,如下所示:
function respondTo() {
//respondTo definition
}
function Dog(name) {
this.name = name;
//attached this function as a method of the object
this.respondTo = respondTo;
}
11. 原型
在 JavaScript中,每个函数都有名为“prototype”的属性,用于引用原型对象。此原型对象又有名为“constructor”的属性,它反过来引用函数本身。
alert(Dog.prototype.isPrototypeOf(spot));
alert(spot.constructor === Dog.prototype.constructor);
alert(spot.constructor === Dog);
alert(Dog ===Dog.prototype.constructor); 都返回true
alert(spot.hasOwnProperty("constructor"));
// The constructor property belongs to Dog.prototype //false
// The line below displays “true”
alert(Dog.prototype.hasOwnProperty("constructor")) //true
hasOwnProperty:
是用来判断一个对象是否有你给出名称的属性或对象。不过需要注意的是,此方法无法检查该对象的原型链中是否具有该属性,该属性必须是对象本身的一个成员。
isPrototypeOf
是用来判断要检查其原型链的对象是否存在于指定对象实例中,是则返回true,否则返回false。
当您尝试访问对象的属性/方法时,JavaScript将检查该属性/方法是否是在该对象中定义的。如果不是,则检查对象的原型。如果还不是,则检查该对象的原型的原型,如此继续,一直检查到 Object.prototype。
12. 通过将方法放在原型内部,可以使对象共享方法,而不必使每个对象都有单独的函数对象实例。
function GreatDane() { }
GreatDane.prototype.getBreed = function() {
return“Great Dane”;
};
- JS学习笔记
- js学习笔记
- js宝典学习笔记
- js学习笔记(一)
- js宝典学习笔记
- Propoty.js学习笔记
- Prototype.js 学习笔记
- JS学习笔记1
- JS学习笔记2
- prototype.js学习笔记
- JS学习笔记
- JS学习笔记1
- prototype.js学习笔记
- js学习笔记
- JS学习笔记一
- JS学习笔记
- js学习笔记
- js学习笔记
- eclipse 快捷键之Ctrl+Alt+Down和Ctrl+Alt+Up 失效
- 云存储算法研究: 一致性哈希算法解析–节选《揭秘云存储》
- Python使用DB封装
- spring 邮件发送
- hdu 2993
- js学习笔记
- java实现将多个文件打包成zip压缩文件以及对压缩文件的加密
- 字符串之最长回文子串 manacher算法
- 突然的试验研究是什么
- Apache是怎样启动的
- LeetCode总结 -- 树的遍历篇
- javaScript操作table的整理
- POJ-3273-Monthly Expense
- 8.11-8.15知识点总结(待编辑)