直接给 地址 不喜欢看我写的 可以直接去人家官网去看
bonsaiden.github.io/JavaScript-…
1.js 所有变量
都可以当作 对象使用,除了两个例外 null 和 undefined。
false.toString(); //'false' [1,2,3].toString(); //'1,2,3'2.toString(); 出错:SyntaxError js解析错误 但可以(2).toString()
2.删除属性
var obj={bar:1,foo:2}; obj.bar=null; 或 obj.bar=undefined; 并不能真正的删除属性, 而仅仅是移除了属性和值的关联delete obj.bar//遍历对象for(var i in obj){if(obj.hasOwnProperty(i)){console.log(i,obj[i]);}}
3. hasOwnProperty
1.是 JavaScript 中唯一一个处理属性但是不查找原型链的函数Object.prototype.bar = 1; // 修改 Object.prototypevar foo = {moo: 2};for(var i in foo) {console.log(i); // 输出两个属性:bar 和 moo}通过Object.prototype 原型上的 hasOwnProperty 函数 过滤掉(比如 Object.prototype)扩展的属性for(var i in foo) {if (foo.hasOwnProperty(i)) {console.log(i); // 输出两个属性:bar}}重点:推荐总是使用 hasOwnProperty。不要对代码运行的环境做任何假设,不要假设原生对象是否已经被扩展了。2.JavaScript 不会保护 hasOwnProperty 被非法占用,因此如果一个对象碰巧存在这个属性, 就需要使用外部的 hasOwnProperty 函数来获取正确的结果。var foo = {hasOwnProperty: function() {return false;},bar: 'Here be dragons'};foo.hasOwnProperty('bar'); // 总是返回 false({}).hasOwnProperty.call(foo, 'bar'); // true
4.this 的工作原理
this 的处理机制。 在五种不同的情况下 ,this 指向的各不相同。
a.全局范围内 this;当在全部范围内使用 this,它将会指向全局对象。(浏览器中全局对象 window)b.函数调用
foo(); 这里 this 也会指向全局对象。c.方法调用 thistest.foo(); 这个例子中,this 指向 test 对象。d.调用构造函数
new foo();
如果函数倾向于和 new 关键词一块使用,则我们称这个函数是 构造函数。 在函数内部,this 指向新创建的对象。e.显式的设置 thisfunction foo(a, b, c) {}var bar = {};foo.apply(bar, [1, 2, 3]); // 数组将会被扩展,如下所示foo.call(bar, 1, 2, 3); // 传递到foo的参数是:a = 1, b = 2, c = 3当使用 Function.prototype 上的 call 或者 apply 方法时,函数内的 this 将会被 显式设置为函数调用的第一个参数。函数调用的规则在上例中已经不适用了,在foo 函数内 this 被设置成了 bar。重点:常见误解Foo.method = function() {// this 方法调用 this指向 Foofunction test() {// this 将会被设置为全局对象(译者注:浏览器环境中也就是 window 对象)}test();}//test 中获取对 Foo 对象的引用,我们需要在 method 函数内部创建一个局部变量指向 Foo 对象
Foo.method = function() {
var that = this;
function test() {
// 使用 that 来指向 Foo 对象
}
test();
}
特殊:
方法的赋值表达式 一个方法赋值给一个变量 如:
var test = someObject.methodTest;
test();
上例中,test 就像一个普通的函数被调用;因此,函数内的 this 将不再被指向到 someObject 对象。
this 的晚绑定特性似乎并不友好,但这确实是基于原型继承赖以生存的土壤。
function Foo() {}
Foo.prototype.method = function() {};
function Bar() {}
Bar.prototype = Foo.prototype;
new Bar().method();
当 method 被调用时,this 将会指向 Bar 的实例对象。
5.闭包
闭包是函数,是函数内定义的函数,因为它能访问父级函数内的内部变量 所以取了个名字叫闭包
闭包就是能够读取其他函数内部变量的函数
在本质上,闭包是将函数内部和函数外部连接起来的桥梁
所以函数的这些闭包 都会被return 出去
因为 函数 是 JavaScript 中唯一拥有自身作用域的结构,因此闭包的创建依赖于函数。
a.模拟私有变量
function fatherfn(start){var i=start;return{child_a:function(){i++;},child_b:function(){return i;}}}var fa=fatherfn(4);fa.child_a();fa.child_b(); //5