对象
toString:所有对象都有toString()方法,基本类型除null和undefined外也有
2.toString() 语法错误因为会把 . 当成数字运算,解决办法
2..toString(); // 第二个点号可以正常解析
2 .toString(); // 注意点号前面的空格
(2).toString(); // 2先被计算
默认情况下,toString()方法被每个Object对象继承。如果此方法在自定义对象中未被覆盖,toString()返回 “[object type]”,其中type是对象的类型
第一个object:ecma规范要求toString 方法返回[object class] ,不过大多数内部类覆盖了toString方法,所以只有自定义对象的会返回[object object] ,客户端内建的对象一般class都是为Object(大写) ,虽然很多类覆盖了toString方法,但是我们可以用Object.prototype.toString.apply(o) 显示调用object.toString。
delete obj[属性名]才能删除属性名,该属性设置为null/undefined只是解除与值的关联 。用obj.hasOwnProperty(i)检验
原型属性:可以把任何类型的值赋给它(prototype)。 然而将原子类型赋给 prototype 的操作将会被忽略。
function Foo() {
}
Foo.prototype = 1; // 无效
hasOwnProperty:hasOwnProperty 是 JavaScript 中唯一一个处理属性但是不查找原型链的函数。
// 修改Object.prototype
Object.prototype.bar = 1;
var foo = {
goo: undefined};
foo.bar; // 1
'bar' in foo; // true
for(let i in foo)
// ——这3个都会查找
函数声明
1、将匿名函数赋值给变量
foo; // 'undefined'
foo(); // 出错:TypeError
var foo = function() {
};
由于 var 定义了一个声明语句,对变量 foo 的解析是在代码运行之前,因此 foo 变量在代码运行时已经被定义过了。
但是由于赋值语句只在运行时执行,因此在相应代码执行之前, foo 的值缺省为 undefined。
命名函数的赋值表达式
2、另外一个特殊的情况是将命名函数赋值给一个变量。
var foo = function bar() {
bar(); // 正常运行
}
bar(); // 出错:ReferenceError
bar 函数声明外是不可见的,这是因为我们已经把函数赋值给了 foo; 然而在 bar 内部依然可见。这是由于 JavaScript 的 命名处理 所致, 函数名在函数内总是可见的。
注意:在IE8及IE8以下版本浏览器bar在外部也是可见的,是因为浏览器对命名函数赋值表达式进行了错误的解析, 解析成两个函数 foo 和 bar
this
函数调用的时候内部this指向window
常见误解:
Foo.method = function() {
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 对象。——指向window(严格模式下是undefined)
function Foo() {
}
Foo.prototype.method = function() {
};
function Bar() {
}
Bar.prototype = Foo.prototype;
new Bar().method();
当 method 被调用时,this 将会指向 Bar 的实例对象。
函数 是 JavaScript 中唯一拥有自身作用域的结构
循环中的闭包:
for(var i = 0; i < 10; i++) {
(function(e) {
setTimeout(function() {
console.log(e); // 可以打印1-10
}, 1000);
})(i);
}
for(var i = 0