Js基本要点

第一章
1.全局变量就是在任何函数外面声明的或是未声明直接简单使用的,全局对象有个附加属性叫做window,指向该全局对象本身
myglobal = "hello"; // 不推荐写法
console.log(myglobal); // "hello"
console.log(window.myglobal); // "hello"
console.log(window["myglobal"]); // "hello"
console.log(this.myglobal); // "hello"
2.全局变量的问题
两个不同部分定义同名但不同作用的全局变量,会命名冲突
不声明的任何变量都会成为一个全局对象属性
function sum(x, y) {
// 不推荐写法: 隐式全局变量
result = x + y;
return result;
}
使用var声明变量成为本地变量
function sum(x, y) {
var result = x + y;
return result;
}
任务链进行部分var声明,会生成全局对象
// 反例,勿使用
function foo() {
var a = b = 0;
// ...
}
链分配较好的做法
function foo() {
var a, b;
// ... a = b = 0; // 两个均局部变量
}
3.var的副作用
隐式全局变量和明确定义的全局变量的差异
・通过var创建的全局变量(任何函数之外的程序中创建),是不能被删除的
・无var创建的隐式全局变量(无视是否在函数中创建)是能被删除的
在技术上,隐式全局变量是全局对象(window)的属性,属性是可以通过delete操作符删除的
// 定义三个全局变量
var global_var = 1;
global_novar = 2; // 反面教材
(function () {
global_fromfunc = 3; // 反面教材
}());

// 试图删除
delete global_var; // false
delete global_novar; // true
delete global_fromfunc; // true

// 测试该删除
console.log(typeof global_var); // "number"
console.log(typeof global_novar); // "undefined"
console.log(typeof global_fromfunc); // "undefined"

4.访问全局对象
var global = (function () {
return this;
}());
console.log(global);

5.单var形式(Single var Pattern)
函数顶部使用单var语句
・一览函数功能所需要的所有局部变量
・防止变量在定义之前使用
・少代码(类型啊传值啊单线完成)
单var形式例子,(推荐)使用一个var语句声明多个变量,并以逗号分隔
function func() {
var a = 1,
b = 2,
sum = a + b,
myobject = {},
i,
j;
// function body...
}
6.预解析:var散布的问题(Hoisting: A Problem with Scattered vars)
变量在同一函数中,它都被当做是声明的,即使是它在var声明前使用
// 反例
myname = "global"; // 全局变量
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
代码处理分两个阶段,第一阶段是变量,函数声明,以及正常格式的参数创建;
第二个阶段是代码执行,函数表达式和不合格的标识符(为声明的变量)被创建。
7.for循环(for Loops)
缓存数组(或集合)的长度是比较好的形式
for (var i = 0, max = myarray.length; i < max; i++) {
// 使用myarray[i]做点什么
}
把变量从循环中提出来
function looper() {
var i = 0,
max,
myarray = [];
// ...
for (i = 0, max = myarray.length; i < max; i++) {
// 使用myarray[i]做点什么
}
}
形式改进,只体现在性能上
・少一个变量(无max)
・向下数到0,通常更快
//第一种变化的形式:
var i, myarray = [];
for (i = myarray.length; i–-;) {
// 使用myarray[i]做点什么
}
//第二种使用while循环:
var myarray = [],
i = myarray.length;
while (i–-) {
// 使用myarray[i]做点什么
}

8.for-in循环(for-in Loops)
遍历对象属性,hasOwnProperty()方法过滤掉从原型链上下来的属性
// 对象
var man = {
hands: 2,
legs: 2,
heads: 1
};

// 在代码的某个地方
// 一个方法添加给了所有对象
if (typeof Object.prototype.clone === "undefined") {
Object.prototype.clone = function () {};
}

// for-in 循环,过滤
for (var i in man) {
if (man.hasOwnProperty(i)) { // 过滤
console.log(i, ":", man[i]);
}
}

/* 控制台显示结果
hands : 2
legs : 2
heads : 1*/

9.(不)扩展内置原型
不扩增构造函数的prototype属性原因
・降低可维护性,代码变得难以预测
・属性添加到原型中,可能会导致不使用hasOwnProperty属性时在循环中显示出来
10.switch模式(switch Pattern)
switch语句增强可读性和健壮性
var inspect_me = 0,
result = '';
switch (inspect_me) {
case 0:
result = "zero";
break;//避免贯穿
case 1:
result = "one";
break;
default:
result = "unknown";
}

11.避免隐式类型转换
JavaScript的变量在比较的时候会隐式类型转换
var zero = 0;
if (zero === false) {
// 不执行,因为zero为0, 而不是false
}
// 反面示例
if (zero == false) {
// 执行了...
}
所以,比较值和表达式类型的时候始终使用===和!==操作符
12.避免(Avoiding)eval()

访问动态属性
// 反面示例
var property = "name";
alert(eval("obj." + property));

// 更好的
var property = "name";
alert(obj[property]);

setInterval(), setTimeout()和Function()构造函数传递字符串
/ 反面示例
setTimeout("myFunc()", 1000);
setTimeout("myFunc(1, 2, 3)", 1000);

// 更好的
setTimeout(myFunc, 1000);
setTimeout(function () {
myFunc(1, 2, 3);
}, 1000);

防止全局变量污染命名空间
・使用新的Function()构造就类似于eval()
・封装eval()调用到一个即时函数中
console.log(typeof un); // "undefined"
console.log(typeof deux); // "undefined"
console.log(typeof trois); // "undefined"

var jsstring = "var un = 1; console.log(un);";
eval(jsstring); // logs "1"

jsstring = "var deux = 2; console.log(deux);";
new Function(jsstring)(); // logs "2"

jsstring = "var trois = 3; console.log(trois);";
(function () {
eval(jsstring);
}()); // logs "3"

console.log(typeof un); // number
console.log(typeof deux); // "undefined"
console.log(typeof trois); // "undefined"

eval()可以访问和修改它外部作用域中的变量,function不能
(function () {
var local = 1;
eval("local = 3; console.log(local)"); // logs "3"
console.log(local); // logs "3"
}());

(function () {
var local = 1;
Function("console.log(typeof local);")(); // logs undefined
}());

13.parseInt()下的数值转换
避免矛盾和意外的结果,总是指定基数参数
var month = "06",
year = "09";
month = parseInt(month, 10);//10进制
year = parseInt(year, 10);//10进制
替换方法是将字符串转换成数字
Number("08") // 8

14.编码规范
缩进
花括号{}
左花括号的位置
空格
15.命名规范
以大写字母写构造函数:
var adam = new Person();
分隔单词:
构造函数时,驼峰:大驼峰MyConstructor(),小驼峰myFunction()
变量时,小驼峰,单词小写以下划线连接(first_name)
其它命名形式:
var person = {
getName: function () {
return this._getFirst() + ' ' + this._getLast();
},

_getFirst: function () {
    // ...
},
_getLast: function () {
    // ...
}

};
getName()就表示公共方法,部分稳定的API,
_getFirst()和_getLast()则表明了私有,下一个版本中时不能保证工作的

注释:
注释你的代码,清楚的知道这个代码是干嘛用

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容