字符串、数字、布尔值在运行时临时转换成对应的包装对象从而具有方法,但是数字的字面值后直接用点操作符再接方法却会出错:
2.toString() // SyntaxError
这是因为js解析器试图把2
和.
连在一起看成浮点数。解决办法:
2..toString()
2 .toString()
(2).toString()
删除属性只能用delete
操作符。
把原始值(undefined、null、布尔值、数字、字符串)直接赋给prototype无效。
不要扩展内置类型的原型。除非这种扩展是为了和js的新标准保持一致(如Array.forEach)。
hasOwnProperty
是JavaScript中唯一一个处理属性但不查找原型链的函数。
this
在全局范围和函数直接调用时指向全局对象,方法调用时指向调用对象,调用构造函数时指向新创建的对象。
严格模式下函数内的arguments对象不会随着形参的修改而自动更新:
function f(a) {
"use strict";
a = 42;
return [a, arguments[0]];
}
f(17); // [42, 17]
使用arguments.callee
会严重影响现代js引擎的性能。严格模式下arguments.callee
已经被废除,引用它会显示TypeError
。
访问函数内的foo
变量时,js按照以下顺序查找:
- 作用域内是否有
var foo
的定义 - 函数形式参数是否有
foo
- 函数自身是否叫
foo
- 回溯上一级作用域,按照同样的方式查找
js中undefined
是一个变量,而不是关键字,验证如下:
var foo = [1, 2, 3];
5 in foo; // 不管在 Firebug 或者 Chrome 都返回 false
foo[5] = undefined;
5 in foo; // 不管在 Firebug 或者 Chrome 都返回 true
使用==
或===
比较对象时,比较的是两个对象的引用是否是同一个。
检测一个对象的类型推荐使用Object.prototype.toString
方法:
function is(type, obj) {
var clas = Object.prototype.toString.call(obj).slice(8, -1);
return obj !== undefined && obj !== null && clas === type;
}
instanceof
操作符用来比较两个操作数的构造函数。只有在比较自定义的对象时才有意义。有一点需要注意,instanceof
用来比较属于不同 JavaScript 上下文的对象(比如,浏览器中不同的文档结构)时将会出错, 因为它们的构造函数不会是同一个对象。
将一个值加上空字符串可以将其转换成字符串。一元加号操作符可以将字符串转换成数字。
字符串转换成数字的常用方法:
+'010' === 10
Number('010') === 10
parseInt('010', 10) === 10 // 用来转换为整数
+'010.2' === 10.2
Number('010.2') === 10.2
parseInt('010.2', 10) === 10
定时处理(setTimeout
和 setInterval
)不是ECMAScript的标准,它们是在DOM中实现的。
看完这篇秘密花园想起一句话:“一本书没看懂不用纠结太久,重要的东西会在不同的书中以各种方式重复出现”,这篇文章把以前看的书中重要的东西帮我强调了一遍。