多年以后,面对行刑队,奥雷里亚诺·布恩迪亚上校将会回想起父亲带他去见识冰块的那个遥远的下午。
--《百年孤独》
在读一本书之前,你永远不知道他对你的影响,一年多前碰到这本书,拜服于作者循序渐进、由浅入深的文笔,
特别是作用域、继承等方面,作为入门两大本之一,不无道理。另外作者写的两本佳作也十分值得一读。《编写可维
护的JavaScript》和《高性能的JavaScript》对于形成良好的JavaScript编码风格有所帮助。接下来把当初看书时
的一些笔记和书摘整理整理,贴上来。
还有,这当然不是《百年孤独》的读后感。
------------------------ 正文-----------------------------
一、严格模式
1 "use strict";// 声明在此则表示 这个js 都为严格模式,放在第一行有效。 2 function a () { 3 "use strict"; 4 // 在function内部 声明这个function为严格模式 5 6 }
1、严格模式下无法再意外创建全局变量
以下是在chrome 下的输出结果。
使用后
使用前
疗效显著。
2、 在严格模式下, 试图删除不可删除的属性时会抛出异常
使用后
var a = 4; (function () { "use strict"; delete a; //报错,Uncaught SyntaxError: Delete of an unqualified identifier in strict mode. })();
使用前
var a = 4; (function () { delete a; console.log(a); // a=4 })();
a = 4; (function () { delete a; console.log(a); // a is undefined ,这时delete才真正起效 })();
更多关于delete 说明。
3、严格模式要求一个对象内的所有属性名在对象内必须唯一
正常模式下重名属性是允许的, 重名的最后一个属性决定其属性值. 因为只有最后一个属性有效, 当修改代码要改变属性
值而却不是修改的最后一个重名属性的时候。在严格模式下, 重名属性被认为是语法错误:
"use strict"; var o = { p: 1, p: 2 }; // !!! 语法错误
4、严格模式要求函数的参数名唯一
5、严格模式给不可写属性赋值、只读属性赋值会报错。(非严格模式下则不会有反馈)
6、严格模式禁用 with
7、使用 arguments.callee 会报错
... ...
Mozailla 关于严格模式的详细讲解 严格模式
二、五大基本数据类型和Object类型
Undefined 、Null 、Boolean、Number、和String
1、常见的typeof 判断类型
typeof undefined //"undefined"typeof "ajdf" // "string" typeof new String("ajdf") //"object" typeof null //"object" typeof NaN //"number"
2、undefined 与null的区别
先看两个比较值
console.log(undefined == null); //true console.log(undefined === null);//false
实际上 undefined 值是派生自null值的,ECMA-262规定对他们的相等性测试要返回true
null表示"没有对象",即该处不应该有值。典型用法是:
(1) 作为函数的参数,表示该函数的参数不是对象。
(2) 作为对象原型链的终点。
(3)使用某个对象结束后人工置空, 表示不需要此对象。实际回收内存时间由垃圾回收机制决定。
undefined表示"缺少值",就是此处应该有一个值,但是还没有定义。典型用法是:
(1)变量被声明了,但没有赋值时,就等于undefined。
(2) 调用函数时,应该提供的参数没有提供,该参数等于undefined。
(3)对象没有赋值的属性,该属性的值为undefined。
(4)函数没有返回值时,默认返回undefined。
其他语言只有null,想了解JavaScript 创造者Brendan Eich为毛整了俩,请参阅 undefined 与null的区别
3、boolean的隐式转换
这里只需记住能转换为false的情况。
String: "" --> false
Number: 0 和NaN -->false
Object: null -->false
Undefined: undefined --> false
条件判断时通常不会显式的转换为boolean值而是利用各类型的隐式转换进行判断。
4、Number类型注意事项
- 不要出现 NaN == a 的判断,NaN跟任何数都不相等,isNaN(a)方法可以达到想要的效果。任何涉及NaN的操作返回都是NaN,
- 使用parseInt() 方法,请尽量使用parseInt(a, 10)的方式指明为10进制。
- 涉及要显示页面的数值时,请用toFixed()进行格式化,避免出现 0.1 +0.2 = 0.30000000000000004
- 不要用浮点数作为判断根据,因为存在误差。
5、String 类型
- ECMAScript 字符串的不可变性。字符串一旦创建,他们的值都是不可变的。
- 字符串拼接操作时
var lang = "Java‘; lang = lang + "Script";
这时首先创建一个新的字符串,在放入Java和script ,最后销毁"Java" 和 "Script"字符串。
3.多数情况下,toString() 不必传递参数,但是当是数字时,例如
var num = 10 ; num.toString(2); // "1010" num.toString(16); // "a"
可以利用这个特性实现进制间的转换。
6、运算符
比较字符串时,比较的是”ACSCII“顺序,比如”B” < "a","23"< "3"都是true;
字符与数字比较时, "a"< 3; //false 因为"a” 被转换为NaN了。
如果一个操作数是对象,则调用这个对象的valueOf()方法。如果没有valueOf()方法,则调用toString()方法。
== 类型转换时,是向下转换。
switch 比较时使用的是全等===操作符,因此不会发生类型转换。