【变量】
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 false3.isPrototypeOf(),//如果此方法所属的对象是参数的原型对象,那么就返回true。ex:var o = {};Object.prototype.isPrototypeOf(o); //trueObject.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代表Globalo.m.apply(o);
【执行上下文】
a.变量、函数表达式——变量声明,默认赋值为undefined。 b.this——赋值。 c.函数声明——赋值。 这三种数据的准备情况我们称之为“执行上下文”或者“执行上下文环境”。【js代码的位置】
关于这个问题,yahoo团队做过一个最佳实践,比较经典的描述如下:
样式在上,脚本在下。当我们把样式放在<head>标签中时,浏览器在渲染页面时就能尽早的知道每个标签的样式,我们的用户就会感觉这个页面加载的很快。
但是如果我们将样式放在页面的结尾,浏览器在渲染页面时就无法知道每个标签的样式, 直到CSS被下载执行后。
另一方面,对于Javascript来说,因为它在执行过程中会阻塞页面的渲染,所以我们要把它放在页面的结尾。
好累,谢谢大家。843294669(你懂得)