【变量】
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(你懂得)