Simple Note

JavaScript秘密花园 阅读笔记

2016.01.12

字符串、数字、布尔值在运行时临时转换成对应的包装对象从而具有方法,但是数字的字面值后直接用点操作符再接方法却会出错:

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按照以下顺序查找:

  1. 作用域内是否有var foo的定义
  2. 函数形式参数是否有foo
  3. 函数自身是否叫foo
  4. 回溯上一级作用域,按照同样的方式查找

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中实现的。

看完这篇秘密花园想起一句话:“一本书没看懂不用纠结太久,重要的东西会在不同的书中以各种方式重复出现”,这篇文章把以前看的书中重要的东西帮我强调了一遍。

Comments
Write a Comment