js学习笔记

来源:互联网 发布:mac下的数据库软件 编辑:程序博客网 时间:2024/05/01 05:44

1.     Js中创建全局变量特别容易(例如不使用var 声明变量就是全局变量),但是使用全局变量容易发生冲突。因此建议尽可能使用var 去声明变量。

(1)如果使用链式:var a = b = 0;那么b也是全局变量。应当:var a, b;(赋值是从右到左赋值的。

2)可以在函数的任何位置声明多个var语句,并且它们就好像是在函数顶部声明一样发挥作用,这种行为称为 hoisting(悬置/置顶解析/预解析)。(有局部变量,就先使用局部变量,否则查找全局变量。)

3var声明的变量不可以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循环中初始化的多变量(imax)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”;

};

 

0 0
原创粉丝点击