MDN小笔记

MDN堪称web开发的百宝箱,最好看英文,中文可能翻译有误且有些难点没有翻译(太不负责任。。。)

1, 命名规范

1
_ / $ / 字母开头,包含_ / $ / 字母/数字,其他的均不可以。(不规范的属性名可以用object.[“propName”]获取,而不可以用object.propName来获取)

2, 声明

1
2
3
4
5
6
var — 无块级作用域
let(6) — 有块级作用域,同一个作用域重复定义变量报错,提前引用let声明会报错
const(6) —创建只读常量,块级作用域,不能在同一作用域内与函数名和变量名一样,const变量引用的对象值可以变,但只能引用这个对象,不可以给该变量赋其他值
undefined 数值环境下转换为NaN,而null为0。
声明提升:
引用之后var定义的函数不会引发异常,而是得到undefined值,即赋值是无法提升的,只提升声明。

3, 数据结构与类型

1
2
3
六个基本类型 — String /Number/Null/Undefined/Boolean/Symbol(6 实例是唯一不变的)
Object / Function
Undefined在私有作用域内可以赋值,全局作用域是无法赋值的

4, 数据类型转换

1
2
3
4
5
6
7
8
parseInt(String,radix)— IE8及以下020按八进制转换,IE9以上及其他浏览器按十进制转换
Number() — 严格转换,只要有一个无法转换字符,即返回NaN,忽略八进制的前导0,Number(“”)转换成0
String() — 将任意类型的值转换为Sirng类型,原始类型直接加””,对象返回”function...”
Boolean() —将任意类型值转换为布尔值,(Null/Undefined/NaN/+_0/””转换为false),其他全部转换为true
If 调用的是Boolean()判断
一个值为字符串,另一个值为非字符串,则后者转为字符串
对象转换时先调用valueOf(),然后调用toString(),[]结果为””,对象为”[object Object]”
对象在+前面时看做代码块,忽略值

5,转义: 字符串末尾加\可以实现换行,替换\n;

6,标签语句跳出循环:

1
循环声明出使用lable:来定义跳出位置,continue:继续执行lable

7,*异常处理:

1
2
3
4
5
6
7
8
9
10
可以throw出任何含有值得表达式
UserException(message){
this.message = message;
this.name = “UserException”
};
UserException.prototype.toString = function(){
return this.name+”:”+this.message
}
Catch到异常后可以访问异常对象
Finally{}中的返回值会屏蔽try catch中的返回值,作为整个捕获过程的返回值

8,函数:

1
2
3
4
5
6
7
8
9
10
值传递:参数为原始类型参数时,为值传递,改变参数值不会影响外部定义的值
引用传递:参数为引用类型时,改变引用对象的属性会影响外部定义的该对象
函数声明会提升:(只有function(){}的形式)
函数内部调用arguments.callee指向函数本身,即在递归中用arguments.callee()取代functionName();
函数内部全局的this值(如serTimeout内调用this),可以通过赋值给另一个变量的方式来解决(var that = this,全局的this用that替代)
闭包:http://jibbering.com/faq/notes/closures/

9,函数参数:

1
es6中新增了默认参数(function(a,b=1){})和剩余参数(function(first,...theArgs){})

10,URL编码解码:

1
2
3
4
5
6
7
8
9
10
11
12
13
编码原因:
服务的解析参数时,是按&,=,符号进行解析key、value值得,为了避免在value值中也出现这些用来区分键值的特殊符号,就需要对键值进行编码。
encodeURI,encodeURIComponent:前者将整个url转码,后者用来转value值,eq:
var parseUrlSearch = function() {
var query= window.location.search.slice(1);
var result = {};
query.split("&").forEach(function(part) {
var item = part.split("=");
result[item[0]] = decodeURIComponent(item[1]);
});
return result;
}

11,操作符:

1
2
/ : JavaScript中1/2===0.5
&, !,^,~ :JavaScript中的二进制操作符将操作数转换为二进制位,对应位取与或非等,奖结果的二进制数在转换为10进制作为结果

11.1,逻辑操作符:

1
2
3
&&:如果expr1能转换为false,返回expr1;否则返回expr2;
||:如果expr1能转换为true,返回expr1;否则返回expr2;
!:如果expr可以转换为true,则返回false,否则返回true;

11.2一元操作符:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
delete :
不能删除var 声明的变量(没用var声明的可以删除)以及内置函数的属性(内置函数是可以删除的)对变量和方法名没有影响,可以删除全局未用var声明的对象,删除Array的元素不影响长度
typeof:
Typeof null—>Object, typeof (predefind object)—>function,typeof Math—>object
void:
return undefined. 立即执行的function 声明前加void强制使函数声明变为表达式,并可以执行;JavaScript:function():将返回值的内容覆盖当前的页面,用void(0)返回
in:
指对象属性或者数值下标,delete属性或者array[n]时,prop in Object/index in Array返回false
instanceof:
object instanceof constructor ,判断依据是该构造函数的prototype是否在该对象的原型链中,即调用Object.getPrototypeOf(onject)=== constructor.prototype. (字面量的string instanceof Sting/Object都是false)iframe框架中不用的环境导致instanceof 会出现问题,比如Array.prototype !== window.frames[0].Array,此时最好用Array.isArray();

9,操作符优先级:

1
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Operator_Precedence#Table

9,数字和日期:

1
2
3
数字分为二进制(binary),八进制(Octal),十进制(decimal),十六进制(hexadecimal)
0开头且下一位大于7解析为十进制数字,小于8解析为八进制数
0b/B开头且后面数字为0或者1为二进制数,否则报语法错误