javascript 密码花园 并不清晰的js基础 总结(1)

259 阅读3分钟
直接给 地址 不喜欢看我写的 可以直接去人家官网去看 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.prototype
var 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.方法调用 this
test.foo(); 这个例子中,this 指向 test 对象。
d.调用构造函数
new foo();
如果函数倾向于和 new 关键词一块使用,则我们称这个函数是 构造函数。 在函数内部,this 指向新创建的对象。
e.显式的设置 this
function 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指向 Foo
function 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