js笔记精华版

【变量】
    1.重复声明变量不仅是合法的,而且也不会造成任何错误。
    2.如果尝试给一个用var语句的变量赋值,js会隐式声明这个变量,
    但注意,隐式声明的变量总是被创建一个全局变量,即使该变量只是在
    一个函数体内使用。
    3.局部变量和全局变量同名可以有效地隐藏全局变量。
    4.局部语句必须是var语句,否则就是全局变量了。
    5.js中没有块级作用域的概念,函数中声明的所有变量,无论是在哪
    里声明,在整个函数中他们都是有定义的,这个说法对全局变量也是起作用的。
    ex:

var scope = "global";
function F(){
alert(scope);
var scope = "local";
}
F();

    6.js中所有的数字都是浮点型的,所以除法的结果也是浮点型的,除数是0的
    结果为正无穷大或负无穷大,而0/0的结果则是NaN。

【运算符】
    1.“==”(类型自动转换,然后比较值),“===”(类型和值一块比较)。
    2.typeof(),返回一个字符串来表示一个操作数的类型。
    3.instanceof,左边是一个对象,右边是对象类型的名字。
    4.除了加号外,其他运算符会把非数字变成数字。
    5.比较运算符只能在数字或者字符串上执行,所以不是数字或者字符串的运算数
    将被转换为数字或字符串。

【对象和数组】
    1.constructor属性:每个对象都有一个constructor属性,它引用了初始化这个
    对象的构造函数。
    2.hasOwnProperty(),如果此方法中指定的参数属性来自本地定义的一个非继承
    的属性,此方法返回true。
ex:

var o = {};
o.hasOwnProperty("toString");// return false
3.isPrototypeOf(),//如果此方法所属的对象是参数的原型对象,那么就返回true。
ex:
var o = {};
Object.prototype.isPrototypeOf(o);  //true
Object.isPrototypeOf(o);  //false

4.思考如何自定义方法比较两个对象是否相等?

【函数】
1.函数直接量
ex:

(1)var f = function(x){return x*x;}
(2)var f = function fact(x){return x*x;}
(3)var f = (function(x){return x*x;})(10);// 定义后马上调用

【正则表达式】
    1.正则表达式的两种定义:
    (1)var reg = /regex/[i/g/m]; // i:忽略大小写,g:上下文查找,m:多行查找
    (2)var reg = new Regex("regex",["i/g/m"]);
    2.字符串的匹配:
    reg.test(string);// return true or false
    string.match(reg);// 返回所有匹配项的数组
    string.exec(reg);// 返回第一个匹配项,其他的是反向引用
    注意:exec()方法的全局检索和非全局检索区别在于:
    全局检索会多出一个lastIndex索引来指示下一次开始匹配字符的位置。
    而且可以多次调用exec()方法来匹配所有匹配文本。
    对正则的exec方法和字符串的match方法,当没有全局标志g时,
    它们两的行为是一样的,有index,input,lastindex等属性!
    除了返回与表达式相匹配的文本外,所有匹配的子串也会返回!
    3.元字符:
    ( [ { \ ^ $ | } ? * + .
    任何时候要在正则表达式中使用元字符都必须对它们进行转义,用'\'。
    ex: 

var reg = /\?/;
var reg = new RegExp("\\?");  // 这样就和java类似。

4.特殊转义序列:

var reg = /(dog)\1/;  等价于  var reg = /dogdog/;

5.特殊字符序列:

var str1 = "12345678";
var reg = /(\d{4})(\d{4})/;
var str2 = str1.replace(reg,"$2$1");
alert(str2); // outputs: "56781234";

6.非捕获性分组:

var t = "#12345678";
var reg = /#(?:\d+)/;
reg.test(t);
alert(RegExp.$1); // outputs "";

7.前瞻:
正向前瞻:将模式放在(?=和)之间

var str1=”bedroom”;
var str2=”bedding”;
var re=/(bed(?=room))/;
alert(re.test(str1));//outputs “true”
alert(RegExp.$1));//outputs “bed”;
alert(re.test(str2))//ouputs “false”;

----------------------------------------
负向前瞻:将模式放在(?和)之间

var str1=”bedroom”;
var str2=”bedding”;
var re=/(bed(?!room))/;
alert(re.test(str1));//outputs “false”
alert(RegExp.$1));//outputs “bed”;
alert(re.test(str2))//ouputs “true”;

8.边界:
边界 描述
^ 行开头
$ 行结尾
\b 单词的边界
\B 非单词的边界

【this】
    在全局环境中,this等于window,而当函数作为某个方法的对象调用时,
    this等于那个对象。不过。匿名函数的执行环境具有全局性,因此其this
    对象通常指向window。
    ex:

var name = "The Window";
var object = {
    name: "My Object",
    getNameFunc: function(){
       return function(){
          return this.name;
       };
    }
};
alert(object.getNameFunc()());// "The Window"

    出现上面的情况的原因是:每个活动对象在被调用时,其活动对象会自动取得
    两个特殊变量:this和arguments。内部函数在搜索这两个变量时,只会搜索到其
    活动对象为止,因此不可能直接访问外部函数中的这两个变量。

    解决方法,把外部的this对象放在一个闭包能访问到的变量里:

var name = "The Window";
var object = {
   name : "My Object",
   getNameFunc : function(){
      var that = this;
      return function(){
         return that.name;
      };
   }
};
alert(object.getNameFunc()());  // "MyObject"

-------------------------------------------------------------------------
this例题:
【纯粹的调用】

function test(){
  this.x = 1;
  alert(this.x);
}

// this代表全局对象Global
// 证明this代表Global对象

var x = 1;
function test(){
  this.x = 0;
}
test();
alert(x); // 0

----------------------------------------------
【this作为对象方法调用】

function test(){
  alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); // 1
// this代表o这个对象

----------------------------------------------
【this作为构造函数调用】

function test(){
   this.x = 1;
}
var o = new test();
alert(o.x); // 1
// this代表这个新对象

-----------------------------------------------
【apply调用】:apply是函数的方法,改变函数的调用对象。

var x = 0;
function test(){
  alert(this.x);
}
var o={};
o.x = 1;
o.m = test;
o.m.apply(); //0     apply参数为空时,this代表Global
o.m.apply(o);

【执行上下文】
    a.变量、函数表达式——变量声明,默认赋值为undefined。
    b.this——赋值。
    c.函数声明——赋值。
    这三种数据的准备情况我们称之为“执行上下文”或者“执行上下文环境”。

【js代码的位置】

        关于这个问题,yahoo团队做过一个最佳实践,比较经典的描述如下:
        样式在上,脚本在下。         

        当我们把样式放在<head>标签中时,浏览器在渲染页面时就能尽早的知道每个标签的样式,我们的用户就会感觉这个页面加载的很快。         

        但是如果我们将样式放在页面的结尾,浏览器在渲染页面时就无法知道每个标签的样式,     直到CSS被下载执行后。

        另一方面,对于Javascript来说,因为它在执行过程中会阻塞页面的渲染,所以我们要把它放在页面的结尾。

 

好累,谢谢大家。843294669(你懂得)

转载于:https://my.oschina.net/843294669/blog/785715

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值